从Cstatic中保存BMP文件出现错误

liumingren 2009-04-10 08:07:36
我要将CStatic中的图像保存到BMP文件,保存后,浏览BMP图像,图像是全黑的,没有其它颜色,不知道是问什么?下面是我的代码:
LPBITMAPINFO lpbmih = new BITMAPINFO();
CDC* pDC = m_Show.GetDC();(m_Show是一个CStatic对象)

CRect rect;
m_Show.GetClientRect(rect);

int nHeight = rect.Height();

int nWidth = (((rect.Width() * 8) + 31) / 32) * 4;

lpbmih->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbmih->bmiHeader.biWidth = nWidth;
lpbmih->bmiHeader.biHeight = nHeight;
lpbmih->bmiHeader.biPlanes = 1;
lpbmih->bmiHeader.biBitCount = 24;
lpbmih->bmiHeader.biCompression = BI_RGB;
lpbmih->bmiHeader.biSizeImage = nWidth * nHeight * 3;
lpbmih->bmiHeader.biXPelsPerMeter = 0;
lpbmih->bmiHeader.biYPelsPerMeter = 0;
lpbmih->bmiHeader.biClrUsed = 0;
lpbmih->bmiHeader.biClrImportant = 0;

HDC hdc , hdcMem;
HBITMAP hBitMap = NULL;
CBitmap *pBitMap = NULL;
CDC* pMemDC = NULL;
BYTE* pBits;

hdc = pDC->m_hDC;
hdcMem = CreateCompatibleDC(hdc);

hBitMap = CreateDIBSection(hdcMem,lpbmih,DIB_PAL_COLORS,(void**)&pBits,NULL,0);

pBitMap = new CBitmap();
pBitMap->Attach(hBitMap);

pMemDC = new CDC();
pMemDC->Attach(hdcMem);

LPBITMAPFILEHEADER bmfh = new BITMAPFILEHEADER();

bmfh->bfType = 0x4d42;
bmfh->bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmfh->bfSize = bmfh->bfOffBits + nWidth * nHeight * 3;

CString str;
str.Format("c:/%d.bmp",filenum);
CFile file;
if(file.Open(str,CFile::modeCreate | CFile::modeReadWrite))
{
file.Write(bmfh,sizeof(BITMAPFILEHEADER));
file.Write(&(lpbmih->bmiHeader),sizeof(BITMAPINFOHEADER));
file.Write(pBits,nWidth * nHeight * 3);
file.Close();
}


filenum += 1;
...全文
49 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Chivalry 2009-04-10
  • 打赏
  • 举报
回复
CDC *pDC;//屏幕DC
pDC = m_Show.GetDC();
int BitPerPixel = pDC->GetDeviceCaps(BITSPIXEL);//获得颜色模式

CRect rect;
m_Show.GetClientRect(rect);

int Height = rect.Height();

int Width = (((rect.Width() * 8) + 31) / 32) * 4;


CDC memDC;//内存DC
memDC.CreateCompatibleDC(pDC);

CBitmap memBitmap, *oldmemBitmap;//建立和屏幕兼容的bitmap
memBitmap.CreateCompatibleBitmap(pDC, Width, Height);

oldmemBitmap = memDC.SelectObject(&memBitmap);//将memBitmap选入内存DC
memDC.BitBlt(0, 0, Width, Height, pDC, 0, 0, SRCCOPY);//复制屏幕图像到内存DC

//以下代码保存memDC中的位图到文件
BITMAP bmp;
memBitmap.GetBitmap(&bmp);//获得位图信息

FILE *fp = fopen("C:\\1.bmp", "w+b");

BITMAPINFOHEADER bih = {0};//位图信息头
bih.biBitCount = bmp.bmBitsPixel;//每个像素字节大小
bih.biCompression = BI_RGB;
bih.biHeight = bmp.bmHeight;//高度
bih.biPlanes = 1;
bih.biSize = sizeof(BITMAPINFOHEADER);
bih.biSizeImage = bmp.bmWidthBytes * bmp.bmHeight;//图像数据大小
bih.biWidth = bmp.bmWidth;//宽度

BITMAPFILEHEADER bfh = {0};//位图文件头
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//到位图数据的偏移量
bfh.bfSize = bfh.bfOffBits + bmp.bmWidthBytes * bmp.bmHeight;//文件总的大小
bfh.bfType = (WORD)0x4d42;

fwrite(&bfh, 1, sizeof(BITMAPFILEHEADER), fp);//写入位图文件头

fwrite(&bih, 1, sizeof(BITMAPINFOHEADER), fp);//写入位图信息头

byte * p = new byte[bmp.bmWidthBytes * bmp.bmHeight];//申请内存保存位图数据

GetDIBits(memDC.m_hDC, (HBITMAP) memBitmap.m_hObject, 0, Height, p,
(LPBITMAPINFO) &bih, DIB_RGB_COLORS);//获取位图数据

fwrite(p, 1, bmp.bmWidthBytes * bmp.bmHeight, fp);//写入位图数据

delete [] p;

fclose(fp);

memDC.SelectObject(oldmemBitmap);

19,464

社区成员

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

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