bfType
|
说明文件的类型,该值必须是0x4D42,也就是字符'BM',否则表示根本不是BMP
|
bfSize
|
说明该位图文件的大小,用字节为单位
|
bfReserved1
|
保留,必须设置为0
|
bfReserved2
|
保留,必须设置为0
|
bfOffBits
|
说明从文件头开始到实际的图像数据之间的字节偏移量。这个参数是非常有用的,因为位图信息和调色板的长度会根据不同的情况而变化,所以你可以用这个偏移值迅速的从文件中读取到位数据。
|
biSize
|
说明BITMAPINFOHEADER结构所需要的字节数
|
biWidth
|
说明图像的宽度,以像素为单位
|
biHeight
|
说明图像的高度,以像素位单位。注:这个值除了用于描述图像的高度之外,它还有另外一个用处,就是指明该图像是倒向的位图,还是正向的位图。如果该值是一个正数,说明图像是倒向的,即数据的第一行其实是图像的最后一行,如果该值是一个负数,则说明图像是正向的。大多数的BMP文件都是倒向的位图,也就是高度值是一个正数。
|
biPlanes
|
表示bmp图片的平面属性,显然显示器只有一个平面,所以恒等于1
|
biBitCount
|
说明比特数/像素,其值为1、4、8、16、24或32.
|
biCompression
|
说明图像数据压缩的类型,其中:
BI_RGB:没有压缩
BI_RLE8:每个像素8比特的RLE压缩编码,压缩格式由2字节组成(重复像素计数和颜色索引)
BI_RLE4:每个像素4比特的RLE压缩编码,压缩格式由2字节组成
BI_BITFIELDS:每个像素的比特由指定的掩码决定
BI_JPEG:JPEG格式
|
biSizeImage
|
说明图像的大小,以字节为单位。当用BI_RGB格式时,可设置为0
|
biXPelsPerMeter
|
说明水平分辨率,用像素/米表示
|
biYPelsPerMeter
|
说明垂直分辨率,用像素/米表示
|
biClrUsed
|
说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有的调色板项)
|
biClrImportant
|
说明对图像显示有重要影响的颜色索引的数目,如果是0,表示都重要
|
biBitCount:比特数/像素。0X0018 == 24 位
biCompression:0X00000000 == 0 。没有压缩
biSizeImage:图像压缩的类型。0X0004a400 == 304128 字节。位图的大小
bigSizeImage = biWidth * biHeight * 每个像素的字节数
那么这里应该是:352 * 288 * 24/8 = 304128 。
这里的biBitCount是24位,所以每个像素的字节数是24/8 = 3
注意:这里的biWidth必须是4的倍数,如果不是4的倍数,则需要取4的倍数。eg。241,则取244.
因为这里涉及到了一个行对齐的问题。由于windows在进行行行扫描的时候,最小的单位是4个字节,所以当图片的宽度不是4的倍数的时候,需要在每行的后面补上缺少的字节,以0填充。
biXPelsPerMeter:0x00000000
biYPelsPerMeter:0x00000000
biClrUsed:0x00000000 表示使用所有调色板项
biClrImportant:0X00000000 。 表示所有颜色对图像显示都有重要影响。在早期的计算机中,显卡相对来说比较落后,不一定能保证显示所有的颜色,所以在调色板中的颜色数据应尽可能的将图像中主要的颜色按顺序排列在前面,biClrImportant指出了有多少种颜色是重要的。
字段名称
|
大小(单位:字节)
|
描述
|
rgbBlue
|
1
|
蓝色值
|
rgbGreen
|
1
|
绿色值
|
rgbRed
|
1
|
红色值
|
rgbReserved
|
1
|
保留,总为0
|
for (int i = 0; i < 256; i++ )
ipRGB2[i].rgbRed = ipRGB2[i].rgbGreen = ipRGB2[i].rgbBlue = i;
上面例子的这幅图片并没有调色板
有一个长宽各为200个象素,颜色数为16色的彩色图,每一个象素都用R、G、B三个分量表示。因为每个分量有256个级别,要用8位(bit),即一个字节(byte)来表示,所以每个象素需要用3个字节。整个图象要用200×200×3,约120k字节,可不是一个小数目呀!如果我们用下面的方法,就能省的多。
因为是一个16色图,也就是说这幅图中最多只有16种颜色,我们可以用一个表:表中的每一行记录一种颜色的R、G、B值。这样当我们表示一个象素的颜色时,只需要指出该颜色是在第几行,即该颜色在表中的索引值。举个例子,如果表的第0行为255,0,0(红色),那么当某个象素为红色时,只需要标明0即可。
让我们再来计算一下:16种状态可以用4位(bit)表示,所以一个象素要用半个字节。整个图象要用200×200×0.5,约20k字节,再加上表占用的字节为3×16=48字节.整个占用的字节数约为前面的1/6,省很多吧?
这张R、G、B的表,就是我们常说的调色板(Palette),另一种叫法是颜色查找表LUT(Look Up Table),似乎更确切一些。
那么为什么我们这张BMP不带调色板呢?
是因为我们这张BMP是24位真彩色的BMP,所谓真彩色图(true color),就是它的颜色数高达256×256×256种,也就是说包含我们上述提到的R、G、B颜色表示方法中所有的颜色。真彩色图并不是说一幅图包含了所有的颜色,而是说它具有显示所有颜色的能力,即最多可以包含所有的颜色。表示真彩色图时,每个象素直接用R、G、B三个分量字节表示,而不采用调色板技术。原因很明显:如果用调色板,表示一个象素也要用24位,这是因为每种颜色的索引要用24位(因为总共有256×256×256种颜色,即调色板有256×256×256行),和直接用R,G,B三个分量表示用的字节数一样,不但没有任何便宜,还要加上一个256×256×256×3个字节的大调色板。所以真彩色图直接用R、G、B三个分量表示,它又叫做24位色图。
这么看来BMP文件不能一概而论了,其是否用调色板或者是RGB掩码,位图数据中的数据的真正含义直接与biBitCount 有关,不同类型的位图,其中的设计原理也不同,下面对此作一个对比: