• BMP位图结构


       BMP(Bitmap)文件是windows采用的图形文件格式。其可分为与设备相关的位图(device dependent bitmap 简称DDB)和与设备无关的位图(device independent bitmap 简称 DIB)两种;但现在基本上不用DDB了,因为它相当依赖于设备。在windows 3.0以前才使用,在windows3.0之后大多使用的都是DIB。位图文件一般以BMP为后缀名;少数位图文件以DIB为后缀名。

    文件结构:

      位图文件由 文件表头(bitmap file header)、信息表头(bitmap info header)、[RGB色彩对照表]、位图图素位 这几部分组成。

    下表为位图各部分的作用:

    以下是位图的各个部分的结构:

    文件表头:

    typedef struct tagBITMAPFILEHEADER  // bmfh 

    {

      WORD bfType ; // 位图文件的类型,必须为"BM"或者0x4D42

      DWORD bfSize ; // 位图文件的大小,以字节为单位。

      WORD bfReserved1 ; // 位图文件保留字,必须为0

      WORD bfReserved2 ; // 位图文件保留字,必须为0

      DWORD bfOffsetBits ; // 位图数据的起始位置

                  // (与位图文件头部的偏移量)

    } BITMAPFILEHEADER, *PBITMAPFILEHEADER;

    信息表头:

    typedef struct tagBITMAPINFOHEADER // bmih

      DWORD biSize ; // 本结构所占用字节数

      LONG biWidth ; // 位图的宽度,以像素为单位。

      LONG biHeight ; // 位图的高度,以像素为单位。

      WORD biPlanes ; // = 1

      WORD biBitCount ; // 每一图素的位数 (1, 4, 8, 16, 24, or 32)

                 // 1代表2色DIB、4代表16色DIB、

                 // 8代表256色DIB、24代表真彩DIB

      DWORD biCompression ; // 位图压缩类型,必须是0(BI_RGB不压缩)、

                   // 1(BI_RLE8压缩类型)或者2(BI_RLE4压缩类型)

      DWORD biSizeImage ; // 位图的大小,以字节为单位

      LONG biXPelsPerMeter ;// 位图水平分辨率

      LONG biYPelsPerMeter ;// 位图垂直分辨率

      DWORD biClrUsed ; // 彩色对照表中的颜色数

      DWORD biClrImportant; // 位图显示过程中重要的颜色数

    } BITMAPINFOHEADER, *PBITMAPINFOHEADER;

    彩色对照表:

      当位数为1、4和8时的彩色对照表,24位DIB没有色彩对照表。(扩展的DIB

    typedef struct tagRGBQUAD // rgb

    {

      BYTE rgbBlue ; // 蓝色色值

      BYTE rgbGreen ; // 绿色色值

      BYTE rgbRed ; // 红色色值

      BYTE rgbReserved ; // = 0

    } RGBQUAD ;

    除了包括总是设定为0的第四个字段外,wingdi.h表头文件定义了下结构:

    typedef struct tagBITMAPINFO // bmi

    {

      BITMAPINFOHEADER bmiHeader ; // 位图信息头

      RGBQUAD bmiColors[1] ; // 颜色表数组

    } BITMAPINFO, *PBITMAPINFO ;

    位图图素位:

      位图图素位记录了每一个像素值;值得注意的是,位图的行组织是从左到右,从下到上的

      DIB中的行数等于BITMAPINFOHEADER结构的biHeight字段。每一行的图素数等于该结构的biWidth字段。每一行从最左边的图素开始,直到图像的右边。每个图素的位数可以从bcBitCount字段取得,为1、4、8或24。

    行的长度可以计算为:RowLength = 4 * ((biWidth * biBitCount + 31) / 32); 或者 RowLength = ((biWidth * biBitCount + 31) & ~31) >> 3;

    每行的长度必须是4的整数倍,当不足4时,通常用0填充。

  • 相关阅读:
    使用 GitHub, Jekyll 打造自己的免费独立博客
    如何解决数据科学计数法在数据库中的显示
    RDF
    C# 在 4.0 以后一共有3种创建线程的方式
    C#多线程
    1、框架概述
    3、IDEA 中使用 Maven
    2、Maven 核心概念
    1、Maven 概述
    JDK动态代理
  • 原文地址:https://www.cnblogs.com/xukaixiang/p/2507954.html
Copyright © 2020-2023  润新知