BMP文件格式分析

BMP取自位图Bitmap的缩写,也称为DIB(与设备无关的位图),是一种独立于显示器的位图数字图像文件格式。图像通常保存的颜色深度有2(1位)、16(4位)、256(8位)、65536(16位)和1670万(24位)种颜色(其中位是表示每点所用的数据位)。表示透明的alpha通道也可以保存在一个类似于灰阶图像的独立文件中。带有集成的alpha通道的32位版本已经随着Windows XP出现,它在视窗的登录和主题系统中都有使用。

1. 常见的文件组成

  • 位图文件头(14字节)
  • DIB头(有7个版本,windows系统下一般认为是40字节)
  • 调色板(不一定有,由每个像素的占位数决定,后面会说明)
  • 位图数据

2. 位图文件头

  • bfType:2字节,文件类型,BMP格式的文件这两个字节是0x4D42,字符显示就是’BM’;
  • bfSize:4字节,文件大小;
  • bfReserved1:2字节,保留,必须设置为0;
  • bfReserved2:2字节,保留,必须设置为0;
  • bfOffBits:4字节,从文件头到位图数据的偏移;

3. DIB头

  • 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说明都重要;

4. 调色板
无论是磁盘上的位图文件还是内存中的位图图像,像素都由一组位(英语:bit)表示。

  • 每像素占1位(色深为1位,1bpp)的格式支持2种不同颜色。像素值直接对应一个位的值,最左像素对应第一个字节的最高位。使用该位的值用来对色表的索引:为0表示色表中的第一项,为1表示色表中的第二项(即最后一项)。
  • 每像素占2位(色深为2位,2bpp)的格式支持4种不同颜色。每个字节对应4个像素,最左像素为最高的两位(仅在Windows CE中有效)。需要使用像素值来对一张含有4个颜色值的色表进行索引。
  • 每像素占4位(色深为4位,4bpp)的格式支持16种不同的颜色。每个字节对应2个像素,最左像素为最高的四位。需要使用像素值来对一张含有16个颜色值的色表进行索引。
  • 每像素占8位(色深为8位,8bpp)的格式支持256种不同的颜色。每个字节对应1个像素。需要使用像素值来对一张含有256个颜色值的色表进行索引。
  • 每像素占16位(色深为16位,16bpp)的格式支持65536种不同的颜色,每2个字节(byte)对应一个像素。该像素的不透明度(英语:alpha)、红、绿、蓝采样值即存储在该2个字节中。
  • 每像素占24位(色深为24位,24bpp)的格式支持16777216种不同的颜色,每3个字节对应一个像素。
  • 每像素占32位(色深为32位,32bpp)的格式支持4294967296种不同的颜色,每4个字节对应一个像素。

下面以8位色图为例说明什么是调色板:
调色板相当于一个颜色索引,或者说颜色数组,通过下标(位图数据中每个像素占8位,可理解为下标)找到对应的颜色。数组中每个元素表示一种颜色,包含4个字节,其中三个表示蓝色、绿色和红色的强度(0~255),第四个字节大多数应用程序没有使用将它设0(可用于保存Alpha值)。8位色图共有256种颜色,因此调色板的大小是256*4=1024字节。

5. 位图数据
表示位图中像素的位元是以行为单位对齐存储的,每一行的大小都向上取整为4字节(32位DWORD)的倍数。如果图像的高度大于1,多个经过填充实现对齐的行就形成了像素数组。

参考:
BMP维基百科
BMP格式详解

你可能感兴趣的:(其他,BMP,文件头)