BMP文件数据从文件头开始先后分为四个部分
bmp文件头:提供文件的格式、大小等信息
struct bitmap_fileheader {
unsigned short type; //表示位图类型
unsigned int size; //4字节 表示文件的大小,单位是字节
unsigned short reserved1; //2字节 这个是保留的,为0
unsigned short reserved2; //2字节 这个也是保留的,为0
unsigned int off_bits; //4字节 文件开始到实际图像数据之间的字节偏移量
} __attribute__ ((packed));
选个别做解释,其他可以看注释:
type 位图的类型,bmp图片应为0x424d,对应的ASCII码为BM
reserved1和reserved2 是两个16位的保留数据为,必须为0
off_bits 说明从文件头到实际的图像数据之间的字节偏移量,这个参数是非常有用的,因为位图信息头和调色板的长度会根据不同的情况而变化,所以我们可以根据这个偏移量迅速从文件中读到数据
位图信息头:提供图像数据的尺寸、位平面图、压缩方式、颜色索引等
struct bitmap_infoheader {
unsigned int size; //4字节 表示位图文件信息头结构体的大小(单位是字节)
int width; //4字节 表示位图文件的宽度(像素)
int height; //4字节 表示位图文件的高度(像素)
unsigned short planes; //2字节 恒为1
unsigned short bit_count; //2字节 每个像素占用的位数即bpp(像素位数),反映颜色的丰富程度
unsigned int compression; //4字节 文件压缩方式
unsigned int size_image; //4字节 表示图像的大小,当没有压缩的时候,这个值可以为0
int xpels_per_meter;//4字节 表示水平分辨率
int ypels_per_meter;//4字节 表示垂直分辨率
unsigned int clr_used; //4字节 表示彩色表中的颜色索引数目
unsigned int clr_important; //4字节 表示有重要影响到颜色索引数目
} __attribute__ ((packed));
选个别做解释,其他可以看注释:
width 位图的文件的宽度,以像素为单位,可以为负值
height 位图的高度,以像素为单位,可以为负值
bit_count 说明比特数/像素,每个像素占用的位数,其值位1、4、8、16、24或32
compression 图像数据的压缩方式,取值范围是0、1、2、3等
- 0 – RGB方式
- 1 – 8bpp的run-length-encoding方式
- 2 – 4bpp的run-length-encoding方式
- 3 – bit-fields方式
size_image 图像的大小=width x height
clr_important 有重要影响到颜色索引数目(不太理解,如果大家有理解的可以告知)
调色板:可选、如使用索引来表示图像
它在文件中的布局就像一个二维数组palette[N][4],其中N表示总的颜色索引数,每行的四个元素分别表示该索引对应的B、G、R和Alpha的值,每个分量占一个字节。如不设透明通道时,Alpha为0。
clr_used即为N,表示索引的个数
bit_count用来表示每个像素的位数,如bit_count = 1时,在位图数据处取的每1bit都是一个像素点,然后再用这个值去调色板进行像素色彩的索引,即只有两种色彩,再举一个例子bit_count = 8时,在位图数据处取的每8bit都是一个像素点,然后再用这个值去调色板进行像素色彩的索引,即最多显示256种色彩
注:当图像中引用的色彩超过256种时,我们就需要16bpp或更高bpp的位图。调色板不适合bpp较大的位图,因此16bpp以上的位图都不使用调色板。不使用调色板的位图图像有两种编码格式:RGB和Bit-Fields。
位图数据:图像数据
图像数据块从头文件中起始偏移量字段所指出的位置开始,其中存放着位图图像的数据,数据格式由图像参数信息块中的压缩方式选项取值决定。操作图像数据块时,有一些注意事项:
当压缩方式为RGB时,图像数据块以“行”为单位双字对齐。例如一张宽度为5像素的8bpp的图像,其实际使用的存储空间是每行8个字节。又如一幅4bpp、宽度为5像素的位图图像,其实际使用的存储空间是每行4个字节。
当bpp < 8时,每个字节将存放多个像素的色彩索引,则先出现的像素存放在高位中。例如某4bpp图像第一行像素的顺序是red, green, blue, yellow, …则图像数据块中第一个字节的高4位值为red,低4位值为green;第二字节高4位值为blue,低4位值为yellow。1bpp时的情况以此类推。
注:文件存储的大小端问题
参考文章:https://www.cnblogs.com/wainiwann/p/7086844.html
https://blog.csdn.net/weixin_30687587/article/details/95389442