Problem beim Bitmap speichern
-
Hallo,
ich hab folgendes Problem und zwar hab ich eine Funktion geschrieben die folgendes macht:
Sie läd ein Bitmap aus einer Datei, dann holt sie sich Textdaten aus einer Struktur und schreibt diese auf das Bitmap nun wird das Bitmap mit Text in einer Datei gespeichert und zeitgleich ausgedruckt.
Der genaue Ablauf sieht in etwa so aus:
PrinterDC holen
Bitmap in den Printer DC laden
MemoryDC erstellen und Bitmap aus dem PrinterDC hierherkopieren
Text mit DrawText reinschreiben
Bitmap zurück in den PrinterDC kopieren
Speicherfunktion mit CDC HDC Pointer auf den memDC aufrufen
Bitmap speichern
Clean UpSoweit so gut, doch nun kommt das Problem.
Zum speichern nehm ich die Funktion die hier unter http://www.c-plusplus.net/forum/viewtopic-var-t-is-39400.html von Geeky gepostet wurde.
Funktioniert soweit auch alles, nur ich lade nen monochromes Bitmap 600*600* 1BPP und beim speichern krieg ich eins mit 600*600*24BPP.
Das ist grössentechnisch schon nen Unterschied (40kb zu 1Mb)
Also hab ich versucht die Funktion so zu ändern das es monochrom gespeichert wird z.B. den BitCount auf 1 gesetzt usw.
Nur leider bekomme ich dann nur noch ein komplett schwarzes Bitmap gespeichert.
Entweder bin völlig vernagelt oder einfach zu dumm (hoffe nicht).
Auf alle fälle find ich die Lösung nicht, weiss einer von Euch was ich wie ändern muss damit es funktioniert.Schonmal Danke
P.S.: wollte euch nicht mit dem Quellcode nerven, falls ihn doch wer sehen will einfach sagen dann poste ich ihn.
-
Hmm...schau dir da mal folgende Tabelle an, bin zwar selber kein Experte im manuellen lesen/schreiben von Grafikdateien aber lies mal folgenden Link:
http://de.wikipedia.org/wiki/Windows_Bitmap
Für ein Bitmap mit 1 Bit Farbtiefe, also nur schwarz/Weiss (Keine Zwischenstufen)
sollten folgende Einträge wichtig sein.biBitCount -> 1
biCompression -> 0
biSizeImage -> 0 oder biWidth×biHeight/8 (Ausprobieren!)
biClrUsed -> 0
biClrImportant -> 0 oder 2 (Ausprobieren!)Hast du diese Einträge schon ausprobiert ? Wären 4 Kombinationen die du mal Testen könntest um das Prob einzukreisen ?!
Gruß
Final

-
Hi,
ja hab schon sämtliche einstellungen ausprobiert, mit grob gesagt folgendem Ergebniss:
Änderung an biBitCount auf irgendwas anders als 24 = schwarzes bmp Datei und Bildgrösse stimmen aber entsprechend der gemachten Einstellungen (40kb 600*600 eingelesen, 40kb 600*600 kommen raus).
biCompression von BI_RGB auf 0 keine Auswirkungen
biSizeImage von = ((((bmih.biWidth * bmih.biBitCount) + 31) & ~31) >> 3) * bmih.biHeight; auf 0 der biWight*biHeight >>3 (bzw /8
) Bild ist schwarz und bei 0 ist die datei nur 1kb gross sowie corrupt. Bei dem andern wird das Bild riesig und ebenfalls schwarz (Dateigrösse usw werden aber korrekt angezeigt)
biClrUsed auf 0 heisst ja das die max Bit Zahl pro Pixel genommen werden soll die durch biBitCount angegeben sind. Bei biBitCount 1 = 1 Bit pro Pixel
biClrimportant= egal ob 0,1,2 keine Änderung.
Hab alle möglichen Kombinationen ausprobiert.
Leider ist die MSDN dabei auch keine Hilfe.
Sonst noch (wer) ne Idee?
-
Hmm..sry..da bin ich überfragt. Aber hätte eventuell eine Idee, wie du an den Fehler rankommen könntest.
Save doch dein Bitmap mal in einem Grafikprogramm, wie Beispielsweise MS Paint.
Danach vergleichst du mit einem Hexeditor (Hexworkshop) diese File mit Deiner.
So solltest du schnell auf eventuelle Unterschiede im Header stoßen
Jedenfalls weisst du, wie ein korrekter Monochrom-Bitmap Header aussehen muss
(PS: Auch immer gut zum Savegame hacken ^^)