请问如何保存位图?

USTCTony 2003-05-09 10:04:26
我创建了一个内存区域的位图。
CDC MemDC;
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(NULL);
CBitmap MemBitmap;
MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
MemDc.SelectObject(MemBitmap);

for(i=0;i<rectYTitle.Height();i++)
{
for(int j=0;j<rectYTitle.Width();j++)
{
MemDC.SetPixel(i,j,MyTitleDC.GetPixel(i,j));
//MyTitleDC是源
}
}
请问我如何比较简单的保存MemBitmap的内容。
我知道写bitmap文件头然后再写数据。但是这样比较麻烦。
请问有没有比较简单的Api或者是像VC7中的CImage类一样
的简单方法?
多谢。
...全文
271 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
JASONDUAN 2003-05-16
  • 打赏
  • 举报
回复
我的方法
先用 WriteFile 写入 BITMAPFILEHEADER 和 BITMAPINFOHEADER
再用 SetFilePointer 和 WriteFile 写入DIB文件
free_card 2003-05-12
  • 打赏
  • 举报
回复
写窗口图像到BMP位图文件


 
WINDOWS的窗口图像从本质上来说,是WINDOWS在内存DC上绘制的一幅图像,
我们要将此图像存储起来,首先要获得WINDOWS窗口的区域大小,然后将区域中的图像
存在一内存DC中,由于内存DC是与设备相关的位图,所以将它存储起来还要用DDBTODIB
函数转换成DIB位图,最后再用WriteDIB函数转储成BMP文件。 
 

BOOL WriteWindowToDIB( LPTSTR szFile, CWnd *pWnd )
{
CBitmap bitmap;
CWindowDC dc(pWnd);
CDC memDC;
CRect rect;

memDC.CreateCompatibleDC(&dc);

pWnd->GetWindowRect(rect);
//用窗口区域大小定义一个内存DC ,并将窗口图像暂存其中
bitmap.CreateCompatibleBitmap(&dc, rect.Width(),rect.Height() );

CBitmap* pOldBitmap = memDC.SelectObject(&bitmap);
memDC.BitBlt(0, 0, rect.Width(),rect.Height(), &dc, 0, 0, SRCCOPY);

// 如果设备支持调色板,创建调色板
CPalette pal;
if( dc.GetDeviceCaps(RASTERCAPS) & RC_PALETTE )
{
UINT nSize = sizeof(LOGPALETTE) + (sizeof(PALETTEENTRY) * 256);
LOGPALETTE *pLP = (LOGPALETTE *) new BYTE[nSize];
pLP->palVersion = 0x300;

pLP->palNumEntries =
GetSystemPaletteEntries( dc, 0, 255, pLP->palPalEntry );

// Create the palette
pal.CreatePalette( pLP );

delete[] pLP;
}

memDC.SelectObject(pOldBitmap);

// 转换 bitmap 到 a DIB
HANDLE hDIB = DDBToDIB( bitmap, BI_RGB, &pal );

if( hDIB == NULL )
return FALSE;

// Write it to file
WriteDIB( szFile, hDIB );

// Free the memory allocated by DDBToDIB for the DIB
GlobalFree( hDIB );
return TRUE;
}


icedot 2003-05-12
  • 打赏
  • 举报
回复
楼上兄弟说得对。这些代码我也写过,我只是想想看还有没有和我不同的写法。哈哈
herrycsdn 2003-05-10
  • 打赏
  • 举报
回复
自己写也不麻烦啊
看别人的代码,还不如自己写,既然你知道怎么做
houdy 2003-05-10
  • 打赏
  • 举报
回复
首先你要明白BMP的文件格式。
自己创建文件头,文件信息头,保存系统调色盘(如果需要的话),还有就是图象信息,用CFILE或者序列化的方法将数据按BMP的文件格式保存到磁盘文件中。可能出现调色盘的问题(就是你看到的图象和你保存后再看到的图片不一样),多注意一下。
icedot 2003-05-10
  • 打赏
  • 举报
回复
有这样的方法吧。是您自己写的函数,还是windows中有这样的API呀。我用是win2k+vc6。能不能给我也发一份呀。谢谢。sxj_dear@163.com
JASONDUAN 2003-05-10
  • 打赏
  • 举报
回复
把你的e-mail给我,我给你传过去

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