BMP文件的编码方式
BMP文件解码代码

BMP是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。
随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。
这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点--占用磁盘空间过大。
所以,目前BMP在单机上比较流行。
BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP 图象文件格式。
Windows系统内部各图像绘制操作都是以BMP为基础的。
Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。
Windows 3.0以后的BMP图象文件与显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB(device-independent bitmap)格式(注:Windows 3.0以后,在系统中仍然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的是为了让Windows能够在任何类型的显示设备上显示所存储的图象。
BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。
位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列,它具有如下所示的形式。
位图文件的组成结构名称符号位图文件头(bitmap-file header) BITMAPFILEHEADER bmfh位图信息头(bitmap-information header) BITMAPINFOHEADER bmih彩色表(color table) RGBQUAD aColors[]图象数据阵列字节BYTE aBitmapBits[]位图文件结构可综合在表6-01中。
bmp哈夫曼编码实验报告

多媒体技术与基础实验——huffman编码实验一:Huffman编码一、实验内容1、了解BMP图像的格式,实现BMP图片格式的数据域及文件头的分离2、熟悉Huffman编码原理3、用C语言使用Huffman编码算法对给定图像文件进行编码二、设计思路1、BMP文件的前54字节是与具体图像无关的文件头信息,进行哈夫曼编码时不需要对这部分进行编码。
2、哈夫曼编码基于图像统计特征的变长编码方法概率小的符号用较长的码字表示,概率大的符号用较短的码字表示。
3、霍夫曼编码的步骤:1)根据待编码的符号串,统计各个符号的概率;2)根据符号的概率统计特征,构建霍夫曼编码表,即计算每个符号的编码结果;3)用得到的编码表对符号序列进行编码。
三、相关知识1、Huffman Tree的定义假设有n个权值{w1,w2,w3......wn},试构造一棵有n个叶子节点的二叉树(节点总数为m=2*n-1),每个叶子带权值为wi,其中WPL(树带权路径)最小的二叉树成为Huffman树或者最优二叉树。
2、如何构造Huffman Tree(1).根据给点的n个权值{w1,w2,w3.....wn}构成n棵二叉树的集合F={T1,T2,T3......Tn},其中每棵二叉树只有个带有权值Wi的根节点,其左右子树为空。
(2).在F中选取两棵根结点的权值最小的树作为左右子树构造一个新二叉树,新根权值为左右子树权值之和。
(3).在F中delete掉这两棵树,插入新二叉树到F中。
(4).重复(2)和(3),直到F中只含一棵树,此数位Huffman Tree。
四、实验结果平均码字长度为7.57,编码效率为0.9967。
实验结果分析:哈夫曼编码是动态变长编码,对每一个图像,临时建立概率统计表和编码树,算法速度比静态编码慢,但压缩效果最好。
但是对具有很多不同颜色的图像时,哈夫曼编码的平均码字长度将增大,编码效率将下降,故需改进哈夫曼算法,例如采用截断哈夫曼算法等。
BMP编码

