位图文件(BMP)

 
位图文件
简介
 
BMP Bitmap File )格式是最常用的图像文件存取格式之一,是微软为其 Windows 环境设置的标准图像格式, BMP 位图文件默认的文件扩展名是“ .BMP ”或者“ .bmp ”,有时它也会以“ .DIB ”或者“ RLE ”为扩展名。用 BMP 格式存放的图像几乎可以被所有的图像显示软件读取。
BMP 图形文件是 Windows 采用的图像文件格式,在 Windows 环境下运行的所有图像软件都支持 BMP 图像文件格式。 Windows 系统内部个图像绘制操作都是以 BMP 为基础的。 Windows3.0 以前的 BMP 文件格式与显示设备有关,因此把这种 BMP 图像文件格式称为设备相关位图( Device Dependent Bitmap,DDB )文件格式。 Windows3.0 以后的 BMP 文件都与显示设备无关,因此把这种 BMP 文件格式称为设备无关位图( Device Independent Bitmap,DIB )格式。
 
BMP 文件格式
摘要
 
         每个 BMP 文件只能存放一张图像。图像数据是否采用压缩方式存放,取决于文件的大小与格式,即压缩处理是 BMP 图像文件的一个选项,用户可以根据需要进行选择。
         其中,非压缩格式是 BMP 图像文件所采用的一种通用格式,它按照一定的顺序忠实的记录图像中每一个像素的颜色值。如果用户确定将 BMP 文件格式压缩处理,则 Windows 设计了一种压缩方式:如果位图为 16 色模式,则采用 RLE4 压缩方式,如果图像为 256 色模式,则采用 RLE8 压缩方式。
         BMP 图像数据文件格式可以存储为单色, 16 色, 256 色和真彩色四种图像数据,其数据的排列顺序与一般文件不同,它以图像的左下角作为起点存储图像,而不是以图像的坐上角为起点。而且 BMP 图像文件格式中还存在另外一个与众不同的特点,即其调色板数据所采用的数据结构中,红,绿,蓝三种基色数据的排列顺序也恰好与其他图像文件格式相反。总之, BMP 图像文件格式拥有许多适合于 Windows 环境的新特色,而且随着 Windows 版本的不断更新,微软也在不断的改进 BMP 图像文件格式。
 
BMP 中包含的域
 
