CFileDialog dlg读取图像文件

ksanson 2009-12-10 03:17:55
LPCTSTR lpszFilter = "BMP Files(*.bmp)|*.bmp|任何文件|*.*||";
CFileDialog dlg(TRUE,lpszFilter,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,lpszFilter,NULL);
CString filename;
CFile file; //打开文件对话框
if ( dlg.DoModal() == IDOPEN )
{
filename = dlg.GetPathName();
if ( file.Open(filename,CFile::modeRead|CFile::shareDenyNone,NULL) == 0 )
{
//读取文件失败
AfxMessageBox("无法打开文件!",MB_OK,0);
return FALSE;
}
//读取文件头
file.Read(&m_bf,sizeof(m_bf));
//判断是否为BMP文件
if ( m_bf.bfType != 0x4d42 )//'BM'
{
AfxMessageBox("非BMP文件!",MB_OK,0);
return FALSE;
}
//判断文件是否损坏
if ( file.GetLength() != m_bf.bfSize )
{
AfxMessageBox("文件已损坏,请检查!",MB_OK,0);
return FALSE;
}

//读文件信息头
file.Read(&m_bi,sizeof(m_bi));

//计算调色板数目
m_numQuad = 0;
if ( m_bi.biBitCount < 24 )
{
m_numQuad = 1<<m_bi.biBitCount;
}

//为图像信息m_pbi申请空间
m_pbi = (BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,sizeof(BITMAPINFOHEADER)+m_numQuad*sizeof(RGBQUAD));
memcpy(m_pbi,&m_bi,sizeof(m_bi));
m_pRGB = (RGBQUAD*)((BYTE*)m_pbi+sizeof(BITMAPINFOHEADER));

//读取调色板
if ( m_numQuad != 0 )
{
file.Read(m_pRGB,sizeof(RGBQUAD)*m_numQuad);
}
//为图像数据申请空间
m_bi.biSizeImage = m_bf.bfSize - m_bf.bfOffBits;
m_pData = (BYTE*)HeapAlloc(GetProcessHeap(),0,m_bi.biSizeImage);
//读取图像数据
file.Read(m_pData,m_bi.biSizeImage);
//图像读取完毕,关闭文件,设置标志
file.Close();
flag = 1;
if( flag == 1 )
{

HeapFree(GetProcessHeap(),0,m_pbi);
HeapFree(GetProcessHeap(),0,m_pData);

}

}




请教各位高手,这样读取有错吗?怎么我在调试的时候显示CFileDialog dlg(TRUE,lpszFilter,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,lpszFilter,NULL);这句错误
...全文
328 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanhan288 2011-03-29
  • 打赏
  • 举报
回复
弱弱的问一下。 m_bf是什么类型
loop_k 2010-01-19
  • 打赏
  • 举报
回复
呵呵 接个分。。
ksanson 2010-01-07
  • 打赏
  • 举报
回复
这个已经解决了!谢谢大家的回答
cuihaoyun 2009-12-13
  • 打赏
  • 举报
回复
加不加括号 没什么吧
nintendo_dskay 2009-12-11
  • 打赏
  • 举报
回复
好像那个语句没有问题
heartofmaple 2009-12-10
  • 打赏
  • 举报
回复
我用VS2005和VC6.0运行没有问题。。。
hoosean 2009-12-10
  • 打赏
  • 举报
回复
MSDN上有CFileDialog的例子代码,改造一下,照抄就可以,
bragi523 2009-12-10
  • 打赏
  • 举报
回复
LPCTSTR lpszFilter = "BMP Files(*.bmp)|*.bmp|任何文件|*.*||";



改成::


LPCTSTR lpszFilter = _T("BMP Files(*.bmp)|*.bmp|任何文件|*.*||");
要不然就成乱码了

19,468

社区成员

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

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