baidu_25665887 2015-02-03 08:29 采纳率: 75%
浏览 1813
已采纳

MFC读取24位bmp图像出问题了,求大神来解决

我要实现的是将24位bmp文件读入并在用户区显示,但是显示结果都不对的,谁能来帮忙看下?

注:因为对bmp文件还要做后续的处理(比如RGB转CMYK这样的),所以我现在写的代码只是一个测试是否正确读取bmp的程序。用其它控件去读取图片对我来说是毫无用处的。

这是我的代码:
void CMy3View::OnLoad()
{
// TODO: 在此添加命令处理程序代码
CString strFilter,strFilename,info;
unsigned short format,bit_per_pix,r,g,b;
unsigned int offset,bmp_width;
int bmp_height;
//打开bmp文件
strFilter=_T("bmp images(*.bmp)|*.bmp||");
CFileDialog dlg(true,NULL,NULL,OFN_EXPLORER|OFN_ENABLESIZING|OFN_FILEMUSTEXIST,strFilter);
if(dlg.DoModal()==IDOK){
strFilename=dlg.GetPathName();
CFile m_bmp(strFilename,CFile::modeRead);
m_bmp.SeekToBegin();
//读取bmp文件头
m_bmp.Read(&format,sizeof(unsigned short));
if(0x4d42!=format){//查看图片文件格式
AfxMessageBox(_T("The format of this bmp image is not supported by Windows!"));
}
m_bmp.Seek(0xa,CFile::begin); //读取到位图数据需要的偏移量
m_bmp.Read(&offset,sizeof(unsigned int));
m_bmp.Seek(0x12,CFile::begin); //读取位图宽高
m_bmp.Read(&bmp_width,sizeof(unsigned int));
m_bmp.Read(&bmp_height,sizeof(int));
m_bmp.Seek(0x1c,CFile::begin); //读取位图格式(256色,24位,32位)
m_bmp.Read(&bit_per_pix,sizeof(unsigned short));
m_bmp.Seek(offset,CFile::begin);//定位到位图数据
CClientDC dc(this);
int x,y;
if(24==bit_per_pix){ //如果是24位位图,则执行下列代码
if(bmp_height>0)
for(y=0;y<bmp_height;y++){
for(x=0;x<(int)bmp_width;x++){
m_bmp.Read(&b,sizeof(unsigned short));
m_bmp.Read(&g,sizeof(unsigned short));
m_bmp.Read(&r,sizeof(unsigned short));
dc.SetPixel(x,(bmp_height-y-1),RGB(r,g,b));
}
}
}

m_bmp.Close();
}
}
这是原始图片:
图片说明
这是我的程序读取的结果:
图片说明

  • 写回答

1条回答 默认 最新

  • 91program 博客专家认证 2015-02-03 10:18
    关注

    m_bmp.Read(&b,sizeof(unsigned short)); 读取时为什么 是 short?这样一次就读取了 6 个字节的数据。但实现一个像素的字节数应该是 3 才对。

    所以导致:
    (1) 图像数据不对
    (2) 图像数据只有一半

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器