将HBITMAP保存为Bmp文件,发现Bmp文件颜色不正确,哪位老大帮俺看看
将HBITMAP保存为Bmp文件,发现Bmp文件颜色不正确,哪位老大帮俺看看
BOOL Save(LPCTSTR lpszFileName,HBITMAP hBmp,BITMAPINFO* pBi)
{
BITMAPINFOHEADER* pBh=(BITMAPINFOHEADER*)pBi;
LPBYTE lpBits = new BYTE[pBh->biSizeImage];
if (!lpBits) return FALSE;
HDC hdc=GetDC(NULL);
if (!hdc ||
!GetDIBits(hdc,hBmp, 0, (WORD)(pBh->biHeight),lpBits,pBi,DIB_RGB_COLORS))
{
if(hdc) ReleaseDC(NULL,hdc);
delete lpBits;
return FALSE;
}
ReleaseDC(NULL,hdc);
FILE* pFile=NULL;
pFile = fopen(lpszFileName, "w+b");
if(!pFile)
{
delete lpBits;
return FALSE;
}
BITMAPFILEHEADER hdr;
hdr.bfType = (WORD)('M'<<8)|'B';
hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + pBh->biSize + pBh->biClrUsed* sizeof(RGBQUAD) + pBh->biSizeImage);
hdr.bfReserved1 = 0;
hdr.bfReserved2 = 0;
hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) + pBh->biSize + pBh->biClrUsed * sizeof(RGBQUAD);
fseek(pFile,0,SEEK_SET);
fwrite(&hdr,sizeof(BYTE),sizeof(BITMAPFILEHEADER),pFile);
fwrite(pBh,sizeof(BYTE), sizeof(BITMAPINFOHEADER)+pBh->biClrUsed * sizeof(RGBQUAD),pFile);
fwrite(lpBits,sizeof(BYTE),pBh->biSizeImage,pFile);
fclose(pFile);
delete lpBits;
return TRUE;
}