我想将一幅显示在客户区的位图另存为一幅位图,
但每次保存下来的文件都并不是bmp格式的文件,
这是我的源代码,各位高手能帮小弟看看么,小弟初学这玩意,谢谢了!!!
BOOL CDIBView::SaveBitmapFile(CString str_FileName)
{
BITMAPFILEHEADER bmfHdr;
LPBITMAPINFOHEADER lpBI = NULL;
DWORD dwDIBSize;
DWORD dwWritten;
HANDLE fh;
fh = CreateFile(str_FileName,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL |
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
if (fh == NULL)
{
return FALSE;
}
lpBI = (LPBITMAPINFOHEADER)m_lpbInfo;
if (lpBI == NULL)
{
CloseHandle(fh);
return FALSE;
}
if (lpBI->biSize != sizeof (BITMAPINFOHEADER))
{
CloseHandle(fh);
return FALSE;
}
bmfHdr.bfType = ((WORD) ('M' << 8) | 'B');
int iNumColor = 0;
if (lpBI->biClrUsed == 0)
{
if (lpBI->biBitCount <= 8)
{
iNumColor = 1 << lpBI->biBitCount;
}
}
else
{
iNumColor = lpBI->biClrUsed;
}
dwDIBSize = *(LPDWORD)lpBI + iNumColor * sizeof (RGBQUAD);
if ((lpBI->biCompression == BI_RLE8) ||
(lpBI->biCompression == BI_RLE4))
{
dwDIBSize += lpBI->biSizeImage;
}
else
{
DWORD dwBmBitsSize;
dwBmBitsSize = lpBI->biHeight *
((((lpBI->biWidth * lpBI->biBitCount) + 31) / 32) * 4);
dwDIBSize += dwBmBitsSize;
lpBI->biSizeImage = dwBmBitsSize;
}
bmfHdr.bfSize = dwDIBSize + sizeof (BITMAPFILEHEADER);
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) +
iNumColor * sizeof (RGBQUAD) +
lpBI->biSize;
WriteFile(fh, (LPBYTE)&bmfHdr, sizeof (BITMAPFILEHEADER),
&dwWritten, NULL);
WriteFile(fh, (LPBYTE)lpBI, dwDIBSize, &dwWritten, NULL);
return TRUE;
}