BMP图片文件原始数据分析

【参考】原文链接:https://blog.csdn.net/liu2921603708/article/details/124887415
https://blog.csdn.net/wkd_007/article/details/128214157

一、BMP格式
BMP取自位图Bitmap的缩写,也称为DIB(与设备无关的位图),是一种 独立于显示器的位图数字图像文件格式。
数据是没有经过压缩的,bmp格式文件大小一般比压缩过的(jpeg,png等)大。
按照像素深度分类可以分为:1bit位图(2色)、4bit位图(16色)、8bit位图(256色)、16bit位图(65536色-高彩色)、24bit位图(1670万色-真彩色)、32bit位图(1670万色-增强型真彩色)。本文图片数据分析只适用于16bit位图、24bit位图和32bit位图。
BMP文件数据由两个部分组成:头部54字节 + 图像数据。

二、颜色数据表示方法
采用三基色(红R,绿G,蓝B)构成像素的色彩值,通常每个基色占一个字节(十进制 0-255表示,十六进制0x00-0xFF表示)。
注意BMP文件数据存储是小端模式
(1)RGB8888(32位),每个像素点颜色数据使用4个字节表示
请添加图片描述

(2)RGB888(24位),每个像素点颜色数据使用3个字节表示
请添加图片描述

(3)RGB565(16位),每个像素点颜色数据使用2个字节表示,去掉了低位:R0,R1,R2 G0,G1 B0,B1,B2
请添加图片描述
16位的BMP文件实际存储是RGB555或RGB565格式。Photoshop软件保存16位的BMP文件时有几种格式可选。
请添加图片描述

三、BMP头部54字节含义说明
54 bytes = 位图文件头 Bitmap File Header (14 bytes) + 位图信息数据头 Bitmap Information Header (40 bytes)
下面表格中位置代表存储地址(头部54字节地址为:0x00~0x35),尺寸代表占用字节数。
请添加图片描述
请添加图片描述

四、BMP图片数据分析
用windows自带画图工具,画一张50(宽)x16(高)的BMP图片,填充红绿蓝灰4个颜色,每个颜色4个像素高度,保存成24位位图格式。
请添加图片描述请添加图片描述

红色数据:0xFF5566
请添加图片描述

绿色数据:0x33FF44
请添加图片描述

蓝色数据:0x1122FF
请添加图片描述

灰色数据:0xC1C2C3
请添加图片描述

(1)头部54字节分析
使用Winhex工具打开保存的BMP图片,查看开始的54字节数据(小端模式)。
位置0x02(文件大小):0x000009B6(2486字节)
位置0x0A(图片信息开始位置):0x00000036
位置0x12(图像宽度):0x00000032(50像素)
位置0x16(图像高度):0x00000010(16像素)
位置0x1C(每个像素用多少bit表示):0x0018(24位,3个字节)
位置0x22(位图数据大小):0x00000980(2432字节)
请添加图片描述

(2)图像数据
BMP图像数据存储方式是从左到右,从下到上,小端序(低地址存放低位数据,高地址存放高位数据)存储的。
所以数据出现的顺序为:
灰色数据0xC1C2C3
蓝色数据0x1122FF
绿色数据0x33FF44
红色数据0xFF5566
根据头部信息可知0x00000036为图片信息开始位置,第1个像素点的颜色为0xC1C2C3(灰色,24位位图每个像素使用3个字节表示)。
位图每行的数据(字节)都需要是 4 的倍数。不可避免地,有些时候每行的结尾就会出现补零(其实补其他任意数字也是可以的,但常见都是补 0)。
我们创建的图片宽度为50像素,理论上每行数据长度为150字节(150=50像素x3字节)。但是150不是4的倍数,所以每行数据结尾要补2个字节(2=150%4),实际上每行数据长度为152字节。
由此可计算位图数据大小:152x16(高度)=2432字节
整个图片文件大小:2432+54(头部字节)=2486字节

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

五、总结
分析一个BMP文件需要注意以下几点:
(1)BMP文件数据存储是小端模式
(2)BMP文件数据由两个部分组成:头部54字节+图像数据
(3)每个像素点颜色数据使用多少bit表示
(4)图像数据存储方式是从左到右,从下到上,小端模式
(5)每行的数据(字节)都需要是 4 的倍数,否则每行数据结尾会出现补零

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值