Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Grey Fox
Anmeldungsdatum: 16.02.2005 Beiträge: 13
|
Verfasst am: 24.03.2005, 16:11 Titel: Angeblich EOF erreicht! |
|
|
So ich wollte mal meinen eigenen BMP-Loader Basteln!
Gut Palette und Header ist ja alles klar!
Aber wenn ich die Bitmap in Variablen Packen will, dann meint er bei genau Teil4.Pixel.Speicher(6440) an
das er das Ende der Datei erreicht habe, aber es fehlen noch ca. 80% der Datei.
Beim Programmstop befindet sich der Dateizeiger auf 6558 Byte aber dann macht er ebend leider nix mehr!
Hab mal den Quellcode Gepostet
Ich versuche erstmal die Grundstruktur reinzubringen also nicht wegen der Form oder diverse GOTO's etc. irgendetwas sagen
Code: |
DECLARE SUB Built.BMP ()
DECLARE SUB Scan.Palette ()
DECLARE SUB Scan.Header ()
SCREEN 13
OPEN "C:\QBasic\Qb_4_5_D\Test.bmp" FOR INPUT AS #1
CALL Scan.Header
CALL Scan.Palette
CALL Built.BMP
SUB Built.BMP
DIM Teil4.Pixel.Speicher(1 TO 8806) AS INTEGER
DIM Teil3.Pixel.Speicher(1 TO 8806) AS INTEGER
DIM Teil2.Pixel.Speicher(1 TO 8806) AS INTEGER
DIM Teil1.Pixel.Speicher(1 TO 8806) AS INTEGER
FOR i% = 1 TO 8806
IF EOF(1) THEN GOTO Fehler ----> Hier kommt der
Teil4.Pixel.Speicher(i%) = ASC(INPUT$(1, #1)) ----> Fehler
NEXT i%
FOR i% = 1 TO 8806
Teil3.Pixel.Speicher(i%) = ASC(INPUT$(1, #1))
NEXT i%
FOR i% = 1 TO 8806
Teil2.Pixel.Speicher(i%) = ASC(INPUT$(1, #1))
NEXT i%
FOR i% = 1 TO 8806
Teil1.Pixel.Speicher(i%) = ASC(INPUT$(1, #1))
NEXT i%
Fehler:
COLOR 10
PRINT "Fehler!!!"
END SUB
SUB Scan.Header
DIM Scaned.Header(1 TO 54) AS STRING * 1
CLS
FOR i% = 1 TO 54
Scaned.Header(i%) = INPUT$(1, #1)
NEXT i%
IF Scaned.Header(1) + Scaned.Header(2) <> "BM" THEN
CLS
PRINT ""
PRINT "Die Datei ist entweder keine Gueltige Bitmap"
PRINT "oder sie ist Beschaedigt!"
SLEEP
END
ELSE PRINT "Datei ist eine gueltige Bitmap"
END IF
ERASE Scaned.Header
END SUB
SUB Scan.Palette
DIM Scaned.Palette(0 TO 15) AS STRING * 4
DIM Fertig.Palette(0 TO 15) AS LONG
FOR i% = 0 TO 15
Scaned.Palette(i%) = INPUT$(4, #1)
Ergebnis1& = INT(ASC(MID$(Scaned.Palette(i%), 3, 1)) / 4)
Ergebnis2& = 256 * (INT(ASC(MID$(Scaned.Palette(i%), 2, 1)) / 4))
Ergebnis3& = 65536 * (INT(ASC(MID$(Scaned.Palette(i%), 1, 1)) / 4))
Fertig.Palette(i%) = Ergebnis1& + Ergebnis2& + Ergebnis3& - 65793
IF Fertig.Palette(i%) >= Hintergrund.Farbe& THEN
Hintergrund.Farbe& = Fertig.Palette(i%)
Schalter% = 1
PALETTE 0, Hintergrund.Farbe&
ELSE
END IF
PRINT Fertig.Palette(i%)
COLOR i%
PRINT "Test"
PALETTE i% + 1 - Schalter%, Fertig.Palette(i%)
IF Schalter% = 1 THEN Schalter% = 0
NEXT i%
SLEEP
END SUB
|
|
|
Nach oben |
|
 |
Quark48

Anmeldungsdatum: 16.10.2004 Beiträge: 559 Wohnort: Saltendorf a.d. Naab bzw. Teublitz i.d. Oberpfalz / Bayern
|
Verfasst am: 24.03.2005, 16:17 Titel: |
|
|
Hallo!
Wie groß ist deine Bitmap-Datei?
6558 Bytes im Nirgendwo  _________________ Grüßle, Stefan
***
Wenn ein Programm auf nem alten Rechner gut läuft, dann läuft´s auf nem neuen erst recht!
Ich habe/hatte keine feste Spange und auch keine Schwester. Der Rest stimmt. Es tut mir leid... :-/ |
|
Nach oben |
|
 |
Grey Fox
Anmeldungsdatum: 16.02.2005 Beiträge: 13
|
Verfasst am: 24.03.2005, 16:25 Titel: |
|
|
Ca. 34 KByte  |
|
Nach oben |
|
 |
Stephan

Anmeldungsdatum: 05.10.2004 Beiträge: 358 Wohnort: Hessen - 20km Nördlich von Frankfurt am Main
|
Verfasst am: 24.03.2005, 20:28 Titel: |
|
|
Du solltest das File wohl eher im Binary Modus öffnen,
und mit GET Arbeiten.
Da der INPUT befehl an einem EOF Stoppt. _________________ 'Wir schätzen die Zeit erst, wenn uns nicht mehr viel davon geblieben ist.'
Leo Tolstoi |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
|
Nach oben |
|
 |
code
Anmeldungsdatum: 19.01.2005 Beiträge: 154
|
Verfasst am: 25.03.2005, 19:03 Titel: |
|
|
das Problem hatte ich auch schon.
Code: | Do
a=input$(#1,1)
loop until eof |
EOF prüft einfach nur ob in der datei das ASCI Zeichen 26
steht, dieses steht nämlich für END OF FILE.
Um dieses Problem zu beheben die Datei einfach im binärmodus aufmachen, und anstatt
zunehmen, einfach
Code: | loop until i=lof(nummer) |
wobei nummer die nummer der geöffneten datei ist, und i eine zählervariable.
(Das ist übrigens auch ein netter Trick um Daten über das Dateiende hinauszuschreiben. Einfach Print chr$(26) benutzen und danach die daten die du in die Datei versteckt schreiben möchtest. (geht natürlich nicht wenn du denn code von oben nimmst, sondern nur wenn du mit eof auf das dateiende prüfst.)) |
|
Nach oben |
|
 |
Grey Fox
Anmeldungsdatum: 16.02.2005 Beiträge: 13
|
Verfasst am: 30.03.2005, 13:43 Titel: |
|
|
OK!
Mit BINARY Geht es
So noch eine Frage:
Ist es Effektiver die Ganze Datei einmal Komplett in mehrere Variablen zu Packen, oder Byte für Byte (Also Praktisch Information einlesen, darstellen, und Repeat) auszulesen und darzustellen???
THX an euch  |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
DarkLord
Anmeldungsdatum: 26.03.2005 Beiträge: 70 Wohnort: Rhade^^ oben bei muddi
|
Verfasst am: 30.03.2005, 14:57 Titel: |
|
|
Falls es leute gibt die ein prob mit dem angeblichen EOF ende habe (wenn z.B. die Datei ausgelesen wird), obwohl die datei 4 beschriebene Zeilen hat... fügt einfach am Ende eine weitere leere Zeile hinzu, bei mir klappt das immer
Habe am ende jetzt immer 2 leere zeilen und gott-sei-dank keine eof fehler mehr^^ |
|
Nach oben |
|
 |
|