BMP文件格式

两盒软妹~` 提交于 2019-11-30 18:40:48

 

BMP(Bitmap-File)图像文件,又叫位图文件,是Windows采用的图形文件格式,在Windows环境下运行的所有图像处理软件都支持BMP图像文件格式。Windows系统内部个图像绘制操作以BMP为基础的。一个BMP文件由四个部分组成。

  • l  位图文件头
  • l  位图信息段
  • l  调色板
  • l  位图数据

 

一个BMP文件,可以用代码表示,如下:

typedef struct tagBITMAP_FILE
{
    BITMAPFILEHEADER bitmapheader;
    BITMAPINFOHEADER bitmapinfoheader;
    PALETTEENTRY palette[256];
    UCHAR *buffer;            //UCHAR大小1字节(通BYTE)
}BITMAP_FILE;

BMP文件头:BITMAPFILEHEADER

typedef struct tagBITMAPFILEHEADER{
  WORD bfType;
  DWORD bfSize;
  WORD bfReserved1;
  WORD bfReserved2;
  DWORD bfOffbits;
}

bfType

说明文件的类型,该值必须是0x4D42,也就是字符‘BM’,否则表示根本不是BMP

bfSize

说明位图文件的大小,用字节为单位

bfReserved1

保留,必须设置为0

bfReserved2

保留,必须设置为0

bfOffBits

说明从文件头开始到实际的图像数据之间的字节的偏移量。因为位图信息头和调色板的长度会根据不同情况而变化,所以需要用这个偏移值迅速的从文件中读取到为数据

 

位图信息段:BITMAPINFOHEADER

typedef struct tagBITMAPINFOHEADER
{
        DWORD bitSize;
        LONG    bitWidth;
        LONG    biHeight;
        WORD    biPlanes;
        WORD    bitBitCount;
        DWORD    bitCompression;
        DWORD    bitSizeImage;
        LONG    bitXPelsPerMeter;
        LONG    bitYPelsPerMeter;
        DWORD    biClrUsed;
        DWORD    biClrImporant;
}BITMAPINFOHEADER;

bitSize

说明BITMAPINFOHEADER结构所需要的字节数

bitWidth

说明像素的宽度,以像素为单位

biHeight

说了像素的高度,以像素位单位。

这个值还说明该图像是倒立的图还是正向的图。

如果该值是整数,说明图像是倒向的,即:数据的第一行其实是图像的最后一行

如果该值是一个负值,则图像是正向的。

大多数的BMF文件都是倒立的,也就是说,高度值是一个正数

biPlanes

表示bmp图片的平面属,显然显示器只有一个平面,所以恒为1

bitBitCount

说明比特数/像素,其值为1、4、8、16、24、32

bitCompression

说明图像压缩的类型,其中:

BI_RGB:没有压缩

BI_RLE8:每个像素8比特的RLE压缩编码,压缩格式由2字节组成

BI_RLE4:每个像素4比特的RLE压缩编码,压缩格式由2字节组成

BI_BITFIELDS:每个像素的比特由指定的掩码决定

BI_JPEG:JPEG格式

bitSizeImage

说明图像的大小,以字节为单位。当用BI_RGB格式时,可以设置为0

bitXPelsPerMeter

说明水平分辨率,用像素/米表示

bitYPelsPerMeter

说明垂直分辨率,用像素/米表示

biClrUsed

说明位图实际使用的彩色表中的颜色索引数(0表示使用所以的调色版项)

biClrImporant

说明对图像显示有重要影响的颜色索引的数目,如果是0,表示很重要

调色板

  1. 对于200*200像素,颜色数为16的彩色图。每个像素用R、G、B三个分量表示,每个分量有256个级别,用8位,也就是一个字节,所有每个像素就要用到3个字节。整个图像就要用200*200*3的大小内存来存储。

如果16色图在途中最多有16种颜色。可以采用一个表,表中每一行记录一种颜色的R、G、B值。这样当我们表示一个色素的颜色时,只需要指出该颜色在第几行,即该颜色的索引值即可。比如如果表第0行表示255,0,0(红色),那么当某个色素为红色时,只需要标注0即可。

16种颜色用4bit表示,所以一个像素只需要用到半个字节。整个图像只用200*200*0.5+3*16个字节。

 

这张R、G、B表就是调色板,另一种叫法是颜色查找表。

typedef struct tagPALETTENTRY
{
        BYTE peRed;
        BYTE peFreen;
        BYTE peBlue;
        BYTE peFlags;
}PALETTEENTRY;

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!