zoukankan      html  css  js  c++  java
  • MFC学习(2)——BMP 文件结构及其存取

         目前广为流传的图像文件格式有许多种,常见的格式包括BMP、GIF、JPEG、TIFF、PSD、DICOM、MPEG 等。
    在各种图像文件格式中,一部分是由某个软硬件厂商提出并被广泛接受和采用的格式,例如
    BMP、GIF 和PSD 格式;另一部分是由各种国际标准组织提出的格式,例如JPEG、TIFF
    和DICOM,其中JPEG 是国际静止图像压缩标准组织提出的格式,TIFF 是由部分厂商组织
    提出的格式,DICOM 是医学图像国际标准组织提出的医学图像专用格式。
          BMP 文件是Windows 操作系统所推荐和支持的图像文件格式,是一种将内存或显示器
    的图像数据不经过压缩而直接按位存盘的文件格式,所以称为位图(bitmap)文件,因其文
    件扩展名为BMP,故称为BMP 文件格式,简称BMP 文件。

    BMP 图像文件被分成4 个部分:位图文件头(Bitmap File Header)、
    位图信息头(Bitmap Info Header)、颜色表(Color Map)和位图数据(即图像数据,Data Bits
    或Data Body)。
    第 1 部分为位图文件头BITMAPFILEHEADER,是一个结构体类型,该结构的长度是
    固定的,为14 个字节。其定义如下:

    typedef struct tagBITMAPFILEHEADER
    {
    WORD bfType;
    DWORD bfSize;
    WORD bfReserved1;
    WORD bfReserved2;
    DWORD bfOffBits;
    } BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER,
    *PBITMAPFILEHEADER;

    BITMAPFILEHEADER 结构的各个域详细说明如下:
    bfType:位图文件类型,必须是0x424D,即字符串“BM”,也就是说,所有的“*.bmp”
    文件的头两个字节都是“BM”。

    bfSize:位图文件大小,包括这14 个字节。
    bfReserved1, bfReserved2:Windows 保留字,暂不用。
    bfOffBits:从文件头到实际的位图数据的偏移字节数,图1-7 中前3 个部分的长度之和。

    第 2 部分为位图信息头BITMAPINFOHEADER,也是一个结构体类型的数据结构,该结构
    的长度也是固定的,为40 个字节(WORD 为无符号16 位整数,DWORD 为无符号32 位整
    数,LONG 为32 位整数)。其定义如下:

    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, FAR *LPBITMAPINFOHEADER,
    *PBITMAPINFOHEADER;

    BITMAPINFOHEADER 结构的各个域的详细说明如下:
    biSize:本结构的长度,为40 个字节。
    biWidth:位图的宽度,以像素为单位。
    biHeight:位图的高度,以像素为单位。
    biPlanes:目标设备的级别,必须是1。
    biBitCount:每个像素所占的位数(bit),其值必须为1(黑白图像)、4(16 色图)、
    8(256 色)、24(真彩色图),新的BMP 格式支持32 位色。
    biCompresssion:位图压缩类型,有效的值为BI_RGB(未经压缩)、BI_RLE8、BI_RLE4、
    BI_BITFILEDS(均为Windows 定义常量)。这里只讨论未经压缩的情况,即
    biCompression=BI_RGB。

    biSizeImage:实际的位图数据占用的字节数,该值的大小在第4 部分位图数据中有具体
    解释。
    biXPelsPerMeter:指定目标设备的水平分辨率,单位是像素/米。
    biYPelsPerMeter:指定目标设备的垂直分辨率,单位是像素/米。
    biClrUsed:位图实际用到的颜色数,如果该值为零,则用到的颜色数为2 的biBitCount
    次幂。
    biClrImportant:位图显示过程中重要的颜色数,如果该值为零,则认为所有的颜色都是
    重要的。

    第 3 部分为颜色表。颜色表实际上是一个RGBQUAD 结构的数组,数组的长度由
    biClrUsed 指定(如果该值为零,则由biBitCount 指定,即2 的biBitCount 次幂个元素)。
    RGBQUAD 结构是一个结构体类型,占4 个字节,其定义如下:
    typedef struct tagRGBQUAD
    {
    BYTE rgbBlue;
    BYTE rgbGreen;
    BYTE rgbRed;
    BYTE rgbReserved;}RGBQUAD;

    RGBQUAD 结构的各个域的详细说明如下:
    rgbBlue:该颜色的蓝色分量;
    rgbGreen:该颜色的绿色分量;
    rgbRed:该颜色的红色分量;
    rgbReserved:保留字节,暂不用。

    第 4 部分是位图数据,即图像数据,其紧跟在位图文件头、位图信息头和颜色表(如果
    有颜色表的话)之后,记录了图像的每一个像素值。对于有颜色表的位图,位图数据就是该
    像素颜色在调色板中的索引值;对于真彩色图,位图数据就是实际的R、G、B 值(三个分
    量的存储顺序是B、G、R)。下面分别就2 色、16 色、256 色和真彩色位图的位图数据进
    行说明:

    对于 2 色位图,用1 位就可以表示该像素的颜色,所以1 个字节能存储8 个像素的颜色
    值。

    对于 16 色位图,用4 位可以表示一个像素的颜色。所以一个字节可以存储2 个像素的颜色
    值。

    对于 256 色位图,1 个字节刚好存储1 个像素的颜色值。

    对于真彩色位图,3 个字节才能表示1 个像素的颜色值。

    我抬头仰望星空不是为了摘取流星,而是为了一个永不屈服的梦想。
  • 相关阅读:
    多线程中thread和runnable
    安装hive 个人遇到的问题小问题
    Linux 简单命令学习记录
    shell脚本简单学习教训经验
    @AutoWired使用
    <jsp:directive.page>标签
    Hibernate session.saveOrUpdate()方法
    无法连接远程mysql问题
    svn版本控制
    Hql中占位符(转)
  • 原文地址:https://www.cnblogs.com/happycaoyue/p/3025001.html
Copyright © 2011-2022 走看看