数字图像处理 | BMP文件

BMP文件结构如表:

位图文件头结构 BITMAPFILEHEADER
位图信息头结构 BITMAPINFOHEADER
位图颜色表 RGBQUAD
位图数据  

(1)位图文件头

它含有BMP文件的类型、文件大小和位图起始位置等信息。其结构定义如下:

typedef struct tagBITMAPFILEHEADER{
    WORD bfType;//位图文件的类型,必须为BMP
    DWORD bfSize;//位图文件的大小,以字节为单位
    WORD bfReserved1;//位图文字保留字,必须为0
    WORD bfReserved2;//位图文字保留字,必须为0
    DWORD bfOffBits;//位图数据起始位置,以相对于文件头的偏移量表示,以字节为单位
}BITMAPFILEHEADER;

(2)位信息头

BMP位图信息头结构用于说明位图的尺寸等信息。其结构定义如下:

typedef struct tagBITMAPINFOHEADER{
    DOWN biSize;//本结构所占字节数
    LONG biWidth;//位图的宽度,以像素为单位
    LONG biHeight;//位图的高度,以像素为单位
    WORD biPlanes;//目标设备的级别,必须为1
    WORD biBitCount;//每个像素所需的位数,必须是1(双色)、4(16色)、8(256色)、24(真彩色)之一
    DWORD biCompression;//位图压缩类型,必须是0(不压缩)、1(B1_RLE8压缩类型),或2(B1_RLE4压缩类型)之一
    DWORD biSizeImage;//位图的大小,以字节为单位
    LONG biXPelsPerMeter;//位图水平分辨率,每米像素数
    LONG biYPelsPerMeter;//位图垂直分辨率,每米像素数
    DWORD biClrUsed;//位图实际使用的颜色表中的颜色数
    DWORD biClrImportant;//位图显示过程中重要的颜色数
}BITMAPINFOHEADER;

(3)颜色表

扫描二维码关注公众号,回复: 4491148 查看本文章

8位位图中,每个像素占8位,可表示256种颜色,8位位图文件含有颜色表,而真彩色位图文件中不含颜色表。颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,用于定义一种颜色。

RGBQUAD结构的定义如下:

typedef struct tagRGBQUAD{
    BYTE rgbBlue;//蓝色的亮度,值范围为0-255
    BYTE rgbGreen;//绿色的亮度,值范围为0-255
    BYTE rgbRed;//红色的亮度,值范围为0-255
    BYTE rgbReserved;//保留,必须为0
}RGBQUAD;

在颜色表中,RGBQUAD结构数据中的个数由biBitCount来决定。当bitBitCount=1、4、8时,分别有2、16、256个表项。

当bitBitCount=24时,没有颜色表项。

位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:

typedef struct tagBITMAPINFO{
    BITMAPINFOHEADER bitHeader;//位图信息头
    RGBQUAD bmiColors[1];//颜色表
}BITMAPINFO;

(4)位图数据

位图数据记录了位图的每一个像素值,记录顺序是在扫描行内从左到右,扫描行之间从下到上。位图的一个像素值所占的字节数如下。

bitBitCount 说明
1 8个像素占1个字节
4 2个像素占1个字节
8 1个像素占1个字节
24 1个像素占3个字节

位图像素值的位数可为1、4、8和24,其图像的颜色数分别为2、16、256和真彩色。其中前3种有对应的颜色表,而24位位图的颜色表为空,其像素值就是颜色值。如果BITMAP、INFOHEADER的biClrUsed域不为"0",则其值为位图所使用的颜色数,也即是颜色表的表项数;如果该域为"0",则位图的颜色表的表项数为满的,即像素颜色位数为1、4、8,则其颜色表项数分别为2、16、256。颜色表中一般将最重要的颜色排在前面。

8位位图的数据紧跟在颜色表后面,其数据是颜色表的索引值,数据可以是不压缩的,也可以是压缩的。对4位位图和8位位图,可以采用RLE(游程长度编码)压缩,分别称为RLE4和RLE8位图。位图数据以行为单位存储,每行都被填充到一个4字节边界,即每行所占的存储长度总是4字节(32位的倍数),不足时多余位将用"0"填充。位图行的存储次序是颠倒的,即位图文件中第一行数据对应的是位图的最底行。对于像素位数为1的DIB位图,其每个像素只占1位,每个字节存储8个像素。字节的最高位对应最左边像素。在像素位数为24的DIB位图中,每个像素占3个字节,从左到右的每一个字节分别存储蓝、绿、红的颜色值,每行用"0"填充到一个4字节边界。

猜你喜欢

转载自blog.csdn.net/qq_39419087/article/details/82883009