图像算法-BMP格式图片的数据结构

前言

图像处理的第一步就是读取图像数据,图像数据存储的文件格式有很多,比如Bmp,Jpg,Png等。通过opencv算法库,我们可以很方便的读取这些文件中的图像数据。其实,我们也可以根据图片文件的存储方式,自己编码实现对图片数据的读取。Bmp格式图片,在图像领域经常被使用,由于没有经过编码,因此进行数据读取非常方便,下面就详细介绍Bmp格式图片的数据结构。

数据结构

位图文件由文件头、信息表、颜色表、图像数据四个部分组成。

// 文件头
    typedef struct tagBITMAPFILEHEADER
    {
        WORD bfType;  //文件类型,必须为BM(1-2字节)
        DWORD bfSize;  //文件大小,以字节为单位(3-6字节,低位在前)
        WORD bfReserved1;  //保留字,必须为0(7-8字节)
        WORD bfReserved2;  //保留字,必须为0(9-10字节)
        DWORD bfOffBits;  //位图数据的起始位置,以相对于位图(11-14字节,低位在前)
        //文件头的偏移量表示,以字节为单位
    }__attribute__((packed)) BITMAPFILEHEADER;

// 信息表
typedef struct tagBITMAPINFOHEADER{
    DWORD biSize;  //本结构所占用字节数(15-18字节)
    LONG biWidth;  //位图的宽度(19-22字节)
    LONG biHeight;  //位图的高度(23-26字节)
    WORD biPlanes;  //目标设备的级别,必须为1(27-28字节)
    WORD biBitCount;  //每个像素所需的位数,必须是1(双色),(29-30字节)
    //4(16色),8(256色)16(高彩色)或24(真彩色)之一
    DWORD biCompression;  //位图压缩类型,必须是0(不压缩),(31-34字节)
    //1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
    DWORD biSizeImage;  //位图的大小(4字节对齐),以字节为单位(35-38字节)
    LONG biXPelsPerMeter;  //位图水平分辨率,每米像素数(39-42字节)
    LONG biYPelsPerMeter;  //位图垂直分辨率,每米像素数(43-46字节)
    DWORD biClrUsed;  //位图实际使用的颜色表中的颜色数(47-50字节)
    DWORD biClrImportant;  //位图显示过程中重要的颜色数(51-54字节)
    }__attribute__((packed)) BITMAPINFOHEADER;

// 颜色表
    typedef struct tagRGBQUAD{
    BYTE rgbBlue;  //蓝色的亮度(值范围为0-255)
    BYTE rgbGreen;  //绿色的亮度(值范围为0-255)
    BYTE rgbRed;  //红色的亮度(值范围为0-255)
    BYTE rgbReserved;  //保留,必须为0
    }__attribute__((packed)) RGBQUAD;

说明

  1. 位图文件头结构大小为14个字节;位图信息表结构大小为40字节;
  2. 颜色表中,一个结构对应一种颜色,灰度图时,该结构为1个;彩色图,无颜色表;
  3. 图像数据存储的顺序是从上到下,从左到右存储,且每行四字节对齐;对于灰度图像,存储单个像素值;对于彩色图像,则存储RGB三个通道的像素值;
  4. 在bmp文件中,图像数据存储是从左下角开始存储的;
  5. 在用fopen打开bmp文件时,读文件使用“rb”,写文件使用”wb”;

你可能感兴趣的:(图像算法-BMP格式图片的数据结构)