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位位图文件 展开
注:因为对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位位图文件 展开
1个回答
展开全部
BMP位图的色值顺序是RGB,你的读取顺序是BGR,颜色反了
网上读取BMP的代码非常多,为什么不参考?MFC可以使用标准的BITMAPFILEHEADER和BITMAPINFOHEADER读取文件头,比你这样做效率和适应程度好的多
SetPixel是最耗时的显示方法,效率很低。BMP文件的读取,即使不使用GDI+、CImage做,也可以自己构建HBITMAP或者CBitmap,这样直接BitBlt就可以显示了,也不影响你后续获取指针进行CMYK的转换,你这样一点一点读取文件不可取,不建议在这个代码上继续完善。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询