没有合适的资源?快使用搜索试试~ 我知道了~
BMP位图数据结构 介绍c编程中bmp格式图片的相关信息
5星 · 超过95%的资源 需积分: 10 31 下载量 111 浏览量
2010-09-21
11:15:56
上传
评论 1
收藏 107KB DOC 举报
温馨提示
试读
30页
1:BMP文件组成 BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。 2:BMP文件头 BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。 其结构定义如下: typedef struct tagBITMAPFILEHEADER { WORD bfType; // 位图文件的类型,必须为BM DWORD bfSize; // 位图文件的大小,以字节为单位 WORD bfReserved1; // 位图文件保留字,必须为0 WORD bfReserved2; // 位图文件保留字,必须为0 DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为单位 } BITMAPFILEHEADER; 3:位图信息头
资源推荐
资源详情
资源评论
1:BMP 文件组成
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:颜色表
颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个 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;
5:位图数据
位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从
下到上。位图的一个像素值所占的字节数:
当 biBitCount=1 时,8 个像素占 1 个字节;
当 biBitCount=4 时,2 个像素占 1 个字节;
当 biBitCount=8 时,1 个像素占 1 个字节;
当 biBitCount=24 时,1 个像素占 3 个字节;
Windows 规定一个扫描行所占的字节数必须是
4 的倍数(即以 long 为单位),不足的以 0 填充,
biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) * bi.biHeight;
具体数据举例:
如某 BMP 文件开头:
424D 4690 0000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 0100*1000 0300 0000
0090 0000 A00F 0000 A00F 0000 0000 0000 0000 0000*00F8 0000 E007 0000 1F00 0000 0000
0000*02F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2 .... ....
BMP 文件可分为四个部分:位图文件头、位图信息头、彩色板、图像数据阵列,在上图中
已用*分隔。
一、图像文件头
1)1:(这里的数字代表的是"字",即两个字节,下同)图像文件头。424Dh=’BM’,表示是
Windows 支持的 BMP 格式。
2)2-3:整个文件大小。4690 0000,为 00009046h=36934。
3)4-5:保留,必须设置为 0。
4)6-7:从文件开始到位图数据之间的偏移量。4600 0000,为 00000046h=70,上面的
文件头就是 35 字=70 字节。
二、位图信息头
5)8-9:位图图信息头长度。
6)10-11:位图宽度,以像素为单位。8000 0000,为 00000080h=128。
7)12-13:位图高度,以像素为单位。9000 0000,为 00000090h=144。
8)14:位图的位面数,该值总是 1。0100,为 0001h=1。
9)15:每个像素的位数。有 1(单色),4(16 色),8(256 色),16(64K 色,高
彩色),24(16M 色,真彩色),32(4096M 色,增强型真彩色)。1000 为 0010h=16。
10)16-17:压缩说明:有 0(不压缩),1(RLE 8,8 位 RLE 压缩),2(RLE 4,4
位 RLE 压缩,3(Bitfields,位域存放)。RLE 简单地说是采用像素数+像素值的方式进行
压缩。T408 采用的是位域存放方式,用两个字节表示一个像素,位域分配为 r5b6g5。图中
0300 0000 为 00000003h=3。
11)18-19:用字节数表示的位图数据的大小,该数必须是 4 的倍数,数值上等于(≥
位 图 宽 度 的 最 小 的 4 的 倍 数 ) × 位 图 高 度 × 每 个 像 素 位 数 。 0090 0000 为
00009000h=80×90×2h=36864。
12)20-21:用象素/米表示的水平分辨率。A00F 0000 为 0000 0FA0h=4000。
13)22-23:用象素/米表示的垂直分辨率。A00F 0000 为 0000 0FA0h=4000。
14)24-25:位图使用的颜色索引数。设为 0 的话,则说明使用所有调色板项。
15)26-27:对图象显示有重要影响的颜色索引的数目。如果是 0,表示都重要。
三、彩色板
16)28-....(不确定):彩色板规范。对于调色板中的每个表项,用下述方法来描述 RGB
的值:
1 字节用于蓝色分量
1 字节用于绿色分量
1 字节用于红色分量
1 字节用于填充符(设置为 0)
对于 24-位真彩色图像就不使用彩色板,因为位图中的 RGB 值就代表了每个象素的颜
色。
如,彩色板为 00F8 0000 E007 0000 1F00 0000 0000 0000,其中:
00FB 0000 为 FB00h=1111100000000000(二进制),是红色分量的掩码。
E007 0000 为 07E0h=0000011111100000(二进制),是绿色分量的掩码。
1F00 0000 为 001Fh=0000000000011111(二进制),是红色分量的掩码。
0000 0000 总设置为 0。
将掩码跟像素值进行“与”运算再进行移位操作就可以得到各色分量值。看看掩码,就
可以明白事实上在每个像素值的两个字节 16 位中,按从高到低取 5、6、5 位分别就是
r、g、b 分量值。取出分量值后把 r、g、b 值分别乘以 8、4、8 就可以补齐第个分量为一个
字节,再把这三个字节按 rgb 组合,放入存储器(同样要反序),就可以转换为 24 位标准
BMP 格式了。
四、图像数据阵列
17)27(无调色板)-...:每两个字节表示一个像素。阵列中的第一个字节表示位图左
下角的象素,而最后一个字节表示位图右上角的象素。
五、存储算法
BMP 文件通常是不压缩的,所以它们通常比同一幅图像的压缩图像文件格式要大很多。例
如,一个 800×600 的 24 位几乎占据 1.4MB 空间。因此它们通常不适合在因特网或者其它
低速或者有容量限制的媒介上进行传输。 根据颜色深度的不同,图像上的一个像素可以用
一个或者多个字节表示,它由 n/8 所确定(n 是位深度,1 字节包含 8 个数据位)。图片浏
览器等基于字节的 ASCII 值计算像素的颜色,然后从调色板中读出相应的值。更为详细的
信息请参阅下面关于位图文件的部分。 n 位 2n 种颜色的位图近似字节数可以用下面的公式
计算: BMP 文件大小约等于 54+4*2 的 n 次方+(w*h*n)/8
,其中高度和宽度都是像素数。 需要注意的是上面公式中的 54 是位图文件的文件头,是
彩色调色板的大小。另外需要注意的是这是一个近似值,对于 n 位的位图图像来说,尽管
可能有最多 2n 中颜色,一个特定的图像可能并不会使用这些所有的颜色。由于彩色调色板
仅仅定义了图像所用的颜色,所以实际的彩色调色板将小于。 如果想知道这些值是如何得
到的,请参考下面文件格式的部分。 由于存储算法本身决定的因素,根据几个图像参数的
不同计算出的大小与实际的文件大小将会有一些细小的差别。
位图格式 是 的缩写形式, 顾名思义,就是位图也即
位图。它一般由 部分组成:文件头信息块、图像描述信息块、颜
色表(在真彩色模式无颜色表)和图像数据区组成。在系统中以 为扩展名
保存。
打开 的画图程序,在保存图像时,可以看到三个选项: 色位
图(黑白)、 色位图、 色位图和 位位图。
现在讲解 的 个组成部分:
文件头信息块
:文件标识,为字母 码“。
:文件大小。
:保留,每字节以“填写。
:记录图像数据区的起始位置。各字节的信息含义依次为:
文件头信息块大小,图像描述信息块的大小,图像颜色表的大小,保留(为
)。
图像描述信息块
:图像描述信息块的大小,常为 !"。
:图像宽度。
:图像高度。
:图像的 #$ 总数(恒为 )。
:记录像素的位数,很重要的数值,图像的颜色数由该值决
定。
:数据压缩方式(数值位 :不压缩;:! 位压缩;: 位
压缩)。
:图像区数据的大小。
:水平每米有多少像素,在设备无关位图()中,每字节
以 " 填写。
:垂直每米有多少像素,在设备无关位图()中,每字
节以 " 填写。
%:此图像所用的颜色数,如值为 ,表示所有颜色一样重要。
%颜色表
颜色表的大小根据所使用的颜色模式而定: 色图像为 ! 字节; 色图像
位 字节; 色图像为 字节。其中,每 字节表示一种颜色,并以
(蓝色)、&(绿色)、'(红色)、#((% 位位图的透明度值,一般不
需要)。即首先 字节表示颜色号 的颜色,接下来表示颜色号 的颜色,依
此类推。
图像数据区
颜色表接下来位是位图文件的图像数据区,在此部分记录着每点像素对应
的颜色号,其记录方式也随颜色模式而定,既 色图像每点占 位; 色图像
每点占 位; 色图像每点占 ! 位;真彩色图像每点占 位。所以,整个
数据区的大小也会随之变化。究其规律而言,可的出如下计算公式:图像数据
信息大小)(图像宽度*图像高度*记录像素的位数)+!。 然而,未压缩的图像
信息区的大小。除了真彩色模式外,其余的均大于或等于数据信息的大小。这
是为什么呢?原因有两个:
,,,,,,, 文件记录一行图像是以字节为单位的。因此,就不存在一个
字节中的数据位信息表示的点在不同的两行中。也就是说,设显示模式位
色,在每个字节分配两个点信息时,如果图像的宽度位奇数,那么最后一个像
素点的信息将独占一个字节,这个字节的后 位将没有意义。接下来的一个字
节将开始记录下一行的信息。
,,,,,,,为了显示的方便,除了真彩色外,其他的每中颜色模式的行字节数
要用数据“补齐为 的整数倍。如果显示模式为 色,当图像宽为 时,
存储时每行则要补充 -+./0) 个字节(加 是因为里面有一个像素
点要独占了一字节)。如果显示模式为 色,当图像宽为 时,每行也要
补充 0) 个字节。
文件大体上分成四个部分。
位图文件头 123 " '、位图信息头 1425" '
、调色板 #$$、实际的位图数据 6$$
第一部分为位图文件头 123 " ',是一个结构,其定义如下:
剩余29页未读,继续阅读
资源评论
- kingofwar32014-05-24还不错的算法
shanxifanshi
- 粉丝: 0
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功