位图文件结构及MFC显示

windows位图结构 位图文件应该具有.bmp扩展名。 位图文件格式:BITMAPFILEHEADER(位图文件头)结构,后接BITMAPINFOHEADER、BITMAPV4HEADER或 BITMAPV5HEADER(位图信息头)结构,后接RGBQUAD(颜色表)结构数组,后接Color-index(颜色索引)数组——即实际的位图数据。 位图格式如下表所示: BITMAPFILEHEADER BIT... 阅读详情

一、位图文件结构

位图文件由三部分组成:文件头 + 位图信息 + 位图像素数据。

1、位图文件头。位图文件头主要用于识别位图文件。以下是位图文件头结构的定义:

 
  1. typedef struct tagBITMAPFILEHEADER { // bmfh   
  2.     WORD    bfType;   
  3.     DWORD   bfSize;   
  4.     WORD    bfReserved1;   
  5.     WORD    bfReserved2;   
  6.     DWORD   bfOffBits;   
  7. } BITMAPFILEHEADER;  

其中的bfType值应该是“BM”(0x4d42),标志该文件是位图文件。bfSize的值是位图文件的大小。


2、位图信息。位图信息中所记录的值用于分配内存,设置调色板信息,读取像素值等。
以下是位图信息结构的定义:

 
  1. typedef struct tagBITMAPINFO {  
  2.     BITMAPINFOHEADER    bmiHeader;  
  3.     RGBQUAD             bmiColors[1];  
  4. } BITMAPINFO;  

可见位图信息也是由两部分组成的:位图信息头 + 颜色表。


2.1位图信息头。位图信息头包含了单个像素所用字节数以及描述颜色的格式,此外还包括位图的宽度、高度、目标设备的位平面数、图像的压缩格式。以下是位图信息头结构的定义:
 
  1. typedef struct tagBITMAPINFOHEADER{ // bmih   
  2.     DWORD  biSize;   
  3.     LONG   biWidth;   
  4.     LONG   biHeight;   
  5.     WORD   biPlanes;   
  6.     WORD   biBitCount   
  7.     DWORD  biCompression;   
  8.     DWORD  biSizeImage;   
  9.     LONG   biXPelsPerMeter;   
  10.     LONG   biYPelsPerMeter;   
  11.     DWORD  biClrUsed;   
  12.     DWORD  biClrImportant;   
  13. } BITMAPINFOHEADER;   

下表是对结构体当中各个成员的说明: 


结构成员说 明
biSize结构BITMAPINFOHEADER的字节数,即sizeof(BITMAPINFOHEADER)*
biWidth以像素为单位的图像宽度*
biHeight以像素为单位的图像长度*
biplanes目标设备的位平面数
biBitCount每个像素的位数*(1)
biCompression图像的压缩格式(这个值几乎总是为0)
biSizeImage以字节为单位的图像数据的大小(对BI_RGB压缩方式而言)
biXPelsPermeter水平方向上的每米的像素个数
biYpelsPerMeter垂直方向上的每米的像素个数
biClrused调色板中实际使用的颜色数(2)
biClrImportant现实位图时必须的颜色数(3)


说明:*是需要加以注意的部分,因为它们是我们在进行位图操作时经常参考的变量
(1)对于每个像素的字节数,分别有一下意义:
0,用在JPEG格式中
1,单色图,调色板中含有两种颜色,也就是我们通常说的黑白图片
4,16色图
8,256色图,通常说的灰度图
16,64K图,一般没有调色板,图像数据中每两个字节表示一个像素,5个或6个位表示一个RGB分量
24,16M真彩色图,一般没有调色板,图像数据中每3个字节表示一个像素,每个字节表示一个RGB分量
32,4G真彩色,一般没有调色板,每4个字节表示一个像素,相对24位真彩图而言,加入了一个透明度,即RGBA模式

(2)这个值通常为0,表示使用biBitCount确定的全部颜色,例外是使用的颜色树木小于制定的颜色深度的颜色数目的最大值。

(3)这个值通常为0,表示所有的颜色都是必需的

