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(像素)
相关推荐
Vesan,4 分钟前
无人机飞控运行在stm32上的RTOS实时操作系统上,而不是linux这种非实时操作系统的必要性
linux·stm32·无人机
嘿,二极管22 分钟前
硬件工程师面试常见问题(4)
单片机·嵌入式硬件
点云SLAM31 分钟前
C++中的算术转换、其他隐式类型转换和显示转换详解
c++·static_cast·dynamic_cast·c++中的类型转换·算术类型转换·其他隐式类型转换·显示类型转换
哄娃睡觉43 分钟前
独立ADC和MCU中ADC模块的区别
stm32
易知嵌入式小菜鸡1 小时前
STM32CubeMX-H7-15-SPI通信协议读写W25Q64
stm32·嵌入式硬件·fpga开发
Zfox_1 小时前
Git 进阶之路:高效协作之分支管理
大数据·linux·运维·c++·git·elasticsearch
wenchm1 小时前
细说STM32单片机FreeRTOS任务管理API函数vTaskList()的使用方法
c语言·c++·stm32·单片机·嵌入式硬件
wuqingshun3141591 小时前
蓝桥杯 10.拉马车
数据结构·c++·算法·职场和发展·蓝桥杯·深度优先
衫水2 小时前
EMQX安装使用和客户端认证
物联网
不是仙人的闲人2 小时前
算法之动态规划
数据结构·c++·算法·动态规划