Bitmap(BMP)图像信息分析主要说明带压缩的形式

文章目录

参考资料

  1. 微软官方-位图存储

Bitmap图片结构

序号 名称 说明
1 Bitmap File Header Bitmap文件头
2 Bitmap Info Header Bitmap信息头
3 Color Palette Data 调色板数据
4 Bitmap Image Data 图像数据

说明

  1. Bitmap文件头的大小为14字节
  2. Bitmap信息头的大小为40字节
  3. 调色板数据的大小为4的整数倍
  4. 可以没有没调色板

Bitmap图片组成

C 复制代码
/* 位图文件头 */
typedef struct
{
    u16 FileType;       /* 文件类型标记 */
    u32 FileSize;       /* 文件大小 */
    u16 Reserve1;       /* 保留1 */
    u16 Reserve2;       /* 保留2 */
    u32 ImgDataOffset;  /* 图像数据偏移 */
}BitMapFileHeader_TypeDef, * pBitMapFileHeader_TypeDef;

/* 位图信息头 */
typedef struct
{
    u32 InfoHeaderSize; /* 信息头大小 */
    u32 ImgWidth;       /* 图像宽度 */
    u32 ImgHeight;      /* 图像高度 */
    u16 ColorPlanes;    /* 颜色平面数 */
    u16 PixelsBits;     /* 像素位数 */
    u32 CompresType;    /* 压缩类型 */
    u32 ImgDataSize;    /* 图像数据大小 */
    u32 HorResolut;     /* 水平分辨率 */
    u32 VerResolut;     /* 垂直分辨率 */
    u32 ColorPalette;   /* 调色板大小 */
    u32 ColorImportant; /* 重要颜色数 */
}BitMapInfoHeader_TypeDef, * pBitMapInfoHeader_TypeDef;
序号 地址范围 名称 大小(Byte) 说明
1 0000~0001 文件标识 2 文件类别标识符,Windows下为"BM"
2 0002~0005 文件大小 4 整个文件的大小,单位字节
3 0006~0007 保留1 2 保留1,默认为0
4 0008~0009 保留2 2 保留2,默认为0
5 000A~000D 图像数据偏移地址 4 从文件开始到图像数据的偏移
6 000E~0011 信息头大小 4 位图信息头大小,Windows下为40
7 0012~0015 图像宽度 4 图像宽度,单位像素
8 0016~0019 图像高度 4 图像高度,单位像素
9 001A~001B 颜色平面数 2 目标设备的平面数,必须为1
10 001C~001D 像素位数 2 每像素的位数,必须为1、2、4、8、24、32
11 001E~0021 压缩类型 4 压缩类型,必须为0、1、2、3
12 0022~0025 图像数据大小 4 整个图像数据大小,单位字节,必须为4的倍数
13 0026~0029 水平分辨率 4 图像水平分辨率,单位像素/米
14 002A~002D 垂直分辨率 4 图像垂直分辨率,单位像素/米
15 002E~0031 调色板大小 4 色彩表中颜色的索引数,有压缩才有调色板
16 0032~0035 重要颜色数 4 有压缩时与调色板大小相等,0表示都重要
17 0036~00xx 调色板数据 4 * N 调色板规范,每项用四字节ARGB表示,Byte0蓝色,Byte1绿色分量,Byte2红色分量,Byte3填充符(设置为0)
18 00mm~00nn 图像数据 N 该区域大小取决于压缩方式,包含图像所有数据,颜色数量和调色板索引

C 复制代码
PixelsBits = 1,  表示图像最多有两种颜色, 黑色和白色
PixelsBits = 4, 表示图像最多有16种颜色, 每个像素用4位表示
PixelsBits = 8, 表示图像最多有256种颜色,每个像素用8位表示
PixelsBits = 24,表示图像最多有16777216种颜色,每3个字节代表一个像素,颜色由RGB相对强度决定
C 复制代码
CompresType = 0 , 不压缩,BI_RGB
CompresType = 1 , BI_RLE4, RLE 8-bit / pixel
CompresType = 2 , BI_RLE8, RLE 4-bit / pixel
CompresType = 3 , BI_BITFIELDS, Bitfields 
C 复制代码
//图像数据偏移地址 = 位图文件头 + 位图信息头 + (调色板大小 * 4)
ImgDataOffset = sizeof(BitMapFileHeader_TypeDef) + sizeof(BitMapInfoHeader_TypeDef) + (ColorPalette * 4)
              = 54 + (ColorPalette * 4)
