Hi C++ Experten
Ich habe eine Funktion geschrieben, die den Gerätekontext des Fenster als Bitmap abspeichern soll. Leider funktioniert das ganze noch nicht so richtig, da die Datei:
7 statt ~1 MB (x*3*y (24Bit) -> 600*3*600) groß ist
Die ganze Bitmap stark verzerrt und schwarz-weiss ist
(statt 24Bit-Farben)
Meiner Meinung nach müsste der Fehler irgendwo bei den beiden Bitap-Headern liegen (BITMAPFILEHEADER + BITMAPINFOHEADER).
Kennt sich jemand damit aus ?
Danke im voraus,
Daniel R.
Der Quellcode meiner Funktion:
(Die Funktion ExtractColour() extrahiert ,wie der Name schon sagt, den Rot- Grün- oder Blauwert aus einer COLORREF-Variable)
Dein Problem liegt daran, dass DIBs und das BMP-Format nicht einfach die Pixel sequenziell im Speicher oder ober in der Datei liegen haben, sondern zeilenweise gespeichert und DWORD-aligned sind (siehe auch in der Online-Hilfe zu DIBs). Damit dürften dir ein paar Bytes fehlen und die Verzerrung/Farbverschiebung verursachen.
Ich würde das Schreiben der Bilddaten folgendermaßen durchführen:
// Fileheader + Infoheader
file.Write(&fileheader,sizeof(fileheader));
file.Write(&infoheader,sizeof(infoheader));
// (hier: Palette für 16-256 Farben)
// Zeilenlänge in Bytes mit DWORD-Alignment
int nFullLength=4\*(( x/8+31 )/32 );
// Alle Zeilen druchlaufen
for( int nLine=0; nLine
Es wäre insgesamt aber performanter, nur eine Zeile DWORD-aligned anzulegen und in einer Zeilenschleife mit den Zeilendaten zu füllen sowie direkt in einem Durchgang zu schreiben. Du schreibst die Daten BYTE für BYTE, was deutlich länger dauert.
Grüße Safog
> <small>[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]</small>
Hallo Safog
Vielen Dank für deine schnelle Antwort. In deinen Code war leider ein kleiner Fehler. Du hast mir aber trotzdem sehr weitergeholfen, da ich wahrscheinlich nie draufgekommen währe, dass die Anzahl der Bytes in einer Scanline ein Vielfaches von 4 sein muss.
// Zeilenlänge in Bytes mit DWORD-Alignment
int nFullLength=4\*(( x/8+31 )/32 );
// mein Code
int nFullLength = x; // z.B 13
nFullLength += 4-x%4; // 13%4=1 4-1=3 -\> noch 3 Byte schreiben