Bitmaps

Moin,
Ich würde gerne ein von mir in einen (memory) gezeichnetes Diagram als Bitmap abspeichern:

long MainDialog::SaveDiagram()
{ 
 // TEMPORALY -\> PARAMETER
 long picX = 500;
 long picY = 500;
 long bpp = 24;

 // Fill in the bitmap structures
 BITMAPFILEHEADER fileheader;
 fileheader.bfType = 19778;
 fileheader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + picX\*picY\*bpp/8;
 fileheader.bfReserved1 = fileheader.bfReserved2 = 0;
 fileheader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

 BITMAPINFOHEADER infoheader;
 ZeroMemory(&infoheader, sizeof(BITMAPINFOHEADER));
 infoheader.biSize = sizeof(BITMAPINFOHEADER);
 infoheader.biWidth = picX;
 infoheader.biHeight = picY;
 infoheader.biPlanes = 1;
 infoheader.biBitCount = bpp;

 // Create a memory DC to draw in
 HDC dc = GetDC(m\_hwnd); 
 HDC mem = CreateCompatibleDC(dc);

 // Create a bitmap and link it to the memory dc
 HBITMAP hbitmap = CreateCompatibleBitmap(mem, picX, picY);

 // Draw the diagram 
 HBRUSH brush = CreateSolidBrush(RGB(0xff, 0x0, 0x0));
 RECT screen;
 screen.left = screen.top = 10;
 screen.right = 490;
 screen.bottom = 490;
 FillRect(mem, &screen, brush);
 DeleteObject(brush);

 // Get the pixeldata
 char\* bitmap = new char[picX\*picY\*bpp/8];
 GetDIBits(mem, hbitmap, 0, 500, bitmap, (BITMAPINFO\*) &infoheader, DIB\_RGB\_COLORS);

 // Do some cleanup
 DeleteObject(hbitmap);
 DeleteObject(mem);
 ReleaseDC(m\_hwnd, dc);

 // Create a file and write to it
 HANDLE hfile = CreateFile("C:\\test.bmp", GENERIC\_WRITE, 0, NULL, OPEN\_ALWAYS, 0, 0);

 DWORD written;
 WriteFile(hfile, &fileheader, sizeof(BITMAPFILEHEADER), &written, NULL);
 WriteFile(hfile, &infoheader, sizeof(BITMAPINFOHEADER), &written, NULL);
 WriteFile(hfile, bitmap, picX\*picY\*bpp/8, &written, NULL);

 // Free bitmap memory and release the file
 delete[] bitmap;
 CloseHandle(hfile);
 return 0;
}

Die abgespeicherte Bitmap lässt sich zwar öffnen, einhält aber nur ein geometrisches Muster aus schwarzen und weissen Pixeln. Weiss jemand wo der Fehler liegt?

Danke im Vorraus,
Daniel Raffler

Moin,
Ich würde gerne ein von mir in einen (memory) gezeichnetes
Diagram als Bitmap abspeichern:

// Fill in the bitmap structures
BITMAPFILEHEADER fileheader;
fileheader.bfType = 19778;
fileheader.bfSize = sizeof(BITMAPFILEHEADER) +
sizeof(BITMAPINFOHEADER) + picX*picY*bpp/8;
fileheader.bfReserved1 = fileheader.bfReserved2 = 0;
fileheader.bfOffBits = sizeof(BITMAPFILEHEADER) +
sizeof(BITMAPINFOHEADER);

Die abgespeicherte Bitmap lässt sich zwar öffnen, einhält aber
nur ein geometrisches Muster aus schwarzen und weissen Pixeln.
Weiss jemand wo der Fehler liegt?

Danke im Vorraus,
Daniel Raffler

Auch Moin
Ich denke mal, das liegt am fileheader.bfType.
Der sollte eigentlich „BM“ sein, und das gibt bei mir umgerechnet 23944!
am einfachsten geht das mit fileheader.bfType= (WORD) „BM“;
Ich hoffe, das war’s.
Ciao, Norbert

Auch Moin
Ich denke mal, das liegt am fileheader.bfType.
Der sollte eigentlich „BM“ sein, und das gibt bei mir
umgerechnet 23944!
am einfachsten geht das mit fileheader.bfType= (WORD) „BM“;
Ich hoffe, das war’s.
Ciao, Norbert

Hi Norbert,
die 19778 stimmen schon und setzen sich wie folgt zusammen:

‚MB‘ = 77*2^8 + 66 (‚MB‘ und nicht ‚BM‘ weil little-endian)

Der Grund warum ich den Wert ausgerechnet habe ist dass mein Compiler sonst ständig eine ziemlich lästige Warnung ausgibt.

Ich habe den Fehler übrigens mitlerweile gefunden:
HBITMAP hbitmap = CreateCompatibleBitmap(dc, picX, picY);
statt
HBITMAP hbitmap = CreateCompatibleBitmap(mem, picX, picY);

Ich verstehe allerdings nicht ganz warum ich die Bitmap nicht auch kompatibel zu mem erstellen kann da dieser DC ja wieder kompatibel zu dc ist. Eigentlich sollte es also keinen Unterschied machen…

Grüße,
Daniel Raffler