文章目录
- 参考资料
- Bitmap图片结构
- Bitmap图片组成
- 实例说明
参考资料
- 微软官方-位图存储
Bitmap图片结构
序号 | 名称 | 说明 |
---|---|---|
1 | Bitmap File Header | Bitmap文件头 |
2 | Bitmap Info Header | Bitmap信息头 |
3 | Color Palette Data | 调色板数据 |
4 | Bitmap Image Data | 图像数据 |
说明
- Bitmap文件头的大小为14字节
- Bitmap信息头的大小为40字节
- 调色板数据的大小为4的整数倍
- 可以没有没调色板
Bitmap图片组成
/* 位图文件头 */
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 | 该区域大小取决于压缩方式,包含图像所有数据,颜色数量和调色板索引 |
- 像素位数(PixelsBits)
PixelsBits = 1, 表示图像最多有两种颜色, 黑色和白色
PixelsBits = 4, 表示图像最多有16种颜色, 每个像素用4位表示
PixelsBits = 8, 表示图像最多有256种颜色,每个像素用8位表示
PixelsBits = 24,表示图像最多有16777216种颜色,每3个字节代表一个像素,颜色由RGB相对强度决定
- 压缩类型(CompresType)
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
- 图像数据偏移地址(ImgDataOffset)的计算
//图像数据偏移地址 = 位图文件头 + 位图信息头 + (调色板大小 * 4)
ImgDataOffset = sizeof(BitMapFileHeader_TypeDef) + sizeof(BitMapInfoHeader_TypeDef) + (ColorPalette * 4)= 54 + (ColorPalette * 4)
- 图像数据大小(ImgDataSize)的计算
//图像数据大小 = 文件大小 - 位图文件头 - 位图信息头 - (调色板大小 * 4)
ImgDataSize = FileSize - sizeof(BitMapFileHeader_TypeDef) - sizeof(BitMapInfoHeader_TypeDef) - (ColorPalette * 4)= FileSize - 54 - (ColorPalette * 4)
- 图像数据(ImgData)
BI_RLE8编码 : 每个像素由8位RLE压缩编码,有编码方式和绝对方式两种压缩
编码方式 : 由2字节组成,Byte0表示使用相同颜色的像素数目,Byte1表示调色板索引,其中Byte0=1~255
当Byte0=0Byte1=0行结束Byte1=1图像结束Byte1=2其后两字节表示下一个像素从当前位置水平和垂直的偏移量绝对方式 : Byte0=0,Byte1=3~255后面单个像素的数量,Byte2~Bytex单个像素的调色板索引
BI_RLE4编码 : 每个像素由4位RLE压缩编码,有编码方式和绝对方式两种压缩
编码方式 : 由2个字节组成,第一个字节指定像素数目,第二个字节包含两种颜色索引,一个在高四位,另一个在低四位。
第1个像素使用高四位颜色索引,第2个像素使用低四位颜色索引,第3个像素使用高四位颜色索引,以此类推。绝对方式 : 第一个字节为0,第二个字节包含有颜色索引数,其后续字节包含颜色索引,颜色索引存放在该字节的高低4位中,一个颜色对应一个索引。第二个字节为0,行结束第二个字节为1,图像结束第二个字节为2,其后两个字节表示下一个像素从当前开始水平和垂直位置的偏移量。
说明
- 文件大小可能和右键属性显示的大小不一致需验证,以属性中大小为准
- 必须保证图像宽度、高度、调色板大小正确
- 图像数据大小可能出错
实例说明
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对齐使用 |
说明
- 图像宽度为: 1A + 01 + 13 + 05 + 13 + 01 + 1A = 97(像素)
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 |
说明
- 图像宽度为: 28 + 04 + 09 + 04 + 28 = 97(像素)