位图数据结构
位图应该以一种既定的格式存储在文件中,并被赋予一个以.bmp扩展名结尾的文件名。这个既定的格式依次由下面几种结构组成:BITMAPFILEHEADER结构,BITMAPINFOHEADER结构,BITMAPV4HEADER或者BITMAPV5HEADER 结构。一个包含RGBQUAD结构(也叫调色板)的数组跟随在位图信息头结构之后。调色板之后跟随着一个颜色索引的数组(真实的位图数据)。
位图文件的格式如下图所示:
BITMAPFILEHEADER结构的成员确定文件;以byte为单位,声明文件大小;声明从文件头到文图数据的偏移量。BITMAPINFOHEADER,BITMAPV4HEADER,或者BITMAPV5HEADER结构的成员以像素为单位声明位图的宽和高;色彩格式(平面数目和每像素位数);位图存储之前是否被压缩和使用的压缩格式;位图数据使用的字节数;位图的分辨率;以及位图的颜色数。RGBQUAD结构声明了在调色板中RGB三色的亮度值。
色彩索引数组(color-index array)与一个颜色关联,以索引的形式指向一个RGBQUAD结构,每一个像素一一对应一个色彩索引数组。这样,色彩索引数组所需要的位数,就等于像素数乘以索引需要的位数。举个例子,一个8*8的黑白位图,它的色彩索引数组一共需要8*8*1=64位,因为索引位需要1bit来索引这两个颜色。
要创建一个自上而下位图的色彩索引数组,从位图的最顶行开始。最左边像素的RGBQUAD索引是色彩索引数组的前N位(N是指示所有RGBQUAD结构所需要的位数)。往右的下一个色彩索引就是数组中下一个N位,以后也是。(The index of the RGBQUAD for the color of the left-most pixel is the first n bits in the color-index array (where n is the number of bits needed to indicate all of the RGBQUAD structures). The color of the next pixel to the right is the next n bits in the array, and so forth.)当到达最右边的点,再从下一行最左边的点开始。如此重复,直到整个位图完成。如果是一个自下而上的位图,从最下面的行开始,还是从左到右,一直重复到位图的最顶行。
下面的十六进制输出,表示了一个位图:
0000 42 4d 76 02 00 00 00 00 00 00 76 00 00 00 28 00
0010 00 00 20 00 00 00 20 00 00 00 01 00 04 00 00 00
0020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0030 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 80
0040 00 00 00 80 80 00 80 00 00 00 80 00 80 00 80 80
0050 00 00 80 80 80 00 c0 c0 c0 00 00 00 ff 00 00 ff
0060 00 00 00 ff ff 00 ff 00 00 00 ff 00 ff 00 ff ff
0070 00 00 ff ff ff 00 00 00 00 00 00 00 00 00 00 00
0080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 09 00
0090 00 00 00 00 00 00 11 11 01 19 11 01 10 10 09 09
00a0 01 09 11 11 01 90 11 01 19 09 09 91 11 10 09 11
00b0 09 11 19 10 90 11 19 01 19 19 10 10 11 10 09 01
00c0 91 10 91 09 10 10 90 99 11 11 11 11 19 00 09 01
00d0 91 01 01 19 00 99 11 10 11 91 99 11 09 90 09 91
00e0 01 11 11 11 91 10 09 19 01 00 11 90 91 10 09 01
00f0 11 99 10 01 11 11 91 11 11 19 10 11 99 10 09 10
0100 01 11 11 11 19 10 11 09 09 10 19 10 10 10 09 01
0110 11 19 00 01 10 19 10 11 11 01 99 01 11 90 09 19
0120 11 91 11 91 01 11 19 10 99 00 01 19 09 10 09 19
0130 10 91 11 01 11 11 91 01 91 19 11 00 99 90 09 01
0140 01 99 19 01 91 10 19 91 91 09 11 99 11 10 09 91
0150 11 10 11 91 99 10 90 11 01 11 11 19 11 90 09 11
0160 00 19 10 11 01 11 99 99 99 99 99 99 99 99 09 99
0170 99 99 99 99 99 99 00 00 00 00 00 00 00 00 00 00
0180 00 00 00 00 00 00 90 00 00 00 00 00 00 00 00 00
0190 00 00 00 00 00 00 99 11 11 11 19 10 19 19 11 09
01a0 10 90 91 90 91 00 91 19 19 09 01 10 09 01 11 11
01b0 91 11 11 11 10 00 91 11 01 19 10 11 10 01 01 11
01c0 90 11 11 11 91 00 99 09 19 10 11 90 09 90 91 01
01d0 19 09 91 11 01 00 90 10 19 11 00 11 11 00 10 11
01e0 01 10 11 19 11 00 90 19 10 91 01 90 19 99 00 11
01f0 91 01 11 01 91 00 99 09 09 01 10 11 91 01 10 91
0200 99 11 10 90 91 00 91 11 00 10 11 01 10 19 19 09
0210 10 00 99 01 01 00 91 01 19 91 19 91 11 09 10 11
0220 00 91 00 10 90 00 99 01 11 10 09 10 10 19 09 01
0230 91 90 11 09 11 00 90 99 11 11 11 90 19 01 19 01
0240 91 01 01 19 09 00 91 10 11 91 99 09 09 90 11 91
0250 01 19 11 11 91 00 91 19 01 00 11 00 91 10 11 01
0260 11 11 10 01 11 00 99 99 99 99 99 99 99 99 99 99
0270 99 99 99 99 99 90
下面的表给出了这个位图中的结构的数据:
BITMAPFILEHEADER
BITMAPFILEHEADER结构包含关于类型,大小,布局设备无关的位图信息。
typedef struct tagBITMAPFILEHEADER {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
成员
bfType
声明文件类型,必须是BM。
bfSize
声明位图文件的大小,以字节为单位。
bfReserved1
保留,必须为0。
bfReserved2
保留,必须为0。
bfOffBits
声明偏移量,从BITMAPFILEHEADER结构开始到位图数据,以字节为单位。
备注
在设备无关文件中,BITMAPINFOHEADER结构紧随其后。
BITMAPINFOHEADER
BITMAPINFOHEADER结构包含设备无关位图的大小以及色彩格式的信息。
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
成员
biSize
声明这个结构体所需要的字节数。
biWidth
声明位图的宽,以像素为单位。
biHeight
声明位图的高,以像素为单位。如果biHeight是正数,位图是一个自下而上的设备无关位图,起点在左下角。如果biHeight是负数,位图是一个自上而下的设备无关位图,起点在左上角。
如果biHeight是负数,指示一个自上而下的设备无关位图,biCompression就必须为BI_RGB或者BI_BITFIELDS。自上而下的设备无关位图不能被压缩。
biPlanes
为目标装置声明平面数,这个值必须是1。
biBitCount
声明每像素位数。BITMAPINFOHEADER的成员biBitCount确定了定义每一个像素需要的位数,以及位图所需颜色的最大值。这个成员必须是以下的值:
Value Meaning
0 JPEG或者PNG格式声明每像素位数
1 位图是单色的,包含两个颜色信息,位图数组中的每一位代表一个像素。如果这一位是0,那么这个点的颜色就是调色板中第一个RGBQUAD结构所定义的颜色。如果这一位是1,那么这个点的颜色就是调色板中第二个GBQUAD结构所定义的颜色。
4 位图最多有16种颜色。调色板数组中有16个元素。位图中的每一个像素由一个4位的索引指向调色板。举个例子,位图的第一个字节是0x1F,这个字节代表两个像素,第一个像素颜色是调色板中的第二个RGBQUAD结构所定义的颜色,第二个像素颜色是调色板中的第十六个RGBQUAD结构所定义的颜色。
8 位图最多有256种颜色。调色板中有256个元素。每一个字节代表一个颜色。
16 位图有2^16种颜色。如果biCompression为BI_RGB,则没有调色板。每两个字节代表一个像素。每一个颜色分量中,使用5位分别表示红绿蓝的相对强度。低5位表示蓝色,然后的5表示绿色,在5位表示红色。最高位没有使用。
24 位图最多有2^24种颜色。没有调色板。位图数组中每三个字节代表一个像素的红绿蓝相对强度。
biCompression
BI_RGB
biSizeImage
声明图像的大小,以字节为单位。如果是BI_RGB位图,可能是0。
biXPelsPerMeter
声明横向分辨率,以像素每米为单位。
biYPelsPerMeter
声明纵向分辨率,以像素每米为单位。
biClrUsed
一般为0。
biClrImportant
声明显示这个位图需要多少种颜色,如果是0,则需要所有颜色。
RGBQUAD
RGBQUAD结构描述红绿蓝相对亮度
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
成员
rgbBlue
声明蓝色强度
rgbGreen
声明绿色强度
rgbRed
声明红色强度
rgbReserved
保留,必须是0
- 点赞
- 收藏
- 关注作者
评论(0)