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(像素)
相关推荐
apcipot_rain14 小时前
C++转Java日记(03)
java·开发语言·c++
布莱克60514 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
xys_67814 小时前
深挖C++:类和对象(中)
开发语言·c++
河北乐讯通物联网服务商16 小时前
航油管理终端:机场里每架飞机加了什么油、加了多少,是怎么实时算清楚的?
物联网·物联网卡·航油管理终端
D e re k ZH17 小时前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
xiaoye-duck18 小时前
《C++ 项目:手写大模型接入 SDK》Ollama接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
lzj_pxxw18 小时前
STM32移植FreeRTOS(Cmake+CubeMX)
vscode·stm32·嵌入式硬件
zaizai100718 小时前
【Effective Modern C++】学习第一章
c++
数字新视界18 小时前
信创机房动环监控技术在提升数据中心管理效率中的应用与前景分析
物联网·数据中心·数据中心基础设施管理·dcim管理系统·数据中心dcim
Zwawa19 小时前
屏幕不止一种:OLED、LCD1602字符屏、TFT/IPS图形屏和串口屏怎么用,这与TTY和PTY又有什么关系
c语言·单片机·嵌入式