Bitmaps und Ihre Speicherung (VC60)
-
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; }