最近一直在用bmp格式的图片进行图像算法的学习,对bmp来做一个整理,以备后面使用。
BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛使用的图像文件格式。由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源。Windows的图形用户界面(graphical user interfaces)也在它的内建图像子系统GDI中对BMP格式提供了支持。
BMP文件的数据按照从文件头开始的先后顺序分为四个部分:
bmp文件头(bmp file header):提供文件的格式、大小等信息
位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息
调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表
位图数据(bitmap data):就是图像数据啦
从C语言中对他们的定义可以看一下
(1)bmp文件头(占14字节)
typedef struct tagBITMAPFILEHEADER {
WORD bfType; //文件的类型,占2个字节
DWORD bfSize; //文件的大小,占4个字节
WORD bfReserved1; //保留位1,占2个字节
WORD bfReserved2; //保留位2,占2个字节
DWORD bfOffBits; //从文件开始到位图数据开始之间的数据量,称为偏移量:偏移量大小=位图文件头大小+位图信息头大小+调色板大小。占4个字节
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
(2)位图信息头(占40字节)
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; //位图信息头的大小,4个字节。
LONG biWidth; //位图的宽度,单位为像素点,4个字节。
LONG biHeight; //位图的长度,单位为像素点,4个字节。
WORD biPlanes; //位图的位面数,总是1,2个字节。
WORD biBitCount; //位图的像素位数,即每个像素点所占的位数,2个字节。
DWORD biCompression; //位图的压缩说明:0 - 不压缩 (使用BI_RGB表示)1 - RLE 8-使用8位RLE压缩方式(用BI_RLE8表示)2 - RLE 4-使用4位RLE压缩方式(用BI_RLE4表示)3 - Bitfields-位域存放方式(用BI_BITFIELDS表示),4个字节。
DWORD biSizeImage; //位图数据的大小,必须是4的倍数,4个字节。
LONG biXPelsPerMeter; //用像素/米表示的水平分辨率,4个字节。
LONG biYPelsPerMeter;//用像素/米表示的垂直分辨率,4个字节。
DWORD biClrUsed; //文件使用的颜色数。如果为0,则表示使用了全部可能的颜色。如8-比特/象素表示为0x100或者 256,4个字节。
DWORD biClrImportant; //指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要,4个字节。
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;
(3)调色板(调色板大小可选,大小为N*4(bytes),其中N表示颜色的数目)
typedef struct tagRGBQUAD {
BYTE rgbBlue;//蓝色分量
BYTE rgbGreen;//绿色分量
BYTE rgbRed;//红色分量
BYTE rgbReserved;//蓝保留位
} RGBQUAD;
(4)位图数据(根据图片不同所占大小而不同):
位图数据就是对应的数组,可以有多种格式,RGB、YUV、HSV等等。