问题描述
- 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.Read(&b,sizeof(unsigned short)); 读取时为什么 是 short?这样一次就读取了 6 个字节的数据。但实现一个像素的字节数应该是 3 才对。
所以导致:
(1) 图像数据不对
(2) 图像数据只有一半