图像格式(转)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Date:20180813

转自:https://blog.csdn.net/u012611878/article/details/52215985,感谢~

一、 BMP格式

BMP(Bitmap file)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图像处理软件都支持BMP图像文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。Windows 3.0以前的BMP图像文件格式与显示设备有关,因此把这种BMP图像文件格式成为设备相关位图DDB(Device Dependent Bitmap)文件格式。Windows 3.0以后的BMP图像文件格式与显示设备无关,目的是为了让Windows能够在任何类型的显示设备上显示所存储的图像。BMP位图文件默认的文件扩展名是BMP或者bmp(有时也会是DIB或RLE)。

注:Windows 3.0以后,在系统中仍然存在DDB位图,比如BitBit()这种函数就是基于DDB位图的,只不过如果你想将图像以BMP格式保存到磁盘文件中时,微软极力推荐以DIB格式保存。

  • BMP格式结构

BMP文件的数据按照从文件头开始的先后顺序分为四个部分:

1. 位图文件头(bmp file header):提供文件的格式、大小等信息;

2. 位图信息头(bmp information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息;

3. 调色板(color palette):可选,如需使用索引表示图像,调色板就是索引与其对应颜色的映射表;

4. 位图数据(bmp data):图像数据区;

  • BMP文件头

BMP文件头的结构体定义如下:

1 typedef struct tagBITMAPFILEHEADER
2 {
3     UINT16 bfType;    // 2bytes,必须为“BM”,即0x424D才是Windows位图文件
4     DWORD bfSize;    // 4bytes,整个BMP文件的大小
5     UINT16 bfReserved1;    // 2bytes,保留,为0
6     UINT16 bfReserved2;    // 2bytes,保留,为0
7     DWORD bfOffBits;    // 4bytes,文件起始位置到图像像素数据的字节偏移量
8 } BITMAPFILEHEADER;

  • BMP信息头

BMP信息头的结构体定义如下:

 1 typedef struct _tagBMP_INFOHEADER
 2 {
 3     DWORD biSize;    // 4bytes,INFOHEADER结构体的大小;存在其他版本的INFOHEADER,用作区分
 4     LONG biWidth;    // 4bytes,图像宽度(以像素为单位)
 5     LONG biHeight;    // 4bytes,图像高度,+:图像存储顺序为Bottom2Top,-:Top2Bottom
 6     WORD biPlanes;    // 2bytes,图像数据平面数,BMP存储RGB数据,因此总为1
 7     WORD biBitCount;    // 2bytes,图像像素位数
 8     DWORD biCompression;    // 4bytes,0:不压缩,1:RLE8,2:RLE4,3:BITFIELDS
 9     DWORD biSizeImage;    // 4bytes,4字节对齐的图像数据大小
10     LONG biXPelsPerMeter;    // 4bytes,用像素/米表示的水平分辨率
11     LONG biYPelsPerMeter;    // 4bytes,用像素/米表示的垂直分辨率
12     DWORD biClrUsed;    // 4bytes,实际使用的调色板索引数;0:使用所有的调色板索引
13     DWORD biClrImportant;    // 4bytes,重要的调色板索引数;0:所有的调色板索引都重要
14 } BMP_INFOHEADER;

  • BMP调色板

BMP调色板的结构体定义如下:

1 typedef struct _tagRGBQUAD
2 {
3     BYTE rgbBlue;    // 指定蓝色强度
4     BYTE rgbGreen;    // 指定绿色强度
5     BYTE rgbRed;    // 指定红色强度
6     BYTE rgbReserved;    // 保留,为0
7 } RGBQUAD;

  1,4,8位图像才会使用调色板数据,16,24,32位图像不需要调色板数据,即调色板最多只需要256项(索引 0-255)。

  颜色表的大小根据所使用的颜色模式而定:2色图像为8字节;16色图像为64字节;256色图像为1024字节。其中,每4字节表示一种颜色,并以B、G、R、alpha(32位位图的透明度值,一般不需要)。即首先4字节表示颜色号1的颜色,接下来的4字节表示颜色号2的颜色,依次类推。

  颜色表中RGBQUAD结构体数据的个数由BMP_INFOHEADER::biBitCount决定。即当biBitCount = 1,4,8时,分别有2,16,256个颜色表项。具体是这样:

当biBitCount = 1时,为2色图像,BMP位图中有2个RGBQUAD数据结构;

当biBitCount = 4时,为16色图像,BMP位图中有16个RGBQUAD数据结构;

当biBitCount = 8时,为256色图像,BMP位图中有256个RGBQUAD数据结构;

  • BMP图像数据区

  位图数据记录了位图中的每一个像素的值,记录顺序——在扫描行内从左到右,扫描行之间从下到上(BMP_INFOHEADER::biHeight)。位图每个像素值所占的字节数由BMP_INFOHEADER::biBitCount决定。

  Windows规定一个扫描行所占的字节数byte必须是4的倍数(即以long为单位),不足以0填充。一个扫描行所占字节数的计算方法:

DataSizePerLine = (BMP_INFOHEADER::biWidth * BMP_INFOHEADER::biBitCount + 31) / 8;  // 一个扫描行所占的字节数

DataSizePerLine = DataSizePerLine / 4 * 4;  // 字节数必须是4的倍数

DataSize = DataSizePerLine * BMP_INFOHEADER::biHeight;

  颜色表接下来为位图的数据区,在此部分记录着每个像素点对应的调色板索引值——色号,其记录方式也随着颜色模式而定:即2色图像每点占1位(8位为1字节);16色图像每点占4位(半字节);256色图像每点占8位(1字节);真彩色图像每点占24位(3字节)。所以,整个数据区的大小也会随之变化。究其规律而言,可的出如下计算公式:图像数据信息大小 =(图像宽度图像高度记录像素的位数)/ 8。

原文地址:https://www.cnblogs.com/xiawuhao2013/p/9471552.html