Microsoft Windows 3.0中的画笔(Paintbrush)工具软件为用户提供了强有力的图形绘制和编辑功能,例如图形的旋转、缩放、拼接等[1].利用这些功能可以非常方便地生成所需要的各种复杂的彩色画面.生成的画面以位图文件的格式存储在磁盘上.以此文件为资源,在Mircosoft Windows 3.0的支持下,可以在任何需要的时候在任何设备上再现该画面[2].在实际工作中经常遇到这样的问题:在利用画笔工具软件生成了所需的画面之后,能否脱离开Windows的支持,在其它系统中使用这些画面呢?解决这一问题的关键在于了解位图文件的记录格式.只要了解位图文件的记录格式,这一问题是容易解决的.基于这一目的,文本将详细介绍Mircosoft Windows 3.0位图文件的记录格式.Microsoft Windows 3.0位图文件(以.BMP为扩展名)由以下三个部分组成:* 位图文件头(BITMAPFILEHEADER) 数据结构* 位图信息(BITMAPINFO)数据结构* 位图阵列一. 位图文件头的结构位图文件头数据结构含有位图文件的类型、大小和打印格式等信息.在Windows.h中对其进行了定义:Typedef struct tagBITMAPFILEHEADER{WORD bfType; /*位图文件的类型,必须为BM. */DWORD bfSize; /*位图文件的大小,以字节为单位. */WORD bfReserved1; /*位图文件保留字,必须为0. */WORD bfReserved2; /* 位图文件保留字,必须为0. */DWORD bfoffbits; /*位图阵列的起始位置,以相对于位图文件*//*头的偏移量表示,以字节为单位.*/}BITMAPFILEHEADER;二. 位图信息的结构位图信息数据结构含有位图文件的尺寸和颜色等信息.在Windows.h中对其进行了定义:typedef stuc tagBITMAPINFO{BITMAPINFOHEADER bmiHeader;RGBQUAD bmiColor[];}BITMAPINFO;1.bmiHeader是一个位图信息头(BIMMAPINFOHEADER)类型的数据结构,用于说明位图的尺寸. BITMAPINFOHEADER的定义:typedef struct tagBITMAPINFOHEADER{DWORD BiSize; /*bmiHeader的长度,以字节为单位.*/DWORD biWidth; /*位图的宽度,以象素为单位.*/DWORD biHight; /*位图的高度,以象素为单位.*/WORD biPlanes; /*目标设备的级别,必须为1.*/WORD biBitCount; /*每个象素所需的位数,必须是1(单色).*//*4(16色),8(256色),或24(2^24色)之一. */ DWORD biCompress; /*位图的压缩类型,必须是0(不压缩).*//*1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一.*/ DWORD biSizeImage; /*位图的大小,以字节为单位.*/DOWRD biXPeIsPerMeter; /*位图的目标设备水平分辨率,以每米象素数为单位.*/DWORD biYPeIsPerMeter; /*位图的目标设备水平分辨率,以每米象素数为单位.*/DWORD biCIrUsed; /*位图实际使用的颜色表中的颜色变址数,详见[3].*/DWORD biCIrImprotant; /*位图显示过程中被认为重要颜色的变址数,详见[3]*/}BITMAPINFOHEADER;2. bimColor[]是一个颜色表,用于说明位图中的颜色.它有若干个表项,每一表项是一个RGBQUAD类型的结构,定义了一种颜色.RGBQUAD的定义:Typedef tagRGBQUAD{BYTE rgbBlue;BYTE rgbGreen;BYTE rgbRed;BYTE rgbReserved;}RGBQUAD;在RGBQUAD定义的颜色中,蓝色的亮度由rgbBlue来定,绿色的亮度由rgbGreen来定,红色的亮度由rgbred来定,rgbRserved必须为0.例如: 若某表项为00,00,FF,00, 那么它定义的颜色为纯红色.bimColor[]表项的个数由bmBitCount来定:当bmBitCount=1,4,8时, bimColor[]分别有2,16,256个项.若某点的象素值为n,则该象素的颜色为bimColor[]所定义的颜色.当bmBitCount=24时, bimColor[]的表项为空.位图阵列的每3个字节代表一个像素,这3个字节直接定义了象素颜色中蓝、绿、红的相对亮度,因此省去了bimColor[]颜色表.三. 位图阵列的结构位图阵列记录了位图的每一个象素值.在生成位图文件时,Windows从位图的左下角开始(即从左到右从上到下)逐行扫描位图,将位图的象素值一一记录下来.这些记录象素值的字节组成了位图阵列.位图阵列有压缩和非压缩两种存储格式.1.非压缩格式在非压缩格式中,位图的每一点的象素值值一对应于位图阵列的若干位(bit),位图阵列的大小由位图的宽度,高度及位图的颜色数(bitBITCount)决定.(1) 位图扫描行与位图阵列的关系设记录一个扫描行的象素值需n个字节,则:位图阵列的0~n-1个字节记录了位图的第一个扫描行的象素值;位图阵列的n~2n-1个字节记录了位图的第二个扫描行的象素值;依些类推,位图阵列的(m-1)*n~m*n-1个字节记录了位图的第m个扫描行的象素值.位图阵列的大小为n*biHight.当(biWith*bitBITCount)mod32=0时:n=(biWith*biBITCount)/8当(biWith*bitBITCount)mod32!=0时:n=(biWith*biBITCount)/8+4上式中的+4而不+1的原因是为了使一个扫描行的象素值占用位图阵列的字节数为4的倍数(Windows规定其必须在long边界结束),不足的位用0填充.(2)位图象素值与位图阵列的关系(以第m扫描行为例)设记录第m个扫描行的象素值的n个字节分别为:a0,a1,a2,...,则:当bitBITCount=1时:a0的D7位记录了位图的第m个扫描行的第1个象素值,D6位记录了位图的第m个扫描行的第1个象素值,..., D0位记录了位图的第m个扫描行的第8个象素值, a1的D7位记录了位图的第m个扫描行的第9个象素值,D6位记录了位图的第m 个扫描行的第10个象素值,...当bitBITCount=4时:a0的D7-D4位记录了位图的第m个扫描行的第1个象素值,D3-D0位记录了位图的第m个扫描行的第2个象素值, a1的D7-D4位记录了位图的第m个扫描行的第3个象素值,...当bitBITCount=8时:a0的D7-D4位记录了位图的第m个扫描行的第1个象素值,a1记录了位图的第m个扫描行的第2个象素值,...当bitBITCount=24时:a0,a1,a2位记录了位图的第m个扫描行的第1个象素值,a3,a4,a5记录了位图的第m个扫描行的第2个象素值,...位图其它扫描行的象素值与位图阵列的对应关系与此类似.2. 压缩格式Windows支持BI_RLE8及BI_RLE4压缩位图存储格式,减少了位图阵列所占用的磁盘空间.(1)BI_RLE8压缩格式当bicompression=1时,位图文件采用此压缩编码格式.压缩编码以两个字节为基本单位.其中第一个字节规定了用两个字节指定的颜色重复画出的连续象素的数目.例如,压缩编码05 04表示从当前位置开始连续显示5个象素,这5个象素的象素值均为04. 在第一字节为零时,第二字节有特殊的含义:0: 行末1: 图末2: 转义后面的两个字节,用这俩个字节分别表示下一个象素从当前位置开始的水平位移和垂直位移.n(0x03<n<xff):转义后面的n个字节,其后的n象素分别用这n个字节所指定的颜色画出.注意:实际编码时必须保证后面的字节数是4的倍数.不足的位用0补齐.例如,压缩编码00 00表示开始新的扫描行,压缩编码00 01表示压缩位图阵列结束,压缩编码00 02 05 01表示从当前位置开始向右移5个象素,向下移1行后再画下一个象素,压缩编码00 03 05 06 07 00表示从当前位置开始连续画3个象素,3个象素的颜色分别为05,06,07,最后面的00是为了保证被转义的字节数是4的倍数.(2)BI_RLE4压缩格式当bicompression=4时,位图文件采用此后压缩编码格式.BI_RLE4的压缩编码格式与BI_RLE8的编码方式类似,维一的不同是:BI_RLE4的一个字节包含了两个象素的颜色.当连续显示时,第一个象素按字节高四位规定的颜色画出,第二个象素按字节低似位规定的颜色画出,第三个象素按字节高四位规定的颜色画出,...,直到所有象素都画出为止.例如:压缩编码06 67表示从当前位置开始连续画5个象素,5个象素的颜色分别为6,7,6,7,6.压缩编码00 04 45 67 00表示从当前位置开始连续画4个象素, 4个象素的颜色分别为4,5,6,7.最后面的00是为了保证被转义的字节数是4的倍数.四. 实例分析为了更清楚地说明位图文件的格式,下面对存储一个简单划面(如附图所示)的位图文件进行具体分析.画面的底色是蓝色,上面的直线的颜色是黄色,下面的直线的颜色是红色.位图以16色位映象方式存储[1],文件名为DEMO.BMP.用debug分析位图文件的内容如下:186C:0100 42 4D 3E 01 00 00 00 00-00 00 76 00 00 00 28 00186C:0110 00 00 26 00 00 00 0A 00-00 00 01 00 04 00 00 00186C:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00186C:0130 00 00 00 00 00 00 00 00-00 00 00 00 80 00 00 80186C:0140 00 00 00 80 80 00 80 00-00 00 80 00 80 00 80 80186C:0150 00 00 80 80 80 00 40 40-40 00 00 00 FF 00 00 FF186C:0160 00 00 00 FF FF 00 FF 00-00 00 FF 00 FF 00 FF F F186C:0170 00 00 FF FF FF 00 CC CC-CC CC CC CC CC CC CC CC186C:0180 CC CC CC CC CC CC CC CC-CC 00 CC CC CC CC CC CC186C:0190 CC CC CC CC CC CC CC CC-CC CC CC CC CC CC CC 99186C:01A0 99 99 99 99 99 99 99 99-99 99 99 99 99 99 99 CC186C:01B0 CC 00 CC CC CC CC CC CC-CC CC CC CC CC CC CC CC186C:01C0 CC CC CC CC CC 00 CC CC-CC CC CC CC CC CC CC CC186C:01D0 CC CC CC CC CC CC CC CC-CC 00 CC CB BB BB BB BB186C:01E0 BB BB BB BB BB BB BB BB-BB BB BB BC CC 00 CC CC186C:01F0 CC CC CC CC CC CC CC CC-CC CC CC CC CC CC CC CC186C:0200 CC 00 CC CC CC CC CC CC-CC CC CC CC CC CC CC CC186C:0210 CC CC CC CC CC 00 CC CC-CC CC CC CC CC CC CC CC186C:0220 CC CC CC CC CC CC CC CC-CC 00 CC CC CC CC CC CC186C:0230 CC CC CC CC CC CC CC CC-CC 00 CC CC CC 00 00 00(0,0)┌───────────┐│(3,4) (黄色) (35,4)││_____________________ ││││││(2,7) (红色) (34,7)││_____________________ │└───────────┘(38,10)附图实例画面其中:0100-010D是BITMAPFILEHEADER数据结构,它说明了如下的信息:位图文件共318B (bfSize=0x013E),位图阵列从0176处开始(bfoffBits=0x76).010E-0135是BITMAPFILEHEADER数据结构,它说明了如下的信息:BITMAPFILEHEADER共28B(biSize=0x28),位图的大小为38X10(biWith00x26,biHight=0x0A,以象素为单位)位图阵列的每四位表示一个象素,位图有16种颜色, bmiColor[]有16个表项(bitBITCount=4),位图采用非压缩存储方式(bitCompression=0);0136-0175是bmiColor[]颜色表,每四个字节定义一种颜色,共64B,定义了16种颜色.其中第九个表项(015A-015D)定义了红色,第11表项(0162-0165)定义了黄色,第12个表项(0166-0169)定义了蓝色.0176-023D是位图阵列,位图每个扫描行有38个象素,对应位图阵列中的20个字节,其中第20个字节被填0,以保证字节数是4的倍数.黄线在位图的第6扫描行,此行对应位图阵列的01DA-01ED字节,红线在位图的第3行扫描,此行对应位图阵列的0192-01B1字节,位图共有10个扫描行.。
BMP24位位图格式总结