2.2颜色表。颜色表一般是针对16位一下的图像而设置的,对于16位和16位以上的图像,由于其位图像素数据中直接对对应像素的RGB(A)颜色进行描述,因而省却了调色板。而对于16位一下的图像,由于其位图像素数据中记录的只是调色板索引值,因而需要根据这个索引到调色板去取得相应的RGB(A)颜色。颜色表的作用就是创建调色板。


颜色表是由颜色表项组成的,颜色表项结构的定义如下:

  1. typedef struct tagRGBQUAD { // rgbq   
  2.     BYTE    rgbBlue;   
  3.     BYTE    rgbGreen;   
  4.     BYTE    rgbRed;   
  5.     BYTE    rgbReserved;   
  6. } RGBQUAD;  

其中需要注意的问题是,RGBQUAD结构中的颜色顺序是BGR,而不是平常的RGB。


3、位图数据。最后,在位图文件头、位图信息头、位图颜色表之后,便是位图的主体部分:位图数据。根据不同的位图,位图数据所占据的字节数也是不同的,比如,对于8位位图,每个字节代表了一个像素,对于16位位图,每两个字节代表了一个像素,对于24位位图,每三个字节代表了一个像素,对于32位位图,每四个字节代表了一个像素。


二、位图文件MFC显示

1、通过点击浏览按钮选择BMP图像文件
点击浏览按钮打开文件对话框选择BMP图像文件,得到文件所在的路径目录。
关键代码如下:

void CShowBMPDlg::OnButtonSelectiamge() 
{

    char  szFilter[] = "BMP Files (*.bmp)|*.bmp|All Files (*.*)|*.*||";
    CFileDialog dlg( TRUE,"BMP",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter );
    if(dlg.DoModal() == IDOK)
    {
        strPathName = dlg.GetPathName();        
        LoadShowBMPFile(strPathName);    
        m_hBitmap = BufferToHBITMAP();    
        Invalidate();
    }
}

2、加载BMP文件到内存
通过得到的BMP图像文件路径目录,加载BMP图像文件到内存中。
关键代码如下:

BOOL CShowBMPDlg::LoadShowBMPFile(const char *pPathname)
{
    CFile file;
    if( !file.Open( pPathname, CFile::modeRead) )
        return FALSE;
    DWORD            m_nFileLen;
    m_nFileLen = file.GetLength();
    m_pBMPBuffer = new char[m_nFileLen + 1];
    if(!m_pBMPBuffer)
        return FALSE;
    if(file.Read(m_pBMPBuffer,m_nFileLen) != m_nFileLen)
        return FALSE;
    return TRUE;
}

3、将内存中的BMP文件内容转换到HBITMAP
将内存中的BMP文件内容转换成位图句柄。
关键代码如下:

HBITMAP CShowBMPDlg::BufferToHBITMAP()

{

HBITMAP         hShowBMP;

LPSTR                hDIB,lpBuffer = m_pBMPBuffer;

LPVOID            lpDIBBits;

BITMAPFILEHEADER    bmfHeader;

DWORD           bmfHeaderLen;

bmfHeaderLen = sizeof(bmfHeader);

strncpy((LPSTR)&bmfHeader,(LPSTR)lpBuffer,bmfHeaderLen);

if (bmfHeader.bfType != (*(WORD*)"BM")) 

return NULL;
    hDIB = lpBuffer + bmfHeaderLen;

BITMAPINFOHEADER &bmiHeader = *(LPBITMAPINFOHEADER)hDIB ;

BITMAPINFO &bmInfo = *(LPBITMAPINFO)hDIB ;

m_bmW = bmiHeader.biWidth;

m_bmH = bmiHeader.biHeight;

lpDIBBits=(lpBuffer)+((BITMAPFILEHEADER *)lpBuffer)->bfOffBits;

CClientDC dc(this);

hShowBMP = CreateDIBitmap(dc.m_hDC,&bmiHeader,CBM_INIT,lpDIBBits,&bmInfo,DIB_RGB_COLORS);

    return hShowBMP;
}

4、在屏幕上显示BMP图像
双缓冲实现BMP位图显示在屏幕上。
关键代码如下:

