位图数据结构

举报
皮皮 发表于 2018/07/16 16:30:09 2018/07/16
【摘要】 位图应该以一种既定的格式存储在文件中,并被赋予一个以.bmp扩展名结尾的文件名。这个既定的格式依次由下面几种结构组成:BITMAPFILEHEADER结构,BITMAPINFOHEADER结构,BITMAPV4HEADER或者BITMAPV5HEADER 结构。一个包含RGBQUAD结构(也叫调色板)的数组跟随在位图信息头结构之后。调色板之后跟随着一个颜色索引的数组(真实的位图数据)。 ...

位图应该以一种既定的格式存储在文件中,并被赋予一个以.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


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。