K
Hi,
folgender Code für das Speichern eines DC's in ein File nach dem er verändert wurde:
Das Problem bei dieser Funktion ist dass sich eine beliebige Bitmap zwar speichern lässt . Grösse wird gespeichert aber die Bitmap wird dann Schwarz.
Ich glaube daß bei der Farbzuordnung etwas schiefgeht aber bin mir nicht sicher .
Wäre dankbar wenn mir dazu jemand helfen könnte.
BOOL CPicture::DCtoBitmap(HDC hDC, CPoint position,int width,int height,CString filename)
{
HDC hdc2;
HBITMAP aBmp;
BITMAPINFO bi;
HGDIOBJ OldObj;
void *dibvalues;
HANDLE fileHandle;
BITMAPFILEHEADER bmfh;
BITMAPINFOHEADER bmih;
DWORD bytes_write;
DWORD bytes_written;
hdc2=CreateCompatibleDC(hDC);
ZeroMemory(&bmih,sizeof(BITMAPINFOHEADER));
bmih.biSize=sizeof(BITMAPINFOHEADER);
bmih.biHeight=height;
bmih.biWidth=width;
bmih.biPlanes=1;
bmih.biBitCount=24;
bmih.biCompression=BI_RGB;
bmih.biSizeImage = ((((bmih.biWidth * bmih.biBitCount) + 31) & ~31) >> 3) * bmih.biHeight;
bmih.biXPelsPerMeter = 0;
bmih.biYPelsPerMeter = 0;
bmih.biClrImportant = 0;
bi.bmiHeader=bmih;
aBmp=CreateDIBSection(hDC,&bi,DIB_RGB_COLORS,(void**)&dibvalues,NULL,0);
if (aBmp==NULL)
return 0;
OldObj=SelectObject(hdc2,aBmp);
//BitBlt(hdc2,0,0,width,height,hDC,0,0,SRCCOPY);
BitBlt(hdc2,position.x,position.y,width,height,hDC,0,0,SRCCOPY);//Nur zum Test
ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
bmfh.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
bmfh.bfSize=(3*bmih.biHeight*bmih.biWidth)+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
bmfh.bfType=0x4d42;
bmfh.bfReserved1 = 0;
bmfh.bfReserved2 = 0;
fileHandle=CreateFile(filename,GENERIC_READ | GENERIC_WRITE,(DWORD)0,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,(HANDLE) NULL);
if (fileHandle==INVALID_HANDLE_VALUE)
return 0;
// Write the BITMAPFILEHEADER
bytes_write=sizeof(BITMAPFILEHEADER);
if (!WriteFile(fileHandle,(void*)&bmfh,bytes_write,&bytes_written,NULL))
return 0;
//Write the BITMAPINFOHEADER
bytes_write=sizeof(BITMAPINFOHEADER);
if (!WriteFile(fileHandle,(void*)&bmih,bytes_write,&bytes_written,NULL))
return 0;
bytes_write=bmih.biSizeImage;
if (!WriteFile(fileHandle,(void*)dibvalues,bytes_write,&bytes_written,NULL))
return 0;
CloseHandle(fileHandle);
DeleteObject(SelectObject(hdc2,OldObj));
DeleteDC(hdc2);
return 1;
}