首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

位图保存的有关问题

2012-01-20 
位图保存的问题我在内存中画好了一张位图,要存到磁盘文件中去,在CSDN找到代码,修改后编译通过,但是运行出

位图保存的问题
我在内存中画好了一张位图,要存到磁盘文件中去,在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); // 这里


分给我啊!!!!!!!!!!!

热点排行