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

问题描述

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();
}
}
这是原始图片:

这是我的程序读取的结果:

解决方案

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

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

时间: 2025-01-02 00:34:03

mfc- MFC读取24位bmp图像出问题了,求大神来解决的相关文章

大神快进来-genymotion出问题了求大神解决!

问题描述 genymotion出问题了求大神解决! 一直没事,这次想运行个程序看看结果就这样了,网上的问题全都和我的不一样,特来此地求大神帮忙 解决方案 http://zhidao.baidu.com/link?url=ruXXnGJFYEKSfqg822CT6BfUktoWdiH8qVi4rM7CQwddu7B9wv1W1oZGHDGRaSQWKEaq62Gg7geKrdWUJl6emK8LX4k-XYNWMHbjUNJ4y_y 解决方案二: 我也絮叨了一样的问题一样啊.同问 解决方案三: 我

基于24位bmp图片数据区隐写的实现

1,关于数据区隐写 数据区隐写,即将数据写入到数据区中.相比文件外壳隐写和保留区隐写,更为隐蔽,隐藏的信息容量相对较大.在数据区隐写会造成图像变化,所以需要控制写入方式,以及改写量.使得在普通肉眼难以辨别的更改中实现数据的隐藏.至于其他的隐写方法请看:简单信息隐藏技术的实现与讨论. 2,24位bmp图像简介 要在bmp图像进行数据区隐写,必须要知道它的数据结构.否则,可能会破坏图像. 这是bmp的文件结构.     位图文件头(bitmap-file header)包含了图像类型.图像大小.图像

mfc c++-新人求教,我用mfc做了一个tcp fin的端口扫描器,死后得不出结果,求大神帮忙找出问题

问题描述 新人求教,我用mfc做了一个tcp fin的端口扫描器,死后得不出结果,求大神帮忙找出问题 cpp文件 // scanDlg.cpp : implementation file// #include ""stdafx.h""#include ""scan.h""#include ""scanDlg.h""#include ""afxdialogex.h&qu

vc++-新人学MFC遇到单选钮的问题,求大神解决

问题描述 新人学MFC遇到单选钮的问题,求大神解决 界面里的颜色背景和图像背景是一组,颜色背景默认选中,想选中图像背景,这个按钮死活选不了,郁闷啊,求大神们来解决解决 解决方案 单选按钮要放在同一个groupbox/frame中,否则所有的单选视作是一组. 解决方案二: 贴个图出来看一下~~~

设计-关于一个单词匹配的题目,得不到想要的结果,贴出源程序,求大神帮忙~~~

问题描述 关于一个单词匹配的题目,得不到想要的结果,贴出源程序,求大神帮忙~~~ #include#include#include#include#includeint IsOneCharDifferent(char array[255]);int IsIt(char array[255]);int IsMoreOrLessOneChar(char array[255]);//************************************************************

string-java新手求助:学到方法了,遇到一题目,已经解出,但求更多的解决方法。

问题描述 java新手求助:学到方法了,遇到一题目,已经解出,但求更多的解决方法. 新手学习,刚学到了方法,但其中但参数和方法调用其实不是很明白.跟着课本做了一道题.附上题目和我的代码.请求各方面的指点,改进我的代码也好.指出不对的也好.提供新的解题方法或代码的也好,多多益善: 题目如下: 一个五角数被定义为n(3n-1)/2,其中n=1,2,3,4,5··············所以,开始的几个数字就是1,5,12,22 编写下面的方法,返回一个五角数. public static int g

access数据库-求大神解决啊,vs连接access出问题啦

问题描述 求大神解决啊,vs连接access出问题啦 我用visual studio2010链接access数据库出现下面第一张图的界面,根本无法选择数据库.只能链接sql数据库,出现第二张图的界面,这个是正常的.我又下载了vs2013,结果也是不能连access,请问我电脑设置或哪儿有什么问题,问题在哪啊?急求! 解决方案 安装了access的啊,怎么个区分法 解决方案二: 你的图也看不清楚,microsoft access安装了吗?需要这个驱动.还有数据库32位.64位区分要注意. 解决方案

ios-iOS 获取手机通讯录遍历时,只有一个联系人(获取到了所有联系人,可是遍历时出问题了)求大神帮忙

问题描述 iOS 获取手机通讯录遍历时,只有一个联系人(获取到了所有联系人,可是遍历时出问题了)求大神帮忙 #import "AddressBook.h" #import "pinyin.h"//将汉字转换成英文 #import "Person.h"//将联系人信息存储成一个一个的person //存储通讯录的类 @interface AddressBook () @end @implementation AddressBook static A

spring mvc-springmvc+mybatis+quartz的项目启动出错了,求大神指点

问题描述 springmvc+mybatis+quartz的项目启动出错了,求大神指点 看不懂什么情况,求大神指点下 jackson-mapper-asl严重: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/Quart