图像BMP24位位图格式总结1、创建图片创建一张只有六个像素的图片(两行三列),每个像素的颜色RGB组合值如图1(示意图)所示:图12、windows系统下存储格式(使用WinHex打开)3、文件结构3.1 文件头(bmp file header),提供文件的格式、大小等信息,共14个字节,如图2所示。
图23.1.1 0-1字节(2个字节)0x42 0x4d = "BM",表示这是Windows支持的位图格式,如图3所示。
图33.1.2 2-5字节(4个字节),表示该bmp文件的大小,存储形式为图4所示,因为小端对齐形式存储,实际存储的16进制数为0x4e,转换为十进制为78,与我们直接查看此图片的属性所看到的文件大小一致。
注:对于arm,intel这种x86架构的复杂指令CPU,整数在内存中是倒着存放的,低地址放低位,高地址放高位,小端对齐,但对于unix服务器的CPU,更多是采用大端对齐的情况图43.1.3 6-9字节这是两个保留段,为0如图5所示。
图53.1.4 A-D字节如图6所示,存储数据为0x36,十进制为54,表示的意义为从文件头到位图数据需偏移54字节。
图63.2 位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息,40个字节,如图7所示。
图73.2.1 0E-11字节,如图8所示,存储数据为0x28,十进制为40,表示意义为:位图信息头的大小为40个字节。
图83.2.2 12-15字节,如图9所示,存储数据为0x03,十进制为3,表示意义为:图像宽为3个像素,与我们创建的图像一致。
图93.2.3 16-19字节,如图10所示,存储数据为0x02,十进制为2,表示意义为:图像高为2个像素,与我们创建的图像一致。
图103.2.4 1A-1B字节,如图11所示,存储数据为0x01,该值总为1,表示意义为位元面数。
BMP_GIF_PNG_LZW_LZ77简介

