MFC读取并显示bmp图像出问题了,谁来解决下?

我要实现的是将bmp文件读入并在用户区显示,但是显示结果都不对的,谁能来帮忙看下?注:因为对bmp文件还要做后续的处理(比如RGB转CMYK这样的),所以我现在写的代码只... 我要实现的是将bmp文件读入并在用户区显示,但是显示结果都不对的,谁能来帮忙看下?
注:因为对bmp文件还要做后续的处理(比如RGB转CMYK这样的),所以我现在写的代码只是一个测试是否正确读取bmp的程序。
这是我的代码:
unsigned short format,bit_per_pix,r,g,b; unsigned int offset,bmp_width; int bmp_height;
m_bmp.Read(&format,sizeof(unsigned short)); //其中m_bmp为CFile类的对象,已定义并赋值 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){ 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)); } } }
这是原始图片:

这是读取出来的图片:
这个程序读取的是24位位图文件
展开
 我来答
bhtzu
2015-02-03 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8088
采纳率:85%
帮助的人:4071万
展开全部
  1. BMP位图的色值顺序是RGB,你的读取顺序是BGR,颜色反了

  2. 网上读取BMP的代码非常多,为什么不参考?MFC可以使用标准的BITMAPFILEHEADER和BITMAPINFOHEADER读取文件头,比你这样做效率和适应程度好的多

  3. SetPixel是最耗时的显示方法,效率很低。BMP文件的读取,即使不使用GDI+、CImage做,也可以自己构建HBITMAP或者CBitmap,这样直接BitBlt就可以显示了,也不影响你后续获取指针进行CMYK的转换,你这样一点一点读取文件不可取,不建议在这个代码上继续完善。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式