Bitmap in DirectDraw
-
Die 3 Funktionen die Speziel für das Bitmap sind, hab ich komplett kopiert.
den rest hab ich selbst geschrieben. Wobei mir aber kein unterschied zum Beispiel auffällt. und wenn ich das komplette Beispiel kopiere, hängt sich das Programm auf.Was könnte den beim Schreib in den Speicher falsch laufen?
-
Hi...
ich hab das ganze jetzt nicht komplett durchgesehen. Was mir aber so spontan einfällt weil ich es auch oft falsch gemacht hab ist dass irgendwo in deinem Code ein Fehler steckt wegen den verschiedenen Farbtiefen.
Du gehst ja davon aus, dass das Bitmap 16 Bit hat (was es hoffentlich als Datei dann auch hat). Dann frage ich mich warum du bei deiner Bitmap_File Struktur den Buffer nur als Array von UCHAR Variablem deklarierst. Außerdem gibt es bei 16-Bit Bitmaps keine Palette...typedef struct BITMAP_FILE_TAG { BITMAPFILEHEADER bitmapfileheader; BITMAPINFOHEADER bitmapinfoheader; PALETTEENTRY palette[256]; //<--- UCHAR *buffer; //<-- } BITMAP_FILE, *BITMAP_FILE_PTR;Das sind so die Sachen die mir beim drübergucken aufgefallen sind. Falls ich mich irre, korrigiert mich bitte. Ob es noch andere Ecken gibt, an denen etwas falsch läuft weiß ich gerade nicht. Aber du kannst es ja erstmal damit probieren...
-
Ja, die datei ist schon ein 16 Bit Bild _
Das mit UCHAR verwirrt mich irgendwie. Im Buch stand erst, das UCHAR für 8 Bit verwendet wird und für alles darüber USHORT. und bei dem beispiel....hmm...
Und jetzt wo du das mit der Palette erwähnst...hmm...hab den Text noch mal durchgeguckt. könnte es sein, das die Funktion die 16 Bit Bilder in 8 Bit Bilder umwandelt? Irgendwie werde ich da gar nicht draus schlau.Wüsstest du vielleicht ein gutes Tutorial, das ich mir Parallel zum Buch angucken könnte? An dieser Stelle steht da nähmlich gar nichts hilfreiches.
mfg P
-
mhh hab jetzt nochmal in meinem Buch geguckt (ich frag mich immernoch warum die Quelltexte so gut wie identisch sind. Wer hat dein Buch geschrieben?). Die Bitmap_File Struktur wird hier genauso angegeben und auch die Funktionen scheinen im Großen und Ganzen die selben zu sein.
Dass UCHAR verwendet wird scheint nicht das Problem zu sein und auch die Palette wird nur bei 8 Bit Bildern geladen.
Von daher kann ich momentan leider auch nicht sagen, woran es liegt. Vielleicht kann dir noch jemand anders helfen...
Edit: Ok die Bücher haben den selben Autor (Andre LaMothe)...
-
Der Code sieht aus als könnte er 8Bit Bitmaps mit Palette und 16 Bit Bitmaps lesen.
Ist das was du lädst ne 16bit Bitmap? Standardformat der Grafikprogramme ist ja eigentlich eher 24Bit oder nich?
-
@geeky:
hab mich noch mal vergewissert, und es ist tatsächlich ein 24 Bit Bitmap...dabei ist es die Selbe datei, die der Autor in seinem Beispiel verwendet. Und ich konnte auch kein Prog finden, dases in 16 Bit Convertiert. Immer nur 24 Bit, 8 Bit oder noch tiefer. habs dann mal mit nem 8 Bit Bitmap versucht, bringt aber den selben effekt, wie zuvor.@Amateur:
Ist in deinem Buch der Quelltext denn beschrieben? Dann könnt ich ja mal sehen, ob mir das weiter hilft.
-
Ich glaub ich irre

16bit scheint der source in 16bit umzuwandeln, oder?
-
geeky schrieb:
Ich glaub ich irre

16bit scheint der source in 16bit umzuwandeln, oder?
hmm...ich weis jetzt nicht was du meinst.
Hast du dich vielleicht vertippt und meinst, das 24 Bit Bilder in 16 Bit umgewandelt werden?
-
jo, genau

Im Prinzip scheint der Source in Ordnung zu sein.
Prüf mal noch beim Aufruf den Rückgabewert von Load_Bitmap_File() und
macht aus dem "#if 0" mal nen "#if 1"Muss man bei der DDSURFACEDESC2-Struktur das Pixelformat gar nicht angeben?
-
Den Rückgabe Wert ausgeben? Ehrlich gesagt wüsste ich jetzt nicht wie ich daran gehen muss _'
Habs aber mal in "#if 1" geändert. War aber das selbe wie vorher.
Meinst du mit Pixelformat die Bittiefe?...Ich nehme an, das die Funktion diese Information aus den File Header der datei liest.
-
memset(&ddsd, 0, sizeof(ddsd)); // Hier wunderts mich das hier nirgends das Pixelformat angegeben // werden muss - Ich meine woher weiss DirectX dass das Surface mit // 16bit-Grafik gefüllt wird? - Aber ich bin kein DXler ;D ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; if(lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL) != DD_OK) { MessageBox(NULL, "Fehler Code 0004", "Fehler!", MB_OK); return 0; } // Quasi so zum Bleistift: if (Load_Bitmap_File(&bitmap16bit, "ANDRE16.BMP")==0) { MessageBox(NULL,"Load_Bitmap_File() ist fehlgeschlagen!","Fehler!",0); }
-
Ach mehr is das gar nich mit dem Rückgabe wert XD...
okay, hab ich gemacht und daran scheint es nicht zu liegen.
Hab jetzt auch einwenig weiter mit dem Quelltext rumgespielt.
mal das aus kommentiert und mal das...Und ich schätze, das der Fehler hierfor(int y=0; y < SCREEN_HEIGHT; y++) { memcpy(&primary_buffer[y*ddsd.lPitch], &bitmap16bit.buffer[y*SCREEN_WIDTH*2], SCREEN_WIDTH*2); }liegen muss, denn wenn ich einfach nur diese Zeilen auskommentiere, funktioniert alles...naja...jedenfalls vom eindruck her...das Bitmap wird natürlich nicht angezeigt...