VC 已知BITMAPINFO 如何保存成BMP文件

A19881007 2008-03-29 04:29:31
在现给分最好给出代码!
...全文
352 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wrhwww 2008-03-30
  • 打赏
  • 举报
回复
你怎么读的就怎么去保存!!
可参考一下:
void CXXXView::OnFileOpen()
{
// TODO: Add your command handler code here
CFileDialog dlg(TRUE,_T("BMP"),_T("*.BMP"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("BMP Files (*.bmp)|*.bmp"),NULL);
CString fileName;

if(dlg.DoModal()==IDCANCEL)
return ;
fileName=dlg.GetPathName();


CFile bitmapFile;
CFileException fileException;
if(!bitmapFile.Open(fileName,CFile::modeRead,&fileException))
{
TRACE("Can't open file %s,error=%u\n",fileName,fileException.m_cause);
}

m_pBmpFileHeader=(BITMAPFILEHEADER*) new char [sizeof(BITMAPFILEHEADER)];//给文件信息头分配内存
bitmapFile.Read(m_pBmpFileHeader,sizeof(BITMAPFILEHEADER));//读入文件信息头信息

m_pBmpInfoHeader=(BITMAPINFOHEADER*) new char [sizeof(BITMAPINFOHEADER)];//给BMP信息头分配内存
bitmapFile.Read(m_pBmpInfoHeader,sizeof(BITMAPINFOHEADER));

if(m_pBmpFileHeader->bfType!=0x4D42)//判断文件是不是位图文件
{
AfxMessageBox("This is not a bitmap file!!");
bFileRead=FALSE;
bitmapFile.Close();
return;
}

if(m_pBmpInfoHeader->biCompression!=0)//判断图像是不是压缩的
{
AfxMessageBox("This system only support Un-compression!!");
bitmapFile.Close();
return;
}

switch(m_pBmpInfoHeader->biBitCount)//判断颜色的位数
{
case 1:
nPaletteSize=2;
break;
case 4:
nPaletteSize=16;
break;
case 8:
nPaletteSize=256;
break;
case 24:
nPaletteSize=0;//当为真彩色时没有颜色表,所以为0
break;
default:
AfxMessageBox("This color is not valid!!");
bitmapFile.Close();
return;
}

//下面根据不同的图像位数,计算调色板的大小
m_pBmpInfo=(BITMAPINFO *)new char [sizeof(BITMAPINFOHEADER)+nPaletteSize*sizeof(RGBQUAD)];//根据调色板大小给位图分配内存
bitmapFile.Read(&(m_pBmpInfo->bmiColors[0]),nPaletteSize*sizeof(RGBQUAD));//调入调色板数据到位图信息
m_pBmpInfo->bmiHeader=*m_pBmpInfoHeader;//给位图信息的位图信息头赋值

DWORD bytesPerLine=m_pBmpInfoHeader->biWidth*(m_pBmpInfoHeader->biBitCount/8);//计算每行图像所占的字节数
if(bytesPerLine%4!=0)//当宽度为奇数时
bytesPerLine=(bytesPerLine/4+1)*4;//对每行图像进行对齐

/*unsigned int */size=m_pBmpInfoHeader->biHeight*bytesPerLine;//计算图像数据所占大小

pDib=(BYTE*)new char[size];//给图像数据分配内存
bitmapFile.Read(pDib,size);//读入位图数据
bitmapFile.Close();

width=m_pBmpInfoHeader->biWidth;//得到图像数据的宽度
height=m_pBmpInfoHeader->biHeight;//得到图像数据的高度
bFileRead=TRUE;
Invalidate();
}
void CXXXView::OnFileSave()
{
// TODO: Add your command handler code here
BITMAPFILEHEADER bmpFileHeader;
LPBITMAPINFOHEADER lpBmpInfoHeader;
CFileDialog dlg(FALSE,_T("BMP"),_T("*.BMP"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("位图文件(*.BMP)|*.BMP|"));

CString fileName;
if(IDOK==dlg.DoModal())
fileName.Format("%s",dlg.GetPathName());
else
return ;
CFile dibFile(fileName, CFile::modeCreate|CFile::modeWrite);
dibFile.Write(m_pBmpFileHeader,sizeof(BITMAPFILEHEADER));
if(nPaletteSize)
dibFile.Write(m_pBmpInfo,sizeof(BITMAPINFO)+nPaletteSize*sizeof(RGBQUAD));//灰度图
else
dibFile.Write(m_pBmpInfoHeader,sizeof(BITMAPINFOHEADER));//RGB图

dibFile.Write(pDib,size);
dibFile.Close();
}
A19881007 2008-03-29
  • 打赏
  • 举报
回复
CDib::BOOL SaveFile(HGLOBAL hDib, CFile& file),那如何将第一个参数转化成BITMAPINFO 结构呢!
量子 2008-03-29
  • 打赏
  • 举报
回复
直接搜索一个CDIB类就应该有这样的功能

19,468

社区成员

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

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