BMP/GIF/PNG/LZW/LZ77简介一、BMP它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩;BMP文件的图像深度可选lbit、4bit、8bit及24bit。
BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。
当biBitCount=1时,8个像素占1个字节;当biBitCount=4时,2个像素占1个字节;当biBitCount=8时,1个像素占1个字节;当biBitCount=24时,1个像素占3个字节;二、GIFGIF文件的数据,是一种基于LZW算法的连续色调的无损压缩格式。
其压缩率一般在50%左右;GIF的图像深度从lbit到8bit,也即GIF最多支持256种色彩的图像。
GIF格式的另一个特点是其在一个GIF文件中可以存多幅彩色图像,如果把存于一个文件中的多幅图像数据逐幅读出并显示到屏幕上,就可构成一种最简单的动画。
GIF主要分为两个版本,即GIF 89a和GIF 87a:GIF 87a:是在1987年制定的版本GIF 89a:是1989年制定的版本。
在这个版本中,为GIF文档扩充了图形控制区块、备注、说明、应用程序编程接口等四个区块,并提供了对透明色和多帧动画的支持;GIF文件格式采用了一种经过改进的LZW压缩算法,通常我们称之为GIF-LZW算法。
图像压缩数据是按照GIF-LZW压缩编码后存储于图像压缩数据块中的。
GIF-LZW编码是一种经过改良的LZW编码方式,它是一种无损压缩的编码方法。
GIF-LZW编码方法是将原始数据中的重复字符串建立一个字符串表,然后用该重复字符串在字符串表中的索引来替代原始数据以达到压缩的目的。
由于GIF-LZW压缩编码的需要,必须首先存储GIF-LZW的最小编码长度以供解码程序使用,然后再存储编码后的图像数据。
编码后的图像数据是一个个数据子块的方式存储的,每个数据子块的最大长度为256字节。
数据子块的第一个字节指定该数据子块的长度,接下来的数据为数据子块的内容。
bmp编码规则

