位图保存的问题
我在内存中画好了一张位图,要存到磁盘文件中去,在CSDN找到代码,修改后编译通过,但是运行出错。惭愧,忙乎好久了,没什么进展。请大侠指正:
void CpaintView::OnSavetest()
{
// TODO: 在此添加命令处理程序代码
BITMAP bm;
//m_pBitmap是一个CBitmap指针,指向画好的位图
GetDocument()-> m_pBitmap-> GetObject(sizeof(BITMAP),&bm);
int iPixel = 16;
LPBITMAPINFO lpbmih = new BITMAPINFO;
lpbmih-> bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbmih-> bmiHeader.biWidth = bm.bmWidth;
lpbmih-> bmiHeader.biHeight = bm.bmHeight;
lpbmih-> bmiHeader.biPlanes = 1;
lpbmih-> bmiHeader.biBitCount = iPixel;
lpbmih-> bmiHeader.biCompression = BI_RGB;
lpbmih-> bmiHeader.biSizeImage = 0;
lpbmih-> bmiHeader.biXPelsPerMeter = 0;
lpbmih-> bmiHeader.biYPelsPerMeter = 0;
lpbmih-> bmiHeader.biClrUsed = 0;
lpbmih-> bmiHeader.biClrImportant = 0;
BITMAPFILEHEADER bmfh;
ZeroMemory(&bmfh,sizeof(BITMAPFILEHEADER));
*((char *)&bmfh.bfType) = 'B ';
*(((char *)&bmfh.bfType) + 1) = 'M ';
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmfh.bfSize = bmfh.bfOffBits + (bm.bmWidth * bm.bmHeight) * iPixel / 8;
TCHAR szBMPFileName[128];
int iBMPBytes = bm.bmWidth * bm.bmHeight * iPixel / 8;
strcpy(szBMPFileName, "test.bmp ");
CFile file;
if(file.Open(szBMPFileName,CFile::modeWrite | CFile::modeCreate))
{
file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
file.Write(&(lpbmih-> bmiHeader),sizeof(BITMAPINFOHEADER));
file.Write(HBITMAP(GetDocument()-> m_pBitmap),iBMPBytes);
file.Close();
}
}
[解决办法]
file.Write(HBITMAP(GetDocument()-> m_pBitmap),iBMPBytes);这句有总是```这样强制转换没意义的``根本拿不到数据``
要先申请一个buf,通过GetDIBits拿到数据
LPSTR lpData=(LPSTR)GlobalAlloc(GPTR,iBMPBytes);
GetDIBits(hDC, (HBITMAP)(这里填你的bmp对象,要求是一个HBITMAP类型), 0, lpbmih-> bmiHeader.biHeight, lpData, (BITMAPINFO*)&(lpbmih-> bmiHeader), DIB_RGB_COLORS);
然后保存那里改一吓
if(file.Open(szBMPFileName,CFile::modeWrite | CFile::modeCreate))
{
file.Write(&bmfh,sizeof(BITMAPFILEHEADER));
file.Write(&(lpbmih-> bmiHeader),sizeof(BITMAPINFOHEADER));
file.Write(lpData,iBMPBytes); //注意这里,改了
file.Close();
}
GlobalFree(lpData); // 这里
分给我啊!!!!!!!!!!!