chenpingjun1990

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  0 随笔 :: 22 文章 :: 5 评论 :: 0 Trackbacks

BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点--占用磁盘空间过大。所以,目前BMP在单机上比较流行。

BMP文件格式分析  
简介
BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。Windows 3.0以后的BMP图象文件与显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB(device-independent bitmap)格式(注:Windows 3.0以后,在系统中仍然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的是为了让Windows能够在任何类型的显示设备上显示所存储的图象。BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。

位图文件结构表
位图文件 位图文件头 14 字节
位图信息头 40 字节
彩色表(调色板) 4N 字节
位图数据 字节
 

构件详解:

  1. 位图文件头  

    位图文件头包含文件类型、文件大小、存放位置等信息。结构定义如下:

      typedef struct tagBITMAPFILEHEADER
    {
    UNIT bfType;
    DWORD bfSize;
    UINT bfReserved1;
    UINT bfReserved2;
    DWORD bfOffBits;
    }BITMAPFILEHEADER;

    其中:
    bfType    说明文件类型,在windows系统中为BM。
    bfSize    说明文件大小。
    bfReserved1 bfReserved2 保留,设置为0。
    bfOffBits 说明实际图形数据的偏移量。

     

  2. 位图信息头

    位图信息头包含位图的大小、压缩类型、和颜色格式,结构定义如下:

     

      typedef struct tagBITMAPINFOHEADER
    {
    DWORD biSize;
    LONG biWidth;
    LONG biHeight;
    WORD biPlanes;
    WORD biBitCount;
    DWORD biCompression;
    DWORD biSizeImage;
    LONG biXPelsPerMerer;
    LONG biYPelsPerMerer;
    DWORD biClrUsed;
    DWORD biClrImportant;
    }BITMAPINFOHEADER;

    其中: 
    biSize    说明BITMAPINFOHEADER结构所需字节数,在windows系统中为28h
    biWidth   说明图像宽度
    biHeight  说明图像高度
    biPlanes  为目标设备说明位面数,其值设为1
    biBitCount每个像素的位数,单色位图为1,256色为8,24bit为24。
    biCompression压缩说明,BI_RGB:无压缩,BI_RLE8:8位RLE压缩,BI_RLE4:4位RLE压缩
    biSizeImage说明图像大小,如无压缩,可设为0
    biXPelsPerMeter水平分辨率
    biYPelsPerMeter垂直分辨率
    biClrUsed 位图使用的颜色数
    biImportant重要颜色数目

     

  3. 彩色表

    彩色表包含的元素与位图所具有的颜色数目相同,像素颜色用结构RGBQUAD来表示:

    typedef struct tagRGBQUAD
    {
    BYTE rgbBlue;
    BYTE rgbGreen;
    BYTE rgbRed;
    BYTE rgbReserved;
    }RGBQUAD;
    其中:
    rgbBlue    指定蓝色强度
    rgbGreen   指定绿色强度
    rgbRed     指定红色强度
    rgbReserved保留,设为0

     

  4. 位图数据

    紧跟在彩色表后的是图像数据震裂,图像每一扫描行有连续的字节组成,扫描行由底向上存储,阵列中第一字节为左下角像素,最后一字节为右上角像素。

源代码以及测试图像见附件bmpTest.rar
C语言读取BMP图像数据源码
posted on 2011-10-02 08:53 万川先生 阅读(5234) 评论(1)  编辑 收藏 引用 所属分类: ImageProcessing

评论

# re: C语言读取BMP图像数据(转) 2014-07-24 13:52 lywhlao
源代码有点小错误:
fread(&biSize, sizeof(char), 4, fpbmp);
fread(&biWidth, sizeof(char), 4, fpbmp);
fread(&biHeight, sizeof(char), 4, fpbmp);
fread(&biPlanes, sizeof(char), 4, fpbmp);
fread(&biBitCount, sizeof(char), 4, fpbmp);
=============================================
应该改为
fread(&biPlanes, sizeof(char),2, fpbmp);
fread(&biBitCount, sizeof(char), 2, fpbmp);
这两个字段各占2各字节,不是4个。  回复  更多评论