BMP文件分析及用文件分析及用python读取读取
一、一、BMP文件分析文件分析
1. 什么是什么是BMP(位图位图)?
常见的图像文件格式有:BMP、JPG(JPE,JPEG)、GIF等。
BMP图像文件(Bitmap-File)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。Windows 3.0以后的BMP文
件都是指设备无关位图(DIB,device-independent bitmap)。BMP位图文件默认的文件扩展名是.BMP,有时它也会以.DIB或.RLE作扩展名。BMP格式的图片,没
有使用任何压缩算法,这种方式在以前使用的比较多,现在用的就比较少了,不过为了学习图像处理算法,所以先以该种格式的文件开头。
2.BMP文件的结构文件的结构
BMP文件由四部分组成,这四部分共同形成一个图像文件,缺一不可
位图文件头位图文件头(bitmap-file header)
该部分一共有14个字节。可以提供文件的格式、大小等信息
typedef struct tagBITMAPFILEHEADER
{
UINT16 bfType; // 说明位图类型 2字节
DWORD bfSize; // 说明位图大小 4字节
UINT16 bfReserved1; // 保留字,必须为0 2字节
UINT16 bfReserved2; // 保留字,必须为0 2字节
DWORD bfOffBits; // 从文件头到实际的图像数据的偏移量是多少 4字节
} BITMAPFILEHEADER; //一共16个字节
位图信息头位图信息头(bitmap-informationheader)
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; // 说明该结构一共需要的字节数 2字节
LONG biWidth; // 说明图片的宽度,以像素为单位 4字节
LONG biHeight; // 说明图片的高度,以像素为单位 4字节
WORD biPlanes; //颜色板,总是设为1 2个字节
WORD biBitCount; //说明每个比特占多少bit位,可以通过这个字段知道图片类型 2个字节
DWORD biCompression; // 说明使用的压缩算法 2个字节 (BMP无压缩算法)
DWORD biSizeImage; //说明图像大小 2个字节
LONG biXPelsPerMeter; //水平分辨率 4字节 单位:像素/米
LONG biYPelsPerMeter; //垂直分辨率4字节
DWORD biClrUsed; //说明位图使用的颜色索引数 4字节
DWORD biClrImportant; //4字节
} BITMAPINFOHEADER; // 一共40个字节
作为真彩色位图,我们主要关心的是biWidth和biHeight这两个数值,两个数值告诉我们图像的尺寸。biSize,biPlanes,biBitCount这几个数值是固定的。想偷懒
的话,其它的数值可以一律用0来填充。
颜色表颜色表(color table)
紧跟在位图信息头后面的就是数据就是颜色表了,颜色表是形如一个二维数组,4个字节为一行,这四个字节分别代表了R、G、B ,Alpha(透明度通道)的分量。
通过位图数据,我们就可以对这像素进行着色。注意,如果位图是24位真彩色图像,那么就没有颜色表。
位图点阵数据位图点阵数据(bits data)
在颜色表后面的就是像素点数据了,如果bmp是伪彩色图的话,那么每个像素只占8位,即一个字节。如果bmp是24位真彩色图像的话,那么每个像素占24位,即
3个字节,3个字节分别为B、G、R颜色分量。
另外,我们需要注意的是,另外,我们需要注意的是,bmp位图,其像素的排列方式是从下到上,从左到右。也就是说,我们读取位图数据的第一个字节是左下角的像素值。位图,其像素的排列方式是从下到上,从左到右。也就是说,我们读取位图数据的第一个字节是左下角的像素值。
我还没需要注意的是,我还没需要注意的是,Windows系统中有系统中有“补零补零”的习惯!即要求位图的每一行像素所占字节数必须被的习惯!即要求位图的每一行像素所占字节数必须被4整除。若不能倍整除。若不能倍4整除,则在该位图每一行的十六进制码末整除,则在该位图每一行的十六进制码末
尾尾“补补”1至至3个字节的个字节的“00”。。 下面举一个例子下面举一个例子
下面这幅图片是256色伪彩色图像,大小为501*502。
现在我们来计算一下理论大小
像素数量=501 * 502=251502
像素所占字节=像素数量=251502个字节
评论0