void CShowBMPDlg::DrawImage(int x, int y, CDC *pDC)
{
    HBITMAP OldBitmap;
    CDC MemDC;
    MemDC.CreateCompatibleDC(pDC);
    OldBitmap=(HBITMAP)MemDC.SelectObject(m_hBitmap);
    CBitmap* pBitmap = CBitmap::FromHandle(m_hBitmap);
    if(m_bmW == 0 || m_bmH == 0)
        return ;
    CRect rect;
    GetClientRect(&rect);       
    pDC->BitBlt(x,y,rect.Width(),rect.Height(),&MemDC,0,0,SRCCOPY);
    GetRGB(MemDC);
    MemDC.SelectObject(OldBitmap);
}


BMP图像格式介绍和显示——数字图像处理学习一(C++版) 一、BMP位图简介 常见的图像文件格式有:BMP、JPG、GIF等,BMP图像文件(Bitmap-File)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。BMP位图文件默认的文件扩展名是.BMP。 二、BMP位图文件格式 BMP文件由4部分组成:文件头、信息头、颜色表、颜色点阵数据(bits data) 下面以24位真彩色lena图像为例 1、文件头 typedef struct { //... 阅读详情

相关推荐

如何向CImageList中加入位图文件

 在MFC中CImageList类封装了图象列表控件的功能,图象列表控件是相同大小图象的一个集合,用于应用程序中大规模图标的存储,该控件是不可见控件,通常与其它控件一起使用,来为其它控件提供图标资源。图象的每个集合中均以0为图象索引基数,可以把这些图标看成是以数组方式存储的,图像列表通常由大图标或位图构成,其中包含位图模式,实际上,所有的在同一个图象列表中的图标都被存储在一个屏幕设备的位图中。

dog333的专栏 4452

MFC显示JPG,bmp图片

主要代码如下: //************************************ // 方法说明: 显示JPG和GIF、BMP图片 // 参数说明: CDC * pDC 设备环境对象 // 参数说明: CString strPath 要显示的图片路径 // 参数说明: int x 要显示的X位置 ...

u011555996的博客 448

2、4、8、16、24、32位图解析显示

在VC中,位图显示一般有现成的方式,如使用picture控件、GetDC()->StretchBlt、::BitBlt等,但这些方式都是高层的封装,让你不清楚一副位图是如何解析并显示到DC上的。实际应用中,比如图像处理,视频显示等,需要操作到位图中的像素,这需要弄明白位图文件如何组成,网上有太多的位图文件格式说明,下面借助实例和SetPixel函数完成解析与显示。 文档说明:http://blog.youkuaiyun.com/dijkstar/article/details/20854709

MFC实现图像灰度、采样和量化功能详解

本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程《数字图像处理》及课件进行讲解,主要通过MFC单文档视图实现显示BMP格式图片,并通过Bitmap进行灰度处理、图片采样和量化功能。         个人认为对初学者VC++6.0可能还是很值得学习的工具,所以采用它来讲解,而不是VS或C#。同时文章比较详细基础,希望该篇文章对你有所帮助~        【数字图像处...

ywxk1314的博客 2963

MFC 载入位图并显示

MFC 载入位图面并显示 可选择改变背景颜色, 选择改变字体 选择改变打印

16位彩色图像显示程序

16位彩色图像显示程序,src目录下面是源代码,Images目录下面有测试图像,该程序适用于16位单通道或者多通道图像的显示

MFC---多种方式显示位图

一、控件方式1、将要显示的位图b.bmp放在res文件夹下 2、右键工程,选择“Insert”,选择Bitmap,这时工程中新添了Bitmap文件夹 3、右键Bitmap文件夹,选择“Import Bitmap”,选择b.bmp,这时Bitmap文件夹下新建了IDB_BITMAP1 4、在对话框中拖入一个Picture控件,右键选择“属性”,类型(Type)选择Bitmap,图像(Image)

新博客:https://aping-dev.com/ 6189

16位色深的位图显示程序(vc6.0)

程序用于显示16位色深的bmp文件, 显示到窗体上。 运行与vc6.0开发环境。

MFC显示位图的几种方法

步骤/方法   //在对话框内显示位图   CBitmap hbmp;   HBITMAP hbitmap;   //装载图片文件MM.bmp   hbitmap=(HBITMAP)::LoadImage(::AfxGetInstanceHandle(),"MM.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSEC

shdj111的专栏 1062

MFC选择位图文件并显示

在MFC中点击一个按钮,然后会弹出文件选择框,从文件选择框中选择一个bmp格式的位图文件并显示出来。

ubuntu18.04安装xenomai3.1(百分百成功版)

ubuntu18.04安装xenomai3.1(百分百成功版),保姆级教学!!!

h542812556sdu的博客 2065

MFC中实现简单的位图显示

最近在做图像采集的工作,需要处理图像数据,所以学习了一下位图显示,而且只看了设备相关位图DDB。基本上实现了位图的显示、位图数据的处理等功能。这里就记录一下我自己的理解,不一定全都对,仅供参考而已。 要显示位图,需要做如下工作: CStatic* pStatic=(CStatic*)GetDlgItem(IDC_DISPLAY2); CDC* pDC=pStatic->GetDC

ppsharp的专栏 1351

2023年金蝶云星辰初级顾问认证参考试题(1)

最新积累的考试真题,答案只供参考(49分T~T),欢迎大佬们更正,私聊我修改,有新的试题也可以私聊我,日后会完善题库!大家一起努力,预祝大家顺利通过!1.【简单】生产环节中,客户老板希望掌握材料的超发或漏发情况,,以便分析用料情况,对材料浪费进行管控,可以查看什么报表?⒉[中等】客户主营电气柜的生产销售,商品为非标品需定制,又因交期效短,需要边生产边补料,以下哪个功能最适合该客户场景?15.【简单】在给商品设置科目关联时,分别按照单个商品,商品类别,所有商品设置了对应客户,()优先级最高。

MLX00的博客 7977

MFC显示bmp

版权声明:本文为博主原创文章,转载请注明优快云博客源地址!共同学习,一起进步~ 目录(?)[+] 本文主要是讲述《数字图像处理》系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的《数字图像处理》课程和以前的项目叙述讲解. 一.BMP图片格式定义 BMP文件格式是Windows操作系统推荐和支持的标准图

baidu_30496855的博客 710

CTFShow萌新区全攻略:从密码破解到Web渗透的实战解析

本文为CTFShow萌新区新手提供从密码破解到Web渗透的完整实战攻略。文章深入解析了密码学、隐写术、杂项和Web安全四大核心方向,分享了实用的解题工具、思维方法和绕过技巧,旨在帮助初学者建立系统的安全竞赛解题体系,而不仅仅是提供一份题解(WP)。

weixin_29216957的博客 299

OpenCode:终端开源AI编程助手,多模型接入与实战指南

AI编程助手正在从IDE侧边栏走向终端环境。其核心原理是让模型直接读取项目文件、执行命令、查看报错,形成从诊断到修复的完整闭环,从而解决传统插件上下文割裂的问题。技术价值在于开源透明、模型无关,既可接入OpenAI等云端服务,也能通过Ollama连接本地模型,兼顾数据安全与离线场景。在工程实践中,它适用于长时间驻留项目、自动修Bug、团队统一AI工具链等需求。OpenCode正是这样一款终端AI助手,支持灵活配置第三方API密钥,提供免费档与Go套餐,并通过Skills技能系统让模型遵循标准操作流程。同时,

weixin_28745821的博客 327

【数字图像处理】一.MFC详解显示BMP格式图片

本文主要是讲述《数字图像处理》系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的《数字图像处理》课程和以前的项目叙述讲解. 一.BMP图片格式定义 BMP文件格式是Windows操作系统推荐和支持的标准图像文件格式,是一种将内存或显示器的图像数据不经过压缩而直接按位存盘的文件格式,故称位图(bitmap),其扩展名为BMP.BMP图像通常...

杨秀璋的专栏 5万+

Android 埋点信息分析——statsd框架

StatsPullAtomService 用以采集数据,并将数据填充到参数中,在StatsManager.PullAtomCallbackInternal 中会转换成 Parcel 格式传入到 native。 StatsCallbackPuller::PullInternal 中会回调StatsManager.PullAtomCallbackInternal 的onPullAtom,该函数中会回调StatsCallbackPuller::PullInternal 中定义的PullResultRecei

私房菜 2630

MFC详解显示BMP格式图片

本文主要是讲述《数字图像处理》系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的《数字图像处理》课程和以前的项目叙述讲解. 一.BMP图片格式定义 BMP文件格式是Windows操作系统推荐和支持的标准图像文件格式,是一种将内存或显示器的图像数据不经过压缩而直接按位存盘的文件格式,故称位图(bitmap),其扩展名为BMP.BMP图像通常...

ywxk1314的博客 6658

OpenClaw实战系列02:企业微信接入完全指南

本文详细介绍了如何将OpenClaw与企业微信对接,实现智能机器人功能。主要内容包括:企业微信侧创建智能机器人或自建应用,获取必要凭证和权限;OpenClaw侧安装配置企业微信插件,设置通信通道;完成双向验证并进行功能测试。文章提供了详细的配置步骤、常见问题排查方法和进阶玩法,帮助用户在30分钟内完成对接。关键点包括:确保URL可访问、Token一致、网关正常运行,以及针对不同部署环境(云服务器/内网)的配置差异。

PeterPan的博客 3813

yolov7目标追踪:基于自定义数据集完成检测

目标追踪包含两个阶段:(1)基于自定义数据集,训练yolo目标检测模型;(2)基于检测模型,将实时检测结果传递到StrongSORT追踪算法中,该算法在OSNet基础上结合运动和外观信息,可以跟踪yolo模型检测到的任何物体。

📷 图像处理践行者 | 传统算法 · 深度学习 · 多模态 | 分享实战经验与技术洞见,探索从像素到智能的无限可能。 2306

数字图像处理(一)利用MFC显示BMP图像

转自https://blog.youkuaiyun.com/eastmount/article/details/18238863本文主要是讲述《数字图像处理》系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C++和MFC显示BMP格式,主要结合自己的《数字图像处理》课程和以前的项目叙述讲解.一.BMP图片格式定义BMP文件格式是Windows操作系统推荐和支持的标准图像文件格式,是一种将内存或显...

hjxu2016的博客 1万+

华为OD干了两个月,还是跑了

​本人工作了快13年,base南京。2024年2月份由于公司业务变动第一次拿到了公司发的大礼包,同时也面临着失业的问题,我对自己的技术还是很有信心的,但是,找了大概有一个多月时间,发现心意的工作的确不太好找,当然收到挺多家offer,就是薪资不太满意,外包也一直不想去,不过说实话外包给的薪资普遍要比自研的单位要高一些,最后为了钱还是进华为(既然选择外包那就选择好一些的吧),毕竟中年老男人工作不能断太久。

啊渊的专栏 1万+

[转]Visual C++中DIB位图编程

1. 基本概念  先来用通俗的语句讲解位图和调色板的概念。        我们知道,自然界中的所有颜色都可以由红、绿、蓝(R,G,B)三基色组合而成。针对含有红、绿、蓝色成分的多少,可以对其分别分成0~255个等级,而红、绿、蓝的不同组合共有256×256×256种,因此约能表示1600万种颜色。对于人眼而言,这已经是"真彩色"了。  对每个像素进行了(R,G,B)量化的图像就是位图,其在计算机中

37度专栏 2439

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

《工作笔记》 mfc 利用HBITMAP 和CBITMAP 显示位图文件

显示位图文件有n中方法:1 利用双缓冲技术;源码:void showBMP(){CString   str;      CString   filter="Bitmap    Files(*.bmp)|*.bmp|Wmf   Files(*.wmf)|*.wmf||";   CFileDialog   dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OF

uniquechao的专栏 2048

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

MFC中怎样读取一个JPG文件或BMP位图文件

方式一: 注意开始的时候要在对话框上设置Picture控件 ,ID=IDC_PHOTO,定义HBITMAP m_hPhotoBitmap为该对话框的数据成员void CTestDlg::OnPaint(){  CPaintDC dc(this);    CStatic *pStaic = (CStatic*)GetDlgItem(IDC_PHOTO);//获取ID为IDC_PHOTO控件的指针

zhangyulin54321的专栏 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Jessoat
博客等级 码龄17年 2粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值