Bmp 图片格式学习和拆分

来源:互联网 发布:淘宝支付宝登录 编辑:程序博客网 时间:2024/05/17 08:31

文件格式

典型的BMP图像文件由四部分组成。

1. 位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;

2. 位图信息结构体,它包含有BMP图像的宽、高、压缩方法以及定义颜色等信息;

3. 调色板,这部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24 bits的BMP)就不需要调色板。

4. 位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其它小于24位的使用调色板中颜色所引用值。


在默认字节对齐方式下,这样读取BMP图像会出现错误。由于系统默认情况下,结构体以4字节对齐,这样,对于结构体中不够4字节的字段,会自动填充,使得其也占据4个字节。对于像BMP图像这样采用1字节保存的文件,读取就会出错。


位图文件主要分为如下4个部分:

块名称  对应Windows结构体定义大小(Byte)

文件信息头BITMAPFILEHEADER14

位图信息头BITMAPINFOHEADER40

颜色表(调色板)RGBQUAD(option)

位图数据(RGB颜色阵列)BYTE* 由图像长宽尺寸决定


BITMAPFILEHEADER 中的重点参数说明:

bfOffBits  表示从文件头开始到实际的图像数据之间的字节的偏移量。

BITMAPINFOHEADER中的重点参数说明:

biHeight 表示图像的高度,以像素为单位。这个值除了用于描述图像的高度之外,它还有另一个用处,就是指明该图像是倒向的位图,还是正向的位图。


Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充。


图像真正的数据,比如一张图像的大小为800*600,则该部分数据的长度就应该是800*600像素,也即800*600*24/8字节(如果是24位的图片,即一个像素用24bit来存储,每个像素点上有3个字节,分别用来表示b, g, r的颜色)。

在Windows下,RGB颜色阵列存储的格式其实是BGR。对32为的RGB位图像素数据是BGRA。A表示透明通道Alpha通道,该值是该像素点的透明属性,取值在0(不透明)到255(不透明)之间。对于24位的图像来说,因为没有Alpha通道,故整个图像都不透明。


字节对齐:

位图数据记录了位图的每一个像素值,记录顺序是:扫描行内是从左到右,扫描行之间是从下到上。且Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充,所以向文件中写入的位图数据的大小应该为:

每行图像的字节数: bmppitch = ((biWidth * bitCountPerPix + 31) >> 5) << 2;

biWidth --- 图像的宽度,bitCountPerPix --- 图像的位数