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 Up

    Soweit 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 ^^)


Anmelden zum Antworten