• BMP图像存储格式


    BMP有单色,16色,256色,24位,32位几种类型位图。

    BMP在磁盘上是按以下顺序存储的:

      ---------------header部分开始----------------

    [位图文件头TBitmapFileHeader]     // 14个字节

    [位图信息头TBitmapInfo]               // 40个字节

      --------------- body部分开始 ----------------

    [图像数据BGRA]                            // 32位位图含Alpha值

     

    (1)位图文件头

    typedef struct tagBITMAPFILEHEADER { // bmfh 
        WORD    bfType;           // 文件标识‘BM’
        DWORD   bfSize;           // 用字节表示的整个文件的大小
        WORD    bfReserved1;    // 保留字节,为0
        WORD    bfReserved2;    // 保留字节,为0
        DWORD   bfOffBits;        // 图象数据RGBA的起始地址的偏移值  为54
    } BITMAPFILEHEADER; 
    

    (2)位图信息头

    typedef struct tagBITMAPINFOHEADER{ // bmih 
        DWORD  biSize;               // 位图信息头(Bitmap Info Header)的长度,为40  
        LONG   biWidth;               // 位图的宽度,以象素为单位
        LONG   biHeight;              // 位图的高度,以象素为单位  
        WORD   biPlanes;             // 位图的位面数(注:该值将总是1)
        WORD   biBitCount           // 每个象素的位数,设为24(表示24Bit位图)
        DWORD  biCompression;    // 压缩说明,设为0(不压缩)
        DWORD  biSizeImage;       // 用字节数表示的位图数据的大小(该数必须是4的倍数)
        LONG   biXPelsPerMeter;   // 用象素/米表示的水平分辨率 (一般设为0)
        LONG   biYPelsPerMeter;   // 用象素/米表示的垂直分辨率(一般设为0)
        DWORD  biClrUsed;           // 位图使用的颜色数(一般设为0)
        DWORD  biClrImportant;    // 指定重要的颜色数(一般设为0)
    } BITMAPINFOHEADER;
    

    (3)图像数据BGRA

           单色:      1个bit表示1个像素

           16色:     4个bit表示1个像素

           256色:   8个bit表示1个像素

           24位:     24个bit表示1个像素       //BGR

           32位:     32个bit表示1个像素       //BGRA

      *** 数据存放顺序 ***

           

    注:图片的左下角为图像文件数据块的起点,从左到右,从下到上依次存储图像各像素值。如上图所示!

    (4)需要注意的几点

      a.  像素中个颜色分量顺序为 BGRA -- Blue  Green  Red  Alpha

    以下是RGB宏的定义

    #define RGB(r, g ,b)  ((DWORD) (((BYTE) (r) | \ 
        ((WORD) (g) << 8)) | \ 
        (((DWORD) (BYTE) (b)) << 16))) 
    

    可通过BYTE GetRValue(DWORD rgb)   BYTE GetGValue(DWORD rgb)    BYTE GetBValue(DWORD rgb)来获取各个分量的值。

      b. 对于数据区域而言,每行的数据它必须凑满4字节,如果没有满,则用冗余的数据来补齐。

          如:对于24位位图,假设一行有w个像素,那么一行的像素数为:4*((3*w+3)/4)   // 注意(3*w+3)/4是在做整除操作

     

    参考:http://www.vckbase.com/index.php/wv/475.html 

  • 相关阅读:
    C#递规与分治策略
    SuperMap Objects Java & Applet
    如何提高显示速度
    系统测试
    ora01033:oracle initialization or shutdown in progress
    ORA12535: TNS:operation timed out。
    oralce01033
    hsql初体验
    创建Oracle数据源失败
    转载地图优化
  • 原文地址:https://www.cnblogs.com/kekec/p/2127297.html
Copyright © 2020-2023  润新知