BMP位图基础:通过UltraEdit解析BMP文件内部结构
初见位图
我们先打开画图随便画一幅图并采用24位bmp图像格式保存,就得到了一张24位真彩色的位图
BMP位图一般由4部分组成:文件头信息块、图像描述信息块、颜色表(在真彩色模式无颜色表)和图像数据区组成,以BMP为扩展名保存。
打开Windows的画图程序,在保存图像时,可以看到三个选项:2色位图(黑白)、16色位图、256色位图和24位位图。这是最普通的生成位图的工具,在这里讲解的BMP位图形式,主要就是指用画图生成的位图. 一般的bmp图像都是24位,也就是真彩。每8位为一字节,24位也就是使用三字节来存储每一个像素的信息,三个字节对应存放r,g,b三原色的数据每个字节的存贮范围都是0-255。那么以此类推,32位图即每像素存储r,g,b,a(Alpha通道,存储透明度)四种数据。8位图就是只有灰度这一种信息,还有二值图,它只有两种颜色,黑或者白。
接下来逐个分析BMP位图的各个组成部分
位图文件的基本结构
1.文件头信息块
文件信息头 (14字节)存储文件类型,文件大小等信息
// 文件信息头结构体
typedef struct tagBITMAPFILEHEADER
{unsigned short bfType;// 19778,必须是BM字符串,对应的十六进制为0x4d42,十进制为19778,否则不是bmp格式文件unsigned int bfSize; // 文件大小 以字节为单位(2-5字节)unsigned short bfReserved1; // 保留,必须设置为0 (6-7字节)unsigned short bfReserved2; // 保留,必须设置为0 (8-9字节)unsigned int bfOffBits; // 从文件头到像素数据的偏移 (10-13字节)
} BITMAPFILEHEADER;
2.图像描述信息块
图片信息头 (40字节)存储着图像的尺寸,颜色索引,位平面数等信息
//图像信息头结构体
typedef struct tagBITMAPINFOHEADER
{unsigned int biSize; // 此结构体的大小 (14-17字节)long biWidth; // 图像的宽 (18-21字节)long biHeight; // 图像的高 (22-25字节)unsigned short biPlanes; // 表示bmp图片的平面属,显然显示器只有一个平面,所以恒等于1 (26-27字节)unsigned short biBitCount; // 一像素所占的位数,一般为24 (28-29字节)unsigned int biCompression; // 说明图象数据压缩的类型,0为不压缩。 (30-33字节)unsigned int biSizeImage; // 像素数据所占大小, 这个值应该等于上面文件头结构中bfSize-bfOffBits (34-37字节)long biXPelsPerMeter; // 说明水平分辨率,用象素/米表示。一般为0 (38-41字节)long biYPelsPerMeter; // 说明垂直分辨率,用象素/米表示。一般为0 (42-45字节)unsigned int biClrUsed; // 说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)。 (46-49字节)unsigned int biClrImportant; // 说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。(50-53字节)
} BITMAPINFOHEADER;
3.颜色表
调色板 (由颜色索引数决定)(可以没有此信息,下面的例子就因为采用了24位真彩色保存所以没有这部分信息)
//24位图像素信息结构体,即调色板
typedef struct _PixelInfo {unsigned char rgbBlue; //该颜色的蓝色分量 (值范围为0-255)unsigned char rgbGreen; //该颜色的绿色分量 (值范围为0-255)unsigned char rgbRed; //该颜色的红色分量 (值范围为0-255)unsigned char rgbReserved;// 保留,必须为0
} PixelInfo;
4.图像数据区
位图数据 (由图像尺寸决定)每一个像素的信息在这里存储
颜色表接下来位为位图文件的图像数据区,在此部分记录着每点像素对应的颜色号,其记录方式也随颜色模式而定,既2色图像每点占1位(8位为1字节);16色图像每点占4位(半字节);256色图像每点占8位(1字节);真彩色图像每点占24位(3字节)。所以整个数据区的大小也会随之变化。究其规律而言,可的出如下计算公式:图像数据信息大小=(图像宽度 * 图像高度 * 记录像素的位数)/8。
具体例子
右键单击我们开头画的图片可以查看该图片的分辨率,宽度,高度和位深度。为1152 * 648像素。这是一张24位真彩色位图。1152 * 648 = 746496像素,746496像素 * 24位/像素 / (8 * 1024 * 1024)位 =2.13 MB,与显示的图片大小相符。
接下来用UltraEdit打开这张BMP图像,显示的是十六进制的代码
现在我们来读取这些代码,看看他们到底保存了一些啥东西。 在这里要注意的是
Windows的数据是倒着念的,这是PC电脑的特色。如果一段数据为42 4D,倒着念就是4D 42,即0x4D42。 因此,如果bfSize的数据为A2 1E 04 00,实际上就成了0x00041EA2,也就是0x41EA2。
参照上面的文件信息头结构体内容对这幅位图的内容进行分析。文件信息头结构体第一个数据是unsigned short(16位)类型的bfType变量。观察十六进制代码结果可以看到第一行开头的42 4D倒着念就是4D 42(刚好16位对应unsigned short类型),即bftype=0x4D42(转换为十进制为19778,实际上所有BMP图像的bfType对应属性都是这个值)。按照这个方法可得出第二个数据bfSize类型为unsigned int(32位),图中对应的十六进制代码为00222C36(转换为十进制为2239542),这代表文件大小为2239542字节=2.13MB,和我们在刚刚属性栏里的文件大小完全相等。
接下来利用类似的方法可以从十六进制代码中得到这张位图的文件头信息块和图像描述信息块所存储的信息
unsigned short bfType = 0x4D42 = 19778
unsigned int bfSize = 0x00222C36 = 2239542字节=269986/(1024*1024)=2.13MB
unsigned short bfReserved1 = 00 00
unsigned short bfReserved2 = 00 00
unsigned int bfOffBits = 0X00000036 = 0x36 = 54字节unsigned int biSize = 0x00000028 = 0x28 = 40字节(图像信息头结构体大小就是40字节)
long biWidth = 0x00000480 = 0x480 = 1152像素;
long biHeight = 0x00000288 = 0x288 = 648像素 ;
unsigned short biPlanes = 0x0001 = 0x1 = 1;
unsigned short biBitCount = 0x0018 = 0x18 = 24位;
unsigned int biCompression = 0x00000000 = 0;
unsigned int biSizeImage = 0x00222C00 = 0;(等于bfSize-bfOffBits)
long biXPelsPerMeter = 0x00000000 = 0;
long biYPelsPerMeter = 0x00000000 = 0;
unsigned int biClrUsed = 0x00000000 = 0;
unsigned int biClrImportant = 0x00000000 = 0;/*因为采用了24位真彩色格式保存,所以没有颜色表信息。紧跟着上述文件头信息块和图像
描述信息块存储的信息的就是图像数据区的信息。每一个像素为24位,即3字节,例如紧跟着
的FFFFFF这三个字节就代表白色*/
BMP位图基础:通过UltraEdit解析BMP文件内部结构相关推荐
- 用c语言处理bmp开运算,c语言解析bmp图片
心血来潮想了解下常用图片的格式解析,翻看了一些资料后,发现最简单的是bmp格式,所以先拿它开刀. BMP格式 这种格式内的数据分为三到四个部分,依次是: 文件信息头 (14字节)存储着文件类型,文件大 ...
- Python基础day07 作业解析【文件操作(文件读写、文件夹操作)】
视频.源码.课件.软件.笔记:超全面Python基础入门教程[十天课程]博客笔记汇总表[黑马程序员] Python基础day07[文件读写.文件夹操作.面向对象(类.对象)] 目录 加强训练 题目1 ...
- c++读取8位和24位BMP位图数据 俺的作业
家人萌 我因为这个作业爆炸了好多天...所以我想发一下 菜鸡一个 别骂别骂 欢迎指正 关于这个作业要先了解一下这些登西... 1)BMP 位图的结构 1.BMP文件头(14字节) ,文件的第0字节到 ...
- 图解Winhex解析BMP文件数据实例
一 实例解析 示例图片的属性: 原图: 红线处是文件头结束: 第二个红线处是位图信息头结束: 用windows画图取第(2,2)像素点的颜色:画图是从0开始计数,即第3行3列的像素: 搜索16进制的B ...
- 将HBITMAP转换成BMP位图文件的各个部分,可以在1BIT,4BIT,8BIT,16BIT,24BIT,32BIT之间转换
VC将HBITMAP转换成BMP位图文件的各个部分,可以在1BIT,4BIT,8BIT,16BIT,24BIT,32BIT之间转换 http://blog.ednchina.com/wxleasyla ...
- 写入数据到bmp位图文件(C语言)
在上一篇文章 读取bmp格式位图文件到二维数组(C语言) 中已经实现了读取24bits Bmp位图文件到二维数组的过程. 这次接着上一次的工作,试着用C语言将数据写入位图文件中. 基本原理和读取文 ...
- C++ 处理HBITMAP类型的.bmp位图文件, 代码工具
1. 存储为HBITMAP类型的.bmp位图文件 参考:C++保存HBITMAP为位图文件的实现方法(IT技术) (qb5200.com) ImageHelper.h #pragma once#in ...
- Python解析bmp文件代码实现
class bmp:def __init__(self, tp):self.tag = tp[0] #标签self.fileSize = tp[1] #文件大小self.rgbOffset = tp[ ...
- 浅析BMP位图文件结构(含Demo)[转]
<!--done--> 关于BMP位图格式在网上可以找到比较详细的相关文档,有兴趣的可以搜索标题为"BMP文件结构的探索"的文章,可以在搜索结果中找到一个WORD文 ...
最新文章
- left4dead2 常用配置
- 《JavaScript设计模式与开发实践》阅读摘要
- 你连原理都还没弄明白?java文档注释快捷键idea
- mini6410移植--uboot移植(2)
- MemoryStream的一些问题
- puts遇到空格无法输出_输入一句英文,只包含字母和空格,如何输出这句英文中.....-黑马程序员技术交流社区...
- java.lang.NoClassDefFoundError: hudson/tasks/Mailer$UserProperty
- EasyRecovery如何恢复CMake项目文件
- android腾讯微博吹一吹实现原理
- labview软件介绍
- php评论表情包怎么引入,WordPress中添加自定义评论表情包的方法
- 记公司同事的一次集体活动
- 统计java代码行数_统计项目代码行数
- 联想小新V1070-FXSE(FX版)怎么重装系统教程
- 进销存管理系统大全【70个进销存系统】
- 年度榜单!我整理了2020年优质的Python文章和资源。
- w ndows10输入法设置,unity3d屏蔽Windows10输入法
- python使用excel数据分析统计服_像Excel一样使用python进行数据分析
- 教你如何轻松解密Md5密码
- 在mac上安装md5命令
热门文章
- html中table表格分页,纯JS实现表格分页
- 同个局域网内的A,B两个电脑主机,A能PING通B电脑,B无法PING通A 电脑,双方均能学习到对方ARP地址
- Android一个通用的下拉框适配器(kotlin版本)
- 曲形文字识别 - Transformer-based Convolutional-Attention Network for Irregular Text Recognition
- 第二十九章 使用系统监视器 - 应用程序监视器指标
- 2014迅雷校园招聘(C++)(笔试题(四)
- ENet: A Deep Neural Network Architecture for Real-Time Semantic Segmentation
- Oracle中同义词的研究
- 开发旺旺群发软件,难点及重要技术点分析(一)
- OpenStack硬件管理加速利器:Cyborg