bmp图片格式解析

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值