BMP文件格式的及应用
1. BMP文件的组成
BMP文件的结构分成3 块或4块,分别是 文件头,文图信息头, 颜色表, 位图数据。
对于真彩色图片,没有颜色表这块,所以它的结构分成3块。
该结构列表如下:
BMP文件格式
模块 组 成 内 容
文件头 包含文件的大小、文件类型、图像数据偏离文件头的长度
位图信息头 信息头尺寸、图像用几个比特数值表示一个像素、图像是否压缩、图像所用的颜色数
颜色信息 包含图像所用到的颜色表,显示图像时需用到这个颜色表来生成调色板,但如果图像为真彩色,既图像的每个像素用24个比特来表示,文件中就没有这一块信息,也就不需要操作调色板。
图形数据 表示图像的相应的像素值
各模块的数据结构如下:
数据结构:
文件头
typedef struct ITMAPFILEHEADER{
WORD bfType; // 位图文件的类型,必须为“BM”DWORD
bfSize; // 位图文件的大小,以字节为单位WORD
bfReserved1; //保留字,必须为0WORD
bfReserved2; //保留字,必须为0DWORD
bfOffBits; // 位图数据的偏移量,以字节为单位
} BITMAPFILEHEADER; 该结构占据14个字节。
位图信息头
typedef struct ITMAPINFOHEADER{
DWORD biSize; // 本结构所占用字节数LONG
biWidth; // 位图的宽度,以像素为单位LONG
biHeight; // 位图的高度,以像素为单位WORD
biPlanes; // 须为1WORD
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; 该结构占据40个字节。
颜色信息
typedef struct tagRGBQUAD {
BYTE rgbBlue; // 蓝色的亮度(值范围为0-255)BYTE
rgbGreen; // 绿色的亮度(值范围为0-255)BYTE
rgbRed; // 红色的亮度(值范围为0-255)BYTE
rgbReserved; // 保留,必须为0
} RGBQUAD;
图形数据 表示图像的相应的像素值
2. BMP文件数据存储特点
对于整个文件 从左到右, 从下到上(最下一行 To 最上一行)
对于每行 从左到右
每行存储 字节数须为4(long型)的倍数,不足要以0补齐
3. BMP文件分析
windows 下该文件属性为: 96*9, 单色, 170Bytes
分析类容的结果是:
文件头:
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; 0x4D42
DWORD bfSize; AA (170Bytes)
WORD bfReserved1; 0
WORD bfReserved2; 0
DWORD bfOffBits; 3E (62)
} BITMAPFILEHEADER;
位图信息头:
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; //表示本结构的大小 28 (40Bytes)
LONG biWidth; //位图的宽度 60 (96)
LONG biHeight; //位图的高度 09 (09)
WORD biPlanes; // 1
WORD biBitCount; //位图的位数 分为1 4 8 16 24 32 本文没对1 4 进行研究 1
DWORD biCompression; //本以为压缩类型,但是却另外有作用,稍候解释 0
DWORD biSizeImage; //表示位图数据区域的大小以字节为单位 6c (108)
LONG biXPelsPerMeter; 0EC4
LONG biYPelsPerMeter; 0EC4
DWORD biClrUsed; 0
DWORD biClrImportant; 0
} BITMAPINFOHEADER;
颜色表:
FF FF , FF 00 , 00 00 , 00 00
分别是: R G B 保留
共计 4 Bytes, 后面的就是数据区了。数据是108Bytes, 即信息头中biSizeImage 的值
4.
BMP使用的格式:
1. 从位图底端开始扫描,以横向32bit (4Bytes) 为单位,不足4Bytes, 按照
4Bytes计算。
2. 扫描过程中,不足部分用0填充。
3. 横向左边为高位,右边为低位。
因此,对于 PixWidth * PixHeight 的单色图片,
BMP文件大小为:
(横向: 1――32 按照 32; 33――64 按照64…..)
BMPData:
(( PixWidth -1) / 32 +1)*32 * PixHeight Bits
5. 一些概念
对于 PixWidth * PixHeight 的单色BMP位图,有这些关系(实际上文件并部分行和列):
BMP格式:
每行的字节数: ((PixWidth-1)/32+1)*4
共有PixHeight 行
有效行 ((PixWidth-1)/8+1)
概 念 描述
色深 1,4,8,16,24
颜色数 表示有多少种颜色,例如256色
灰度图像 Eg. 8位的BMP图片相当于把黑白分成256级,0为黑,255为白。该数值表示灰度或亮度。我们称这种图片为灰度图,单色图和灰度图称黑白图,与之对应的是彩色图
RGB R对应红,G对应绿,B对应蓝色,它们统称为三基色