BMP格式详解
BMP格式详解
BMP格式
BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。
BMP格式的图像,其优点是不采用任何压缩,无损并且颜色准确,有2色、16色、256色、真彩色各种选择;缺点就是文件占用的空间很大,不支持文件压缩,不适用于 Web 页,不受 Web 浏览器支持。
格式:
- 文件头(bmp file header):共14字节
- 位图信息头(bitmap infomation):共40字节
- 调色板(color palette):可选
- 位图数据
24位图:每个像素颜色信息用24位来表示,也就是说每一个颜色用字节(8位)来表示。
除了24位图,还有1位(单色)、2位(4色,CGA)、4位(16色,VGA)、8位(256色)、16位(增强色)、24位(真彩色)和32位等。
bmp文件头(bmp file header)包含信息(14字节):
- bfType:2字节,文件类型
- bfSize:4字节,文件大小
- bfReserved1:2字节,保留,0
- bfReserved2:2字节,保留,0
- bfOffBits:4字节,从头到位图数据的偏移
位图信息头(40字节),包含如下内容:
- biSize:4字节,信息头的大小,即40;
- biWidth:4字节,以像素为单位说明图像的宽度;
- biHeight:4字节,以像素为单位说明图像的高度,同时如果为正,说明位图倒立(即数据表示从图像的左下角到右上角),如果为负说明正向;
- biPlanes:2字节,为目标设备说明颜色平面数,总被设置为1;
- biBitCount:2字节,说明比特数/像素数,值有1、2、4、8、16、24、32;
- biCompression:4字节,说明图像的压缩类型,最常用的就是0(BI_RGB),表示不压缩;
- biSizeImages:4字节,说明位图数据的大小,当用BI_RGB格式时,可以设置为0;
- biXPelsPerMeter:表示水平分辨率,单位是像素/米,有符号整数;
- biYPelsPerMeter:表示垂直分辨率,单位是像素/米,有符号整数;
- biClrUsed:说明位图使用的调色板中的颜色索引数,为0说明使用所有;
- biClrImportant:说明对图像显示有重要影响的颜色索引数,为0说明都重要;
调色板(Color Palette):
调色板是可选的,不过这里的8位色图有调色板。那么接下来的数据就是调色板了。调色板就是一个颜色的索引,这里是8位色图,一共有256中颜色,由于每个颜色都有RGB三原色,也就是要3个字节表示,这样的话256个颜色就不能表示所有的颜色,所以就需要一个索引,用一个字节的索引指向4个字节表示的颜色(RGB加上Alpha值)。如果把这4个字节表示为一个Color类型,那么调色板就是Color的数组。由于Color类型也是一个数组,调色板就像一个二维数组palette[N][4],其中N是颜色的数量,这里就是256。因此,这个例子中的调色板的大小就是256x4=1024字节,在调色板之前,有14字节的bmp文件头,40字节的位图信息头,加上1024字节的调色板,一共1078字节,也就是说真正的图像数据前面有1078字节,这和bmp文件头中的bfOffBits相符,验证了我们的讨论。
数据区
当使用调色板时:
- 若小于8,每个字节将存放多个像素,先出现的放在高位
- 如单色(1位)图像:每个字节每位记录一个颜色,一个字节可记录8个像素。不足4字节时 补足字节
不用调色板 :
- 24位真彩色没有调色板,直接在数据区记录rgb数据。
- 32位,记录rgba数据