BMP图片文件格式

转载 2012年03月27日 21:00:01

BMP文件结构

如图1-7所示,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个部分的长度之和。

1、BMP图片文件格式 - 任性 - 任性生活

 
   
 

图1-7  BMP文件结构示意图

第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:保留字节,暂不用。

有些位图需要颜色表;有些位图(如真彩色图)则不需要颜色表,颜色表的长度由BITMAPINFOHEADER结构中biBitCount分量决定。对于biBitCount值为1的二值图像,每像素占1bit,图像中只有两种(如黑白)颜色,颜色表也就有21=2个表项,整个颜色表的大小为1、BMP图片文件格式 - 任性 - 任性生活个字节;对于biBitCount值为8的灰度图像,每像素占8bit,图像中有28=256种颜色,颜色表也就有256个表项,且每个表项的R、G、B分量相等,整个颜色表的大小为1、BMP图片文件格式 - 任性 - 任性生活个字节;而对于biBitCount=24的真彩色图像,由于每像素3个字节中分别代表了R、G、B三分量的值,此时不需要颜色表,因此真彩色图的BITMAPINFOHEADER结构后面直接就是位图数据。

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

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

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

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

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

需要注意两点:

第一,Windows规定一个扫描行所占的字节数必须是4的倍数,不足4的倍数则要对其进行扩充。假设图像的宽为biWidth个像素、每像素biBitCount个比特,其一个扫描行所占的真实字节数的计算公式如下:

DataSizePerLine = (biWidth * biBitCount /8+ 3) / 4*4

那么,不压缩情况下位图数据的大小(BITMAPINFOHEADER结构中的biSizeImage成员)计算如下:

biSizeImage = DataSizePerLine * biHeight

第二,一般来说,BMP文件的数据是从图像的左下角开始逐行扫描图像的,即从下到上、从左到右,将图像的像素值一一记录下来,因此图像坐标零点在图像左下角。

位图(bmp)文件格式分析

位图(bmp)文件格式分析 作者:深蓝(由博主分享) 一、什么是位图 计算机能以位图和矢量图格式显示图像。 1、位图(Bitmap): 图像又称点阵图或光栅图,它使用我们称为像素(象素,Pi...
  • qingchuwudi
  • qingchuwudi
  • 2014年05月14日 11:42
  • 3244

BMP(图像文件格式(Bitmap))

BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他...
  • wander_wang
  • wander_wang
  • 2014年08月18日 15:41
  • 1140

bmp文件格式详解

先区分几个概念:16色和16位色一样吗? 不一样! 颜色位数,即是用多少位字节表示的值,每一位可以表示0和1两值。通常图片的颜色深度,简称色深,就是用位数来表示的,所以,我通常会看到8位色,16位...
  • YUAN1125
  • YUAN1125
  • 2016年02月22日 11:51
  • 1450

黑白BMP文件的读写和数据黑白图像显示

对于图像处理来说,如何从一幅bmp图像中读取它包含的信息,是十分重要的。而对于c++如何将文件读取到内存,或者将数据保存为bmp黑白图像,则需要研究图像是如何进行存储的。 一般的,黑白图像由文件头,信...
  • zhoudewen66
  • zhoudewen66
  • 2015年12月26日 21:16
  • 890

将Bmp图像文件转成mif格式的存储,用于例化ROM

mif
  • u010442328
  • u010442328
  • 2014年11月03日 15:56
  • 1202

VC打开并缩放显示位图(.BMP)文件的方法

VC打开并缩放显示位图(.BMP)文件的方法 最近一个项目需要进行位图操作,网上找了一大堆资料,但发现都是以前VC6.0版本的抄来抄去,而且大多数使用了复杂的位图结构。所以自己通过查阅MSD...
  • lxw907304340
  • lxw907304340
  • 2015年05月05日 14:19
  • 1332

24BITBMP位图的文件结构及创建

下面这些结构说明来自http://blog.csdn.net/lanbing510/article/details/8176231
  • rocklee
  • rocklee
  • 2014年04月18日 21:17
  • 1549

位图文件(BMP)格式以及Linux下C程序实现

说到图片,位图(Bitmap)当然是最简单的,它是Windows显示图片的基本格式,其文件扩展名为*.BMP。由于没有经过任何的压缩,故BMP图 片往往很大。在Windows下,任何格式的图片文件都要...
  • niepangu
  • niepangu
  • 2015年12月27日 19:43
  • 667

BMP文件格式详解

BMP文件格式详解(BMP file format)BMP文件格式,又称为Bitmap(位图)或是DIB(Device-Independent Device,设备无关位图),是Windows系统中广泛...
  • u013467442
  • u013467442
  • 2015年08月13日 17:41
  • 1075

用C++语言写bmp文件的程序完整版

#include #include /* 定义WORD为两个字节的类型 */ typedef unsigned short WORD; /* 定义DWORD为四个字节的类型 */ typedef...
  • weiaipan1314
  • weiaipan1314
  • 2016年06月24日 16:42
  • 612
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BMP图片文件格式
举报原因:
原因补充:

(最多只允许输入30个字)