求保存bmp位图的简单代码

daotong 2006-04-06 04:21:13
我已经把位图读取出来,并且经过处理,要把感兴趣的部分保存为另一个位图,但是结果都是文件生成了,图像却是空的。我觉得应该是文件头没处理好,反复试了试也没成功,希望有懂的朋友给段简单明了的代码,最好是能编译通过。我刚学图像处理,水平太菜,参考一下大家的思路。
...全文
182 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hisky1983 2006-04-06
  • 打赏
  • 举报
回复
BITMAPFILEHEADER bmfHdr;
LPBITMAPINFOHEADER lpBI;
DWORD dwDIBSize;
if (hDib == NULL)
{
return FALSE;
}

// 读取BITMAPINFO结构,并锁定
lpBI = (LPBITMAPINFOHEADER)
::GlobalLock((HGLOBAL) hDib);
if (lpBI == NULL)
{
return FALSE;
}
//判断是否是WIN3.0 DIB

if (!IS_WIN30_DIB(lpBI))
{
::GlobalUnlock((HGLOBAL) hDib);
return FALSE;
}
// 文件类型"BM"

bmfHdr.bfType ='MB';
// 文件头大小+颜色表大小
// (BITMAPINFOHEADER和BITMAPCOREHEADER结构的第一个DWORD都是该结构的大小)
dwDIBSize = *(LPDWORD)lpBI + cdib::PaletteSize((LPSTR)lpBI);
// 计算图像大小
if ((lpBI->biCompression == BI_RLE8) || (lpBI->biCompression == BI_RLE4))
{
// 对于RLE位图,没法计算大小,只能信任biSizeImage内的值
dwDIBSize += lpBI->biSizeImage;
}
else
{
DWORD dwBmBitsSize;
dwBmBitsSize = WIDTHBYTES((lpBI->biWidth)*((DWORD)lpBI->biBitCount)) * lpBI->biHeight;
// 计算出DIB真正的大小
dwDIBSize += dwBmBitsSize;
// 更新biSizeImage(很多BMP文件头中biSizeImage的值是错误的)
lpBI->biSizeImage = dwBmBitsSize;
}
// 计算文件大小:DIB大小+BITMAPFILEHEADER结构大小
bmfHdr.bfSize = dwDIBSize + sizeof(BITMAPFILEHEADER);

// 两个保留字
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;

// 计算偏移量bfOffBits,它的大小为Bitmap文件头大小+DIB头大小+颜色表大小
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + lpBI->biSize + PaletteSize((LPSTR)lpBI);
CFile file;
建立文件file.create(....)
file.SetLength(bmfHdr.bfSize);
file.Write((LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER));
file.WriteHuge(lpBI,dwDIBSize);
wlwlxj 2006-04-06
  • 打赏
  • 举报
回复
下一个CDib类可以搞定
celiacw 2006-04-06
  • 打赏
  • 举报
回复
保存位文件时用Cfile类的一个对象如file,调用其成员函数file.write(参数省略,自己找),先写进文件头(BITMAPFILEHEADER),再写进数据部分,你看看是不是写数据部分出错了?

19,472

社区成员

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

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