BMP 位图文件是由四个部分组成:位图文件头( bitmap-file header , 位图信息头( bitmap-information header , 调色板( color table )和定义位图的字节阵列(图像数据阵列)。其对应的结构体或类型分别为: BITMAPFILEHEADER,BITMAPINFOHEADER,RGBQUAD,BYTE
1.   位图文件头
位图文件头 BITMAPFILEHEADER
偏移
域的名称
长度 / 字节
内容
0000h 0
bfType
2
两字节的内容用来识别位图的类型,存储的是两个字符的 ASCII 码。
B M (0x4D42):Windows
BA/CT/CP/IC/PT: OS/2
0002h 2
bfSize
4
整个文件的大小
0006h 6
bfReserved1
2
保留未用,必须为 0
0008h 8
bfReserved2
2
保留未用,必须为 0
000Ah 10
bfOffBits
4
从文件开头到图像数据开始之间的字节数,有了该数据能方便地跳过位图的信息头
 
 
2.   位图信息头 BITMAPINFOHEADER
 
偏移
域的名称
长度 / 字节
内容
000Eh 14
biSize
4
文件信息头的长度
40(28h) Windows
00012h 18
biWidth
4
位图的宽度,以像素为单位
00016h 22
biHeight
4
位图的高度,以像素为点为
001Ah 26
Biplanes
2
位图的为平面数(该值总是为 1
001Ch 28
biBitCount
2
每个像素的位平面数,有下面几种情况:
1 :单色位图
4 16 色位图
8 256 色位图
16 16bit 高彩色位图
24 24bit 真彩色位图
32 32bit 增强型真彩色位图
001Eh 30
biCompression
4
压缩说明:
0 :不压缩 ( BI_RGB 表示 )
1 RLE8 ,使用 8 RLE 压缩方式(用 BI_RLE8 表示)
2 RLE4 ,使用 4 RLE 压缩方式(用 BI_RLE4 表示)
3 Bitfields :位域存放方式(用 BI_BITFIELDS 表示)
0022h 34
biSizeImage
4
位图数据的大小,以字节为单位。该数必须是 4 的倍数。当图像存储的是非压缩数据的时候,它的取值可以为 0 ,实际上,此时位图数据的大小可以通过 biBitCount biWidth biHeight 等计算出来
0026h 38
biXPelsPerMeter
4
用像素 / 米表示的水平分辨率
002Ah 42
biYPelsPerMeter
4
用像素 / 米表示的垂直分辨率
002Eh 46
biClrUsed
4
位图使用的颜色数,如果为 0 则表示使用了全部可能的颜色
0032h 50
biClrImportant
4
指定重要的颜色数。当该域的值等于颜色数时(或者等于 0 时),表示所有颜色都一样重要
 
3.   调色板
 
调色板又叫彩色映像表,使用每个像素为 1 4 或者 8 为的图像必须有一个调色板,相对应的调色板的大小分别为 2 16 或者 256 个表项。如果图像没有使用相对应的全部颜色,则调色板仅记录使用过的颜色,此时调色板会小一些。也就是说,如果位图信息头中的 biClrUsed 字段非零,则它记录的是使用的颜色数目,同时它也是彩色映像的表项号码。若该字段为 0 则彩色映像为全大小,也就是说色深为 1 4 8 的图像,调色板分别具有 2 16 256 个表项。
对于 16 为和 24 为的图像,没有调色板,图像是直接 RGB 彩色,此时 biClrUsed 字段不为 0 ,以提供一个建议的调色板大小,不过并没有多少实际意义。
由于显示设备可能不具备图像所需的那么多的颜色,因此彩色映像中的表项在排列顺序应该是最重要的颜色排在前面。位图信息头中的 biClrImportant 字段如果不为 0 ,则指出了对于好的图像重新生成多少种颜色是重要的
彩色映像表 RGBQUAD 结构定义:
偏移
域的名称
长度 / 字节
内容
0
rgbBlue
1
调色板项的蓝色值
1
rgbGreen
1
调色板项的绿色值
2
rgbRed
1
调色板项的红色值
3
rgbReserved
1
保留未用,必须为 0
 
4.   图像数据阵列
 
紧跟在调色板之后的是图像数据阵列,它包含所有的位图数据字节,这些数据可能是彩色调色板的索引号,也可以是实际的 RGB 值。
图像的每一扫描行由表示图像像素的连续的字节组成,每一个扫描行对应的字节数取决于图像的色深和图像的宽度。扫描行是由底向上存储的,这就是说,阵列中的第一个字节表示位于左下角的像素,而最后一个字节表示位图右上角的像素。
图像数据中的阵列可以是压缩的,也可以是不压缩的:每个像素可以用一位表示,也可以用 32 位表示,这些都是由前面讲过相关字段决定。下面分别说明不同色深的位图中图像数据阵列到底是如何排列的。
(1)         色深 1 位的位图
每个像素只用一位表示,每个字节可以表示 8 个像素,字节中的最高位对应于最左边的像素。
(2)         色深 4 位的位图
对没有压缩的图像,每个字节可以表示 2 个像素,高 4 位为左边的像素,且每行填充到一个 4 字节的边界上。
(3)         色深 8 位的位图
 
对没有压缩的图像,每个字节表示一个像素。每行填充到 4 字节边界。
(4)         色深 24 位的位图
 
每个像素用 3 个字节表示,顺序依次为红,绿和蓝的值。每行用 0 填充到 4 字节的边界。

你可能感兴趣的:(数据结构,windows,header,BI,存储,扩展)