BMP(Bitmap Image File)是一种位图图像文件格式,它的编码规则如下:
1. BMP文件格式由文件头、位图信息头、颜色表和位图数据四部分组成。
2. 文件头包括两个字节的文件类型标识和四个字节的文件大小。
其中,文件类型标识固定为0x4d42,即"BM"。
3. 位图信息头包括14个字节的信息,包括位图宽度、位图高度、像素位数、压缩方式等。
4. 颜色表用于存储位图中的颜色信息,它由若干个RGBQUAD结构组成。
每个RGBQUAD结构包含红色、绿色、蓝色和保留字段,其中保留字段用于填充位图数据中的空隙。
5. 位图数据是位图中每个像素值的序列,按照扫描行内从左到右、扫描行之间从下到上的顺序记录。
需要注意的是,BMP文件的编码方式有多种,包括不压缩、RLE压缩等。
不同的编码方式会影响到BMP文件的存储大小和显示效果。
BMP格式介绍(一)

BMP格式介绍(⼀)原理篇:⼀、编码的意义。
让我们从⼀个简单的问题开始,-2&-255(中间的操作符表⽰and的意思)的结果是多少,这个很简单的问题,但是能够写出解答过程的⼈并不多。
这个看起来和图⽚格式没有关系的问题恰恰是图⽚格式的核⼼内容以⾄于整个计算机系统的核⼼内容,多媒体技术虽然没有数据结构,操作系统等计算机基础课所占的地位重,但是在于研究编码⽅⾯有着⾮常重要的地位。
图像其实可以看做⼀种特殊编码过的⽂件。
⼆、从简单的24位bmp开始bmp是最常见也是编码⽅式最简单的图⽚格式,这⾥不说明⼀幅图⽚是怎么显⽰在电脑上的,那不是多媒体技术研究的问题,我们来研究bmp的格式问题,为了使各位能够最快的了解bmp格式,我们从24位的⼀个16*16的⼩图像开始。
我们使⽤常⽤的绘图软件创建⼀个16*16的24位bmp图像,如下图所⽰:可以看到图⽚很⼩,我们使⽤ultra-edit看看其内部是什么(ultra-edit是⼀个⽐记事本更加⾼级的编辑软件,可以在⽹上下载到),我们打开其内部看到的是如下的⼀个⼗六进制的数据⽂件:看起来很⾼深⽽⼜很凌乱的样⼦,我们慢慢地说明这些看起来很凌乱的数据流都代表了什么意思,⾸先我们要说明的是,这⾥⾯⼀个数字代表的是⼀个字节,⽐如头两个数42 4d是两个⼗六进制的数,代表了两个字节。
可以看到在UE中⼀⾏是⼗六个字节。
在具体说明每个字节的含义之前,⾸先需要说明的是字节的排布⽅式,在操作系统和计算机组成结构⾥⾯有⼤端法和⼩端法(如果有遗忘可以查⼀下书),简易的说法是这样的,⼩端法的意思是“低地址村存放低位数据,⾼地址存放⾼位数据”,⼤端法就是反过来的,举个例⼦,如果地址从左到右依次增⼤,那么数据01 02的⼩端法存储⽅式是02 01,⼤端法的存储⽅式就是01 02。
在所有的intel的机器上都是采⽤的⼩端法,⽽⼤端法主要存在于摩托罗拉造的处理器的机器上,所以如果你⽤的是⼀个果粉,⽤的是MAC的话,那么你看到的数据排布⽅式是和我们说明中是相反的。
UCS-2、UCS-4、BMPUCS有两种格式

