关于存储格式的安排(BMP格式介绍)
BMP(全名位图)是Windows操作系统中的标准图像文件格式。
它可以分为两类:设备相关位图(DDB)和设备无关位图(DIB),它的应用非常广泛。
除了图像的深度以外,它使用了一种位图存储格式,除了其他任何压缩方式。因此,BMP文件占用了大量的空间。BMP文件的图像深度可选的税前亏损,4位,8bit、24bit。BMP文件存储数据时,图像是从左到右的顺序进行扫描,从底部到顶部,因为BMP文件格式是在Windows环境下图相关数据交换标准,图形和图像软件在Windows环境下运行,支持BMP图像格式。
形式
一个典型的BMP图像文件由四部分组成:
1:位图文件的数据结构,其中包含BMP图像文件的类型、显示内容等。
2:位图信息数据结构,其中包含bmp图像的宽度、高度、压缩方法以及颜色的定义等信息。
3:调色板,这部分是可选的,需要一些位图调色板,和一些位图,如图(24位真彩色BMP),不需要调色板。
4:位图数据。这个部分的内容根据BMP位图中位数的不同而不同。RGB直接用于24位图,而其他24位使用调色板中的颜色索引。
相应的数据结构
1:BMP文件合成
BMP文件由四部分组成:文件头、位图信息头、颜色信息和图形数据。
2:BMP文件头(14字节)
BMP文件头数据结构包含BMP文件类型、文件大小和位图起始位置的信息。
它的结构定义如下:
typedef struct tagbitmapfileheader
{
字bftype; / /类型的位图文件,必须BM(1-2个字节)
DWORD bfsize; / /位图文件的字节大小(3-6个字节)
字bfreserved1; / /位图文件的保留字,必须是0(8字节)
字bfreserved2; / /位图文件的保留字,必须0(9-10个字节)
DWORD bfoffbits; / /位图数据的起始位置,相对于位图(11-14字节)
偏移量文件头,以字节为单位
} BITMAPFILEHEADER;
3:位图信息头(40字节)
BMP位图信息头的数据是用来说明位图的大小和其他信息的。
tagbitmapinfoheader { typedef struct
DWORD bisize; / /字节数的结构(15-18个字节)
长biwidth;像素位图的宽度(19-22字节)
长biheight; / /位图中的像素高度(23-26字节)
字的双翼; / /目标设备的水平必须是1(27字节)
字bibitcount; / /为每个像素所需的比特数,必须是1(颜色),(29-30字节)
4(16种颜色),8(256种颜色)或24(真彩色)
DWORD bicompression;位图的压缩类型,必须是0(不压缩)、(31-34字节)
(1 / / bi_rle8压缩型2(bi_rle4)或一个压缩型)
DWORD bisizeimage; / /位图的大小,以字节为单位(35-38字节)
长bixpelspermeter;位图的水平分辨率,像素数每米(39-42字节)
长biypelspermeter;位图的垂直分辨率,像素数每米(43-46字节)
DWORD biclrused;在颜色表号位图实际使用(47-50字节)
DWORD biclrimportant; / /位图在数的过程中显示重要的颜色(51字节)
} BITMAPINFOHEADER;
4:颜色表
颜色表用于说明位图中的颜色。它有几个表项。每个表项是一个颜色表项式结构,和一个颜色定义的颜色表项结构定义如下:
tagrgbquad { typedef struct
字节rgbblue; / /蓝色的亮度(范围为0-255)
字节rgbgreen; / /绿色的亮度(范围为0-255)
字节的图像; / /红色的亮度(范围为0-255)
字节rgbreserved; / /预订必须0
}颜色表项;
颜色表中的颜色表项结构数据的数量是bibitcount确定:
当bibitcount = 1,有216256项分别表。
当bibitcount = 24,没有颜色表项。
位图信息头和颜色表构成位图信息。BITMAPINFO结构定义如下:
tagbitmapinfo { typedef struct
BITMAPINFOHEADER bmiHeader; / / bitmap information header
颜色表项bmicolors { 1 }; / /颜色表
} BITMAPINFO;
5:位图数据
位图数据记录位图的每个像素值。记录的顺序是从扫描线的左到右,扫描线之间的直线是从底部到顶部的。位图的像素值中的字节数:
当bibitcount = 1, 8像素占1个字节。
当bibitcount = 4, 2像素占1个字节。
当bibitcount = 8, 1像素占1个字节。
当bibitcount = 24, 1像素占3个字节。
Windows指定扫描线占用的字节数必须为
乘数为4(即长),而不足则为0。
bisizeimage = ((((((((((((( bi.biwidth *双。bibitcount)+ 31)~ 31)/ 8)* bi.biheight;
具体数据的例子:
在BMP文件的开头:
424d 4690000000000000, 4600000028000000, 8000000090000000 0100×1000, 0300000000900000 0000000000000000 0000×0000 a00f a00f 00f8 e007 1f00 0000×02f1 84f1 04f1 84f1,04f1,我们…
文件段
图像文件头
1)1-2:(数字代表单词词0x4d42 = 'bm ',这是一个bmp格式的Windows支持的。(注:ASCII表B 0x42,m0x4d,bftype两字节,B是低字节,高字节M,所以bftype = 0x4d42,不0x424d,但注意)
2)3-6:整个文件size.46900000,为00009046h = 36934。
3)7-8:预订必须设置为0。
4)9-10:预订必须设置为0。
5)11-14:从文件开始到位图数据之间的偏移(14 + 40 + 4 *(2 ^ bibitcount))。46000000、000000 46h = 70,顶层文件头35字= 70字节。
Bitmap information header
6)15-18:对位图信息头长度。
7):在pixels.80000000 19-22的位图的宽度,000000 80h = 128。
8):在pixels.90000000 23-26的位图的高度,000000 90h = 144。
9)日:对位图位图数,它总是1.0100,对0001h = 1。
10)29-30:像素,每像素数。有1(黑白),4(16色),8(256色),16(64K色,高色)、24(1600万色,真彩色),32(4096m色彩,增强真彩色)。1000是0010h = 16。
11)报道:压缩描述:0(未)、1(游程8, 8位RLE压缩),2(游程4, 4位RLE压缩,3(Bitfields,位存储)。RLE只是利用像素和像素值compress.t408使用位域的存储,在两个字节代表一个像素,并分配到图r5b6g5.03000000位场0000000 3H = 3。
12)35-38:字节大小的位图数据,次数必须为4,的值等于(大于或等于4的倍数的位图的最小宽度)×每个像素的位图的高度number.00900000是00009000h = 80×90 = 36864×2h。
13)39-42:水平分辨率的像素/ meters.a00f 0000表示的是0000 0fa0h = 4000。
14)运用:垂直分辨率由像素/ meters.a00f 0000表示的是0000 0fa0h = 4000。
15)47-50:使用颜色指数位图。设置为0时,使用所有的调色板项。
16)技术指标:颜色,对图像显示的重要影响数。如果是0,重要的是表达。
彩板
17)(55+0)至(50±2 ^ bibitcount):彩板规范。每个表项中的调色板,下面的方法是用来描述RGB值:
蓝色组件的1字节
1字节的绿色组件
1字节用于红色组件
用于填充字符的1字节(设置为0)
彩色印版不用于24位真彩色图像,因为位图中的RGB值表示每个像素的颜色。
例如,彩色板00f8 0000 e007 0000 1f00 000000000000,这:
00f8是f800h = 11111 00000000000(二进制),蓝色的成分的面膜。
e007是07e0h = 00000 111111 00000(元),一个为绿色成分的面膜。
1f00是001fh = 00000000000 1 { 1 } 1111(二进制),一个红色的成分的面膜。
0000的总数是0。
每个颜色分量的值可以通过使用掩模和像素值和移位操作得到。看着面具,你可以了解的事实,在两字节的16位每个像素值,5, 6,和5位的5, 6,和5位的r值、G和B分别取出组件的值后,将R、G、B 8, 4和8的值,第一部分是一个字节。然后将三个字节合并成RGB,并放入内存(也可以是倒序),可以转换成24位标准BMP格式。
图像数据阵列
18)55(没有调色板)- bfsize:每两个字节一个像素。数组中的第一个字节代表位图的左下角的像素,和最后一个字节表示像素的位图的右上角。
存储算法
BMP文件通常是不压缩的,所以他们通常比压缩图像文件格式的图像要大得多。例如,一个800×600的24位几乎占据了1.4mb空间。所以他们通常不适用于网络传输或其他低速或容量有限的媒体。根据不同的颜色深度,一个像素的图像可以由一个或多个字节来表示。它是由n / 8确定(比特深度,是N和1字节包含8个数据位),图片浏览器,等,计算基于字节的ASCII值的像素的颜色,然后读取面板中的相应值。有关详细信息,请参阅下面的位图文件的一部分。位图近似字节数为2n位n位可以通过以下公式计算:BMP文件的大小约等于54 + 4 * 2的N +(宽×高×n)/ 8,其中高度和宽度都是像素。注54上述公式是位图文件头的重要,和调色板的大小。另一个要注意的是,这是一个近似值。对于n位的位图图像,虽然可能有一个最大的2n的颜色,一个特定的图像可能无法使用所有这些颜色。用作调色板只定义了图像中使用的颜色,实际的颜色要比调色板。如果你想知道这些值是如何得到的,请参阅以下文件格式的部分。由于存储算法确定的因素,计算大小根据不同的图像参数,将从实际文件大小略有不同。