2024年6月13日发(作者:)
Bmp格式详解
更新请参见博客地址
/%C1%B5%D0%C4hjb/blog/item/
用UltraEdit打开一个24bit的bmp(对于一些头信息计算上需要注意的是,x86体系结构下是
小端模式,即数据低位在低地址),其中的二进制数据由文件头、位图信息头、颜色信息(或
称为色表、调色板等)和图形数据四部分组成。
前三个部分后续转载文中会有详细叙述,对于图形数据,有以下几个要点需要了解:
(1)Windows规定图像文件中一个扫描行所占的字节数必须是4的倍数(即以字为单位),不足
的以0填充。比如7*7像素的图像,每一行原始是7*3=21字节数据,由于非4字节对齐故
会补三字节的0x00数据,使得每行为24字节数据。
(2)所有的bmp数据扫描行是上下颠倒的。也就是说一幅图片先绘制底部的像素,再绘制顶
部的像素,所以这些bmp数据所表示的像素点就是从图片的左下角开始,一直表示到图片
的右上角。
(3)Bmp数据的存储格式为BGR顺次存储。大家不能习惯性地认为是RGB顺次存储。
以下部分内容转载自/share/detail/6982516
BMP文件中文称为位图文件,实际上取自Bit Map的缩写。位图分为四种:
线画稿:只有黑白两种颜色,所以像素用0,1表示。
灰度图象:在灰度图像中,像素灰度用8bit表示,像素灰度级用8bit表示,所以每个像素
都是介于黑色和白色之间的256种 的灰度的一种。
索引图像:在真彩色出现之前,由于技术上的原因,计算机在处理时并没有达到每像素24
位的真彩色水平,为此人们创造了索引颜色。索引颜色通常也被称为映射 颜色,在这种模
式下,颜色都是预先定义的,并且可供选用的一组颜色也有限,索引颜色的图像最多只能显
示256种 颜色。一幅索引颜色图像在图像文件里定义,当打开该文件时,构成该图像具体
颜色的索引值就被读入程序里,然后根据索引值找到最终的颜色。
真彩色图像:在真彩色图像中,每一个像素由红、绿和蓝三个字节组成,每个字节为8bit,
表示0~255之间的不同的亮度值,这三个字节组合可以产生1670万种不同的颜色。
文件组成
BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。
2. BMP文件头
BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。
其结构定义如下:
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // 位图文件的类型,必须为BM
DWORD bfSize; // 位图文件的大小,以字节为单位
WORD bfReserved1; // 位 图文件保留字,必须为0
WORD bfReserved2; // 位 图文件保留字,必须为0
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图
// 文件头的偏移量表示,以字节为单位
} BITMAPFILEHEADER;
3. 位图信息头
BMP位图信息头数据用于说明位图的尺寸等信息。
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // 本结构所占用字节数
LONG biWidth; // 位图的宽度,以像素为单位
LONG biHeight; // 位图的高度,以像素为单位
WORD biPlanes; // 目标设备的级别,必须为1
WORD biBitCount // 每个像素所需的位数,必须是1(双色),
// 4(16色),8(256色)或24(真彩色)之一
DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),
// 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
DWORD biSizeImage; // 位图的大小,以字节为单位
LONG biXPelsPerMeter;// 位图水平分辨率,每米像素数
LONG biYPelsPerMeter;// 位图垂直分辨率,每米像素数
DWORD biClrUsed; // 位图实际使用的颜色表中的颜色数
DWORD biClrImportant;// 位图显示过程中重要的颜色数
} BITMAPINFOHEADER;
4. 颜色表
是单色、16色、256色图像文件所特有的,相对应的调色板大小是2、16、和256,
调色板以4字节为单位,每4个字节存放一个颜色值。图像的数据是指向调色板的索引。
颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型
的结构,定义一种颜色。RGBQUAD结构的定义如下:
typedef struct tagRGBQUAD {
BYTE rgbBlue; // 蓝色的亮度(值范围为0-255)
BYTE rgbGreen; // 绿色的亮度(值范围为0-255)
BYTE rgbRed; // 红色的亮度(值范围为0-255)
BYTE rgbReserved;// 保留,必须为0
} RGBQUAD;
颜色表中RGBQUAD结构数据的个数有biBitCount来确定:
当biBitCount=1,4,8时,分别有2,16,256个表项;
当biBitCount=24时,没有颜色表项。
位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader; // 位图信息头
RGBQUAD bmiColors[1]; // 颜色表
} BITMAPINFO;
发布评论