Bitmaps laden von / |
Ich weiss, es gibt komfortablere Wege in BlitzBasic ein Bitmap zu laden, aber ich habe mich mal rangewagt, eine Bitmap Datei Byte für Byte auszulesen und dann wiederzugeben. Es ist zwar nicht sehr nützlich, aber interessant. [code:1:84f1048dbc] ;; BMP - Viewer ; Läd Bitmapdateien Byteweise ein ; Copyright (C) Nov 2003, Daniel Nobis AppTitle "24-Bit-Bitmap Viewer v1.0" InputFile$ = ("Test.bmp") ; --- Bilddatei laden Datei = ReadFile(InputFile$) SeekFile Datei, 18 ; Pos für Breite in Pixeln ResX = ReadShort(Datei) SeekFile Datei, 22 ; Pos für Höhe in Pixeln ResY = ReadShort(Datei) Dim Red(ResY,ResX) Dim Green(ResY,ResX) Dim Blue(ResY,ResX) SeekFile Datei, 54 ; Leseposition auf Anfang der Bildinfos setzen For x = ResY To 1 Step -1 For y = 1 To ResX Red(x,y) = ReadByte(Datei) Green(x,y) = ReadByte(Datei) Blue(x,y) = ReadByte(Datei) Next Next CloseFile Datei ; --- Bild anzeigen Graphics ResX, ResY, GraphicsDepth, 2 For y = 1 To ResY For x = 1 To ResX Color blue(y,x), green(y,x), red(y,x) Plot x,y ;- resy Next Next Color 255,255,255 Locate 10, ResY - 20: Print InputFile$ + " (" + ResX + "x" + ResY + ")" WaitKey [/code:1:84f1048dbc] |
von ??? |
Hi! Ping hat auch mal soetwas geschrieben: http://blitzbasic.ch/text.php?id=6&s=read das unterstützt mehrere Formate nicht nur 24Bit. Ist aber insofern auch nicht schlecht. mfg olli |
von ??? |
Ich habe es noch nicht getestet - aber hast du damit schon mal Bitmaps in Größe wie z.B. 111x111 bei 24Bit geladen? Normalerweise dürfte das so nicht funktionieren... |
von ??? |
Interessant, wenn ich Bitmaps lade, bei denen Breite und Höhe gleich sind, wird das Bild verzerrt angezeigt. Es wird um 45 Grad Gedreht und Diagonal geteilt (linke Seite rechts, rechte Seite links). Es funktioniert also nur, wenn Breite und Höhe mindestens 50 Pixel auseinander liegen. Ich habe jetzt mal versucht, ein 3D-Bild wiederzugeben. Ich habe einfach die X und die Y Position des Grün- und Blauanteils der Farbe um 5 Pixel verschoben. Leider habe ich keine 3D-Brille zum Testen. :roll: Sieht aber schon mal cool aus. [code:1:7f67db211b] For y = 1 To ResY For x = 1 To ResX Color Red(y,x), Red(y+5,x+5), Red(y+5,x+5) Plot x,y Next Next [/code:1:7f67db211b] Natürlich müssen auch die Größen der Datenfelder jeweils um 5 erhöht werden. |
von ??? |
Für ein 3D Bild brauchst du 2 Bilder die mit leicht versetzten Kameras aufgenommen wurden. |
von ??? |
[quote:81852a7cf2]Interessant, wenn ich Bitmaps lade, bei denen Breite und Höhe gleich sind, wird das Bild verzerrt angezeigt. Es wird um 45 Grad Gedreht und Diagonal geteilt [/quote:81852a7cf2] nein wenn du z.B. ein Bild mit 3 Pixel breite hast: RGB RGB RGB du hast 9 byte - das muss aber durch 4 teilbar sein! - darum müssen dummybytes eingefügt werden: RGB RGB RGB DDD zum ausesen musst du umgekehrt verfahren - hat sich MS ausgedacht um uns zu ärgern |
von ??? |
Ahh, stimmt. Habe ich mal was drüber gelesen. Heisst das ich müsste dann in jeder Bildzeile Bytes einfügen, deren Bytezahl nicht durch 4 teilbar ist? Dann müsste ich ja einiges umschreiben. Ich habe das mal nachgeprüft. Dieser Anzeigefehler tritt wirklich nur auf, wenn X-Auflösung nicht durch 4 Teilbar ist. [code:1:2b0a9a9bbf] Rest = (ResX * 3) MOD 4 IF Rest > 0 then Fehler = 1 [/code:1:2b0a9a9bbf] Wenn also die Breite in Pixeln mal Drei (Anzahl der Bytes) geteilt durch Vier einen Rest größer als Null ergibt, würde der Fehler auftreten. Und wenn ich jetzt Dummybytes einfügen würde, würde das den Anzeigefehler beheben? |
von ??? |
Dann schau mal mein Beispiel an: http://blitzbasic.ch/text.php?id=6&s=read Ist relativ einfach... |
von ??? |
Das Programm teilt aber einige Bilder auch in der Mitte und verzerrt diese noch. Und viele Bilder werden überhaupt nicht angezeigt. Da baue ich doch besser auf mein Programm. Und die Fehler habe ich jetzt auch ausgebügelt. Es zeigt jetzt alle 24-Bit-Bitmaps korrekt an. Die Bytes pro Zeile müssen ja durch 4 teilbar sein. Ich habe den Rest ermittelt (wenn die Bytezahl nicht durch vier teilbar ist) und bin mit diesem Wert an den Anfang der neuen Zeile gesprungen. [code:1:fa9f8291b1] Rest = (ResX Mod 4): If Rest = 4 Then Rest = 0 ; Restbytes bis zur teilbarkeit durch 4 [/code:1:fa9f8291b1] [code:1:fa9f8291b1] For x = ResY To 1 Step -1 For y = 1 To ResX Blue(x,y) = ReadByte(Datei) Green(x,y) = ReadByte(Datei) Red(x,y) = ReadByte(Datei) Next SeekFile(Datei, FilePos(Datei) + Rest); Zeilenende suchen Next [/code:1:fa9f8291b1] |