zoukankan      html  css  js  c++  java
  • bmp图像文件格式说明

    bmp图片文件包含4个部分数据,位图文件头,位图信息头,颜色表和位图数据(即RGB值)。

     

    在看位图格式之前先看一个问题,如果每个像素都用前面的24位色去表示,那么一个像素值需要3个字节数据,24位色也称为真彩色,因为它能表示足够多的颜色。但是要是我们不需要这么多颜色呢,比如我只需要16种颜色就行了,如果还是按照3个字节来表示一个像素,一个640*480位图需要640*480*3共约765k的像素数据。其实完全没有必要这么做,我们可以这样,16种颜色定义一个表,每一种颜色对应表中的一组RGB值,当要表示一个像素值时,指定表中的一个索引,从表中取出来显示即可,16种颜色只需要4位数据即可,再加上颜色表所占的空间3*16,这样一张640*480图片仅需要640*480*0.5+3*48共150k多数据,减少了近4/5的数据。这张R、G、B表称为调色板(palette),位图就采用了调色板技术。调色板技术一般用于颜色需求比较少的情况下,如果时24位色,大家可以算以下,比不用调色板技术像素数据还要多。

    位图文件头(BITMAPFILEHEADER)共14个字节,包含如下内容:

     

    typedef struct tagBITMAPFILEHEADER { /* bmfh */

        UINT bfType;

        DWORD bfSize;

        UINT bfReserved1;

        UINT bfReserved2;

        DWORD bfOffBits;

    }BITMAPFILEHEADER;

     

    位图文件类型(bfType),2个字节,必须是BM的ASCII码值,即0x4D42

    位图文件大小(bfSize),4个字节,包括这14个字节

    保留区(bfReserved1,bfReserved2),4个字节

    文件头到实际位图像素数据的偏移大小(bfOffBits),4个字节

     

    位图信息头BITMAPINFOHEADER,共40字节,包含如下内容:

    typedef struct tagBITMAPINFOHEADER { /* bmih */

        DWORD biSize;

        LONG biWidth;

        LONG biHeight;

        WORD biPlanes;

        WORD biBitCount;

        DWORD biCompression;

        DWORD biSizeImage;

        LONG biXPelsPerMeter;

        LONG biYPelsPerMeter;

        DWORD biClrUsed;

        DWORD biClrImportant;

    }BITMAPINFOHEADER;

    biSize,指定BITMAPINFOHEADER结构大小,占两个字节,为40

    biWidth,指定位图宽度,单位为像素,占4个字节,例如640*480图片,这里值就为640

    biHeight,指定位图高度,占4个字节,例如前面的480

    biPlanes,占2个字节,必须为1

    biBitCount,指定像素位数,占2个字节,比如24位色这里就为24,16位色这里就为16,1位色这里就为1,居然有1为色,就是黑白照片。

    biCompression,指定位图的压缩类型,可以取如下值:BI_RGB、BI_RLE8、BI_RLE4,都是windows定义好的一些常量,BI_RGB表示不压缩

    biSizeImage,图片像素数据大小,单位为字节,如果图片是BI_RGB,那么这个字段可以设置为0

    biXPelsPerMeter,目标设备水平分辨率

    biYPelsPerMeter,目标设备垂直分辨率

    biClrUsed,指定位图实际用到的颜色数,如果为0,颜色数为2^biBitCount

    biClrImportant,指定重要颜色数,如果为0,表示所有颜色都是重要的。

     

     

    调色板RGBQUAD,对于真彩位图不是必须的,BITMAPINFOHEADER就是图像的像素数据。

    typedef struct tagRGBQUAD { /* rgbq */

        BYTE rgbBlue;

        BYTE rgbGreen;

        BYTE rgbRed;

        BYTE rgbReserved;

    }RGBQUAD;

     

    调色板中一组颜色数据,rgbBlue表示蓝色分量值,rgbGreen表示绿色分量值,rgbRed表示红色分量值,rgbReserved保留,必须为0。

     

     

    剩下的就是像素数据了,对于用到调色板的位图,图像数据就是该像素在调色板中的索引值,对于真彩色图,就是实际的RGB值。


     

    需要注意的是:

    1.每一行的字节数必须是4的整数倍,如果不是,则需要补齐。

    2.bmp文件的像素数据是从下到上,从左到右的,也就是说bmp文件数据的第一行其实是图片的最下面一行数据。

    3.每个像素的数据是蓝色分量在前,红色分量在最后,是BGR这样排列的,和RGB的叫法是相反的。

  • 相关阅读:
    MATLAB远程桌面打开失败解决办法
    Windows 10 激活步骤
    Windows 10 重装技巧
    Office2019部署代码
    vi命令行命令的积累
    github项目cim(命令行即时通讯), HashedWheelTimer学习笔记
    java读取资源文件/打jar包后读取资源文件的区别
    vmware虚拟机网络配置(物理机能用ssh连接虚拟机, 虚拟机能共享物理机网卡上外网)仅主机模式,nat模式应该也可以
    spring cloud 组件学习 hystrix学习
    netty优化学习积累+++++++
  • 原文地址:https://www.cnblogs.com/xingrun/p/3311572.html
Copyright © 2011-2022 走看看