图像存储问题请教 本帖最后由 helloruan 于 2010-06-21 17:14:11 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你上面是用来保存DIB位图的,而你写的BITMAPINFOHEADER *infoHead=(BITMAPINFOHEADER*)m_pDib,是不对的。下面的可以保存DIB位图:BOOL ImgDib::Write(LPCTSTR lpszPathName){ //写模式打开文件 CFile file; if (!file.Open(lpszPathName, CFile::modeCreate | CFile::modeReadWrite | CFile::shareExclusive)) return FALSE; //填写文件头结构 BITMAPFILEHEADER bmfh; bmfh.bfType = 0x4d42; // 'BM' bmfh.bfSize = 0; bmfh.bfReserved1 = bmfh.bfReserved2 = 0; bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableLength; try { //文件头结构写进文件 file.Write((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER)); //文件信息头结构写进文件 file.Write(m_lpBmpInfoHead, sizeof(BITMAPINFOHEADER)); //如果有颜色表的话,颜色表写进文件 if(m_nColorTableLength!=0) file.Write(m_lpColorTable, sizeof(RGBQUAD) * m_nColorTableLength); //位图数据写进文件 int imgBufSize=(m_imgWidth*m_nBitCount/8+3)/4*4*m_imgHeight; file.Write(m_pImgData, imgBufSize); } catch(CException* pe) { pe->Delete(); AfxMessageBox("write error"); return FALSE; } //函数返回 return TRUE;}//调用write()即可void CImgDibDlg::OnSaveBmp() { CString m_szFileName; //pNewDib为用来保存图像的DIB指针 if (pNewDib!=NULL) { CFileDialog dlg(FALSE, _T("bmp"), _T("Temp.bmp"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Bitmap Files (*.bmp)|*.bmp|All Files (*.*)|*.*||"), this); if(dlg.DoModal() == IDOK) { m_szFileName = dlg.GetPathName(); pNewDib->Write(m_szFileName); } } else MessageBox("图像未进行处理!");} "你上面是用来保存DIB位图的,而你写的BITMAPINFOHEADER *infoHead=(BITMAPINFOHEADER*)m_pDib,是不对的。"yangjie7732 可以解释一下为什么吗?我的m_pDib所指向的缓冲区是用来存储除了文件头BITMAPFILEHEADER结构以外的位图数据的,这样定义的BITMAPINFOHEADER *infoHead=(BITMAPINFOHEADER*)m_pDib没有取到需要存储的位图数据的信息头吗? 昨晚VC做的一个基于对话框界面,来者有分 MDI中,添加了一个新的View类,想在点击菜单的时候显示?要怎么做呢? view类在什么时候被显示? 是不是有WM_MOUSEMOVE消息 GetlastError函数得到的结果,MSDN中什么地方能查到? win2000服务的奇怪问题 一个类在另外一个类中作成员变量的问题; VB调用VC DLL出现DLL 的调用约定错误(49),怎么办? 解方程 c中如何实现可选参数?就象VB中的Optional参数一样? 求助,VS2008升级了SP1后遇到的麻烦 vc2008无法下断点。
下面的可以保存DIB位图:
BOOL ImgDib::Write(LPCTSTR lpszPathName)
{
//写模式打开文件
CFile file;
if (!file.Open(lpszPathName, CFile::modeCreate | CFile::modeReadWrite
| CFile::shareExclusive))
return FALSE; //填写文件头结构
BITMAPFILEHEADER bmfh;
bmfh.bfType = 0x4d42; // 'BM'
bmfh.bfSize = 0;
bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) +
sizeof(RGBQUAD) * m_nColorTableLength;
try {
//文件头结构写进文件
file.Write((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER));
//文件信息头结构写进文件
file.Write(m_lpBmpInfoHead, sizeof(BITMAPINFOHEADER)); //如果有颜色表的话,颜色表写进文件
if(m_nColorTableLength!=0)
file.Write(m_lpColorTable, sizeof(RGBQUAD) * m_nColorTableLength); //位图数据写进文件
int imgBufSize=(m_imgWidth*m_nBitCount/8+3)/4*4*m_imgHeight;
file.Write(m_pImgData, imgBufSize);
}
catch(CException* pe) {
pe->Delete();
AfxMessageBox("write error");
return FALSE;
} //函数返回
return TRUE;
}//调用write()即可
void CImgDibDlg::OnSaveBmp()
{
CString m_szFileName;
//pNewDib为用来保存图像的DIB指针
if (pNewDib!=NULL)
{
CFileDialog dlg(FALSE, _T("bmp"), _T("Temp.bmp"), OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("Bitmap Files (*.bmp)|*.bmp|All Files (*.*)|*.*||"), this);
if(dlg.DoModal() == IDOK)
{
m_szFileName = dlg.GetPathName();
pNewDib->Write(m_szFileName);
}
}
else
MessageBox("图像未进行处理!");
}
BITMAPINFOHEADER *infoHead=(BITMAPINFOHEADER*)m_pDib,是不对的。"yangjie7732 可以解释一下为什么吗?我的m_pDib所指向的缓冲区是用来存储除了文件头BITMAPFILEHEADER结构以外的位图数据的,这样定义的BITMAPINFOHEADER *infoHead=(BITMAPINFOHEADER*)m_pDib没有取到需要存储的位图数据的信息头吗?