C 复制代码
//图像数据大小 = 文件大小 - 位图文件头 - 位图信息头 - (调色板大小 * 4)
ImgDataSize = FileSize - sizeof(BitMapFileHeader_TypeDef) - sizeof(BitMapInfoHeader_TypeDef) - (ColorPalette * 4)
            = FileSize - 54 - (ColorPalette * 4)

BI_RLE8编码 : 每个像素由8位RLE压缩编码,有编码方式绝对方式两种压缩

C 复制代码
编码方式 : 由2字节组成,Byte0表示使用相同颜色的像素数目,Byte1表示调色板索引,其中Byte0=1~255
当Byte0=0
    Byte1=0行结束
    Byte1=1图像结束
    Byte1=2其后两字节表示下一个像素从当前位置水平和垂直的偏移量

绝对方式 : Byte0=0,Byte1=3~255后面单个像素的数量,Byte2~Bytex单个像素的调色板索引

BI_RLE4编码 : 每个像素由4位RLE压缩编码,有编码方式绝对方式两种压缩

C 复制代码
编码方式 : 由2个字节组成,第一个字节指定像素数目,第二个字节包含两种颜色索引,一个在高四位,另一个在低四位。
第1个像素使用高四位颜色索引,第2个像素使用低四位颜色索引,第3个像素使用高四位颜色索引,以此类推。

绝对方式 : 第一个字节为0,第二个字节包含有颜色索引数,其后续字节包含颜色索引,颜色索引存放在该字节的高低4位中,一个颜色对应一个索引。
	第二个字节为0,行结束
	第二个字节为1,图像结束
	第二个字节为2,其后两个字节表示下一个像素从当前开始水平和垂直位置的偏移量。
	

说明

  1. 文件大小 可能和右键属性显示的大小不一致需验证,以属性中大小为准
  2. 必须保证图像宽度、高度、调色板大小正确
  3. 图像数据大小可能出错

实例说明

C 复制代码
00 00 1A BB 01 AD 13 09 00 05 70 BB BB BB 70 00 13 09 01 AD 1A BB 00 00

//分离后实际效果
00 00 
1A BB 
01 AD 
13 09 
00 05 70 BB BB BB 70 00 
13 09 
01 AD 
1A BB 
00 00
数据 说明
00 00 行结束
1A BB 使用相同颜色的像素数目为1A,调色板索引为BB
01 AD 使用相同颜色的像素数目为01,调色板索引为13
13 09 使用相同颜色的像素数目为13,调色板索引为09
00 05 70 BB BB BB 70 00 单个像素的数量为05,其调色板索引分别为70 BB BB BB 70,00对齐使用

说明

  1. 图像宽度为: 1A + 01 + 13 + 05 + 13 + 01 + 1A = 97(像素)
C 复制代码
00 00 28 BB 00 04 A6 A7 52 25 09 09 00 04 25 52 A7 A6 28 BB 00 00

//分离后实际效果
00 00 
28 BB 
00 04 A6 A7 52 25 
09 09 
00 04 25 52 A7 A6 
28 BB 
00 00
数据 说明
00 00 行结束
28 BB 使用相同颜色的像素数目为28,调色板索引为BB
00 04 A6 A7 52 25 单个像素的数量为04,其调色板索引分别为04 A6 A7 52 25
09 09 使用相同颜色的像素数目为09,调色板索引为09

说明

  1. 图像宽度为: 28 + 04 + 09 + 04 + 28 = 97(像素)
相关推荐
宁静致远202114 分钟前
Ubuntu下的Doxygen+VScode实现C/C++接口文档自动生成
c++·vscode·ubuntu
Bluesonli19 分钟前
第 2 天:创建你的第一个 UE5 C++ 项目!
c++·学习·ue5·虚幻·虚幻引擎·unreal engine
比特在路上41 分钟前
蓝桥杯之c++入门(四)【循环】
c++·职场和发展·蓝桥杯
pay顿1 小时前
C++基础day1
c++·学习·笔试
孤寂码农_defector1 小时前
C++【iostream】数据库的部分函数功能介绍
c++
Icomi_1 小时前
【PyTorch】7.自动微分模块:开启神经网络 “进化之门” 的魔法钥匙
c语言·c++·人工智能·pytorch·python·机器学习·计算机视觉
余辉zmh1 小时前
【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(二)
c++·算法·leetcode·贪心算法
余辉zmh2 小时前
【贪心算法篇】:“贪心”之旅--算法练习题中的智慧与策略(一)
c++·算法·leetcode·贪心算法
taoyong0012 小时前
代码随想录算法训练营第三十七天-动态规划-完全背包-377. 组合总和 Ⅳ
c++·算法·leetcode·动态规划
2401_843785232 小时前
STM32 PWM驱动舵机
stm32·单片机·嵌入式硬件