2、Unicode、UCS和UTF前面提到从ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的。
而Unicode只与ASCII兼容(更准确地说,是与ISO-8859-1兼容),与GB码不兼容。
例如“汉”字的Unicode编码是6C49,而GB码是BABA。
Unicode也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案。
Unicode的学名 是"Universal Multiple-Octet Coded Character Set",简称为UCS。
UCS可以看作是"Unicode Character Set"的缩写。
根据维基百科全书(/wiki/)的记载:历史上存在两个试图独立设计Unicode的组织,即国 际标准化组织(ISO)和一个软件制造商的协会()。
ISO开发了ISO 10646项目,Unicode协会开发了Unicode 项目。
在1991年前后,双方都认识到世界不需要两个不兼容的字符集。
于是它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。
从Unicode2.0开始,Unicode项目采用了与ISO 10646-1相同的字库和字码。
下一页3、UCS-2、UCS-4、BMPUCS有两种格式:UCS-2和UCS-4。
顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。
下面让我们做一些简单的数学游戏:UCS-2有2^16=65536个码位,UCS-4有2^31=2147483648个码位。
UCS-4根据最高位为0的最高字节分成2^7=128个group。
每个group再根据次高字节分为256个plane。
每个plane根据第 3个字节分为256行 (rows),每行包含256个cells。
当然同一行的cells只是最后一个字节不同,其余都相同。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BMP文件的编码方式BMP是一种与硬件设备无关的图像文件格式,也是我们最常在PC机上的Windows系统下见到的标准位图格式,使用范围很广泛。
它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。
它最大的好处就是能被大多数软件“接受”,可称为通用格式。
BMP在过去是比较普及的图像格式,现在BMP(Window位图)图像主要被用在PC机运行Window时的墙纸。
BMP可以提供无损压缩,压缩方式叫RLE(游程长度编码的编写),在创建墙纸图像文件时是一个极好的选项。
Window有时在查找以RLE压缩文件方式保存的墙纸图像时也会出现识别错误。
,因此使用时最好先关闭RLE压缩功能。
BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。
1、BMP文件头:BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。
typedef struct tagBITMAPFILEHEADER{WORD bfType; // 位图文件的类型,必须为BMDWORD bfSize; // 位图文件的大小,以为单位WORD bfReserved1; // 位图文件保留字,必须为0WORD bfReserved2; // 位图文件保留字,必须为0DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以为单位} BITMAPFILEHEADER;2、位图信息头:BMP位图信息头数据用于说明位图的尺寸等信息。
typedef struct tagBITMAPINFOHEADER{DWORD biSize; // 本结构所占用数LONGbiWidth; // 位图的宽度,以像素为单位LONGbiHeight; // 位图的高度,以像素为单位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;3、颜色表:颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个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;4、位图数据:位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。
位图的一个像素值所占的数:当biBitCount=1时,8个像素占1个;当biBitCount=4时,2个像素占1个;当biBitCount=8时,1个像素占1个;当biBitCount=24时,1个像素占3个;Windows规定一个扫描行所占的数必须是4的倍数(即以long为单位),不足的以0填充,一个扫描行所占的数计算方法:DataSizePerLine= (biWidth* biBitCount+31)/8; // 一个扫描行所占的数DataSizePerLine= DataSizePerLine/4*4; // 数必须是4的倍数位图数据的大小(不压缩情况下):DataSize= DataSizePerLine* biHeight;二、BMP文件分析1、工具软件:Hex Workshop 或UltraEdit2、分析:首先请注意所有的数值在存储上都是按"高位放高位、低位放低位的原则",如12345678h放在存储器中就是7856 3412)。
下图是一张图16进制数据,以此为例进行分析。
在分析中为了简化叙述,以一个字(两个为单位,如424D就是一个字)为序号单位进行,"h"表示是16进制数。
424D 4690 0000 0000 0000 4600 0000 28000000 8000 0000 9000 0000 0100 1000 03000000 0090 0000 A00F 0000 A00F 0000 00000000 0000 0000 00F8 0000 E007 0000 1F000000 0000 0000 02F1 84F1 04F1 84F1 84F106F2 84F1 06F2 04F2 86F2 06F2 86F2 86F21:图像文件头。
424Dh='BM',表示是Windows支持的BMP格式。
2-3:整个文件大小。
4690 0000,为00009046h=36934。
4-5:保留,必须设置为0。
6-7:从文件开始到位图数据之间的偏移量。
4600 0000,为00000046h=70,上面的文件头就是35字=70。
8-9:位图图信息头长度。
10-11:位图宽度,以像素为单位。
8000 0000,为00000080h=128。
12-13:位图高度,以像素为单位。
9000 0000,为00000090h=144。
14:位图的位面数,该值总是1。
0100,为0001h=1。
15:每个像素的位数。
有1(单色),4(16色),8(256色),16(64K色,高彩色),24(16M色,真彩色),32(4096M色,增强型真彩色)。
T408支持的是16位格式。
1000为0010h=16。
16-17:压缩说明:有0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩),3(Bitfields,位域存放)。
RLE简单地说是采用像素数+像素值的方式进行压缩。
T408采用的是位域存放方式,用两个表示一个像素,位域分配为r5b6g5。
图中0300 0000为00000003h=3。
18-19:用数表示的位图数据的大小,该数必须是4的倍数,数值上等于位图宽度×位图高度×每个像素位数。
0090 0000为00009000h=80×90×2h=36864。
20-21:用象素/米表示的水平分辨率。
A00F 0000为0000 0FA0h=4000。
22-23:用象素/米表示的垂直分辨率。
A00F 0000为0000 0FA0h=4000。
2:位图使用的颜色索引数。
设为0的话,则说明使用所有调色板项。
26-27:对图象显示有重要影响的颜色索引的数目。
如果是0,表示都重要。
28-35:彩色板规范。
对于调色板中的每个表项,用下述方法来描述RGB的值:1用于蓝色分量1用于绿色分量1用于红色分量1用于填充符(设置为0)对于24-位真彩色图像就不使用彩色表,因为位图中的RGB值就代表了每个象素的颜色。
但是16位r5g6b5位域彩色图像需要彩色表,看前面的图,与上面的解释不太对得上,应以下面的解释为准。
图中彩色板为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格式了。
另外,用ultraedit可查看几乎所有文件的二进制代码,。