BMP文件的编码方式
BMP文件解码代码
![BMP文件解码代码](https://img.taocdn.com/s3/m/edd5ceec102de2bd960588e4.png)
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哈夫曼编码实验报告
![bmp哈夫曼编码实验报告](https://img.taocdn.com/s3/m/20b9324ffe4733687e21aaa2.png)
多媒体技术与基础实验——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编码
![BMP编码](https://img.taocdn.com/s3/m/a7d090ede009581b6bd9eb9a.png)
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位位图格式总结](https://img.taocdn.com/s3/m/7615ddcdb9f3f90f76c61b28.png)
图像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简介](https://img.taocdn.com/s3/m/78e229c30c22590102029de6.png)
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编码规则](https://img.taocdn.com/s3/m/6a914dab5ff7ba0d4a7302768e9951e79b896917.png)
BMP(Bitmap Image File)是一种位图图像文件格式,它的编码规则如下:
1. BMP文件格式由文件头、位图信息头、颜色表和位图数据四部分组成。
2. 文件头包括两个字节的文件类型标识和四个字节的文件大小。
其中,文件类型标识固定为0x4d42,即"BM"。
3. 位图信息头包括14个字节的信息,包括位图宽度、位图高度、像素位数、压缩方式等。
4. 颜色表用于存储位图中的颜色信息,它由若干个RGBQUAD结构组成。
每个RGBQUAD结构包含红色、绿色、蓝色和保留字段,其中保留字段用于填充位图数据中的空隙。
5. 位图数据是位图中每个像素值的序列,按照扫描行内从左到右、扫描行之间从下到上的顺序记录。
需要注意的是,BMP文件的编码方式有多种,包括不压缩、RLE压缩等。
不同的编码方式会影响到BMP文件的存储大小和显示效果。
BMP格式介绍(一)
![BMP格式介绍(一)](https://img.taocdn.com/s3/m/460ee411b42acfc789eb172ded630b1c59ee9b8a.png)
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有两种格式
![UCS-2、UCS-4、BMPUCS有两种格式](https://img.taocdn.com/s3/m/15a0743b2bf90242a8956bec0975f46527d3a794.png)
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只是最后一个字节不同,其余都相同。
BMP位图文件格式分析
![BMP位图文件格式分析](https://img.taocdn.com/s3/m/7ce5ab55ad02de80d4d840b1.png)
使用画图工具(ms+R调出运行框,输入mspaint即可)分别存储2个文件1.bmp(400*300px),2.bmp(200*150px)白画布。
使用Beyond Compare比较下2个文件数据,注意使用Hex16进制方式。
前2个字节42 4D对应字符BM,是文件类型,这里表示ms的bmp文件类型紧着的4个字节是文件字节数,F6 D8 01 00==》1.bmp应为存储方式是高位字在高地址的方式存储,所以实际是0001D8F6==>转成10进制数值是121078字节=》除以1024就是118K,自己核对下文件属性看看文件大小是不是118k;而2.bmp文件的是66 79 00 00对应00007966=>31078字节=》30.3k随后的4个字节全为00,系统保留。
再后面的4个字节代表的是实际的图像数据开始的位置(偏移量)这里都是36 04 00 00也就是00000436H,在Beyond Compare里Ctrl+G,选择Hex,16进制方式,输入0436转到该位置发现文件数据全是FF也就是白色:然后在看下windows定义的bmp文件头结构体定义就更清晰了:typedef struct tagBITMAPFILEHEADER{UINT16bfType;/*bmp文件类型-占2字节*/DWORD bfSize;/*bmp文件大小-占4字节*/UINT16bfReserved1;/*保留-占2字节*/UINT16bfReserved2;/*保留-占2字节*/DWORD bfOffBits; /*位图数据偏移-占4字节*/}BITMAPFILEHEADER;共14个字节。
文件头后面是文件信息头部,主要是位图文件的详细信息,windows定义的文件信息头的结构体如下:typedef struct tagBITMAPINFOHEADER{DWORD biSize;/*文件信息头占的字节大小-该字段占4字节*/LONG biWidth;/*宽度4字节*/LONG biHeight;/*高度4字节*/WORD biPlanes;/*颜色平面数2字节,总是1(文章1.bmp,2.bmp里可以看到01 00这2个字节)*/WORD biBitCount;/*每个图像像素所占比特数,占2字节,我们这里是8bit,256种颜色,呵呵*/ DWORD biCompression;/*图像数据压缩类型4字节*/DWORD biSizeImage;/*图像大小4字节*/LONG biXPelsPerMeter;/*水平分辨率4字节*/LONG biYPelsPerMeter;/*垂直分辨率4字节*/DWORD biClrUsed;/*所使用颜色表索引数4字节*/DWORD biClrImportant; /*对图像重要影响的索引数4字节占据*/}BITMAPINFOHEADER;统计下:4+4+4+2+2+4+4+4+4+4+4=40共40个字节,验证。
bmp文件解码
![bmp文件解码](https://img.taocdn.com/s3/m/4e1fc22a2af90242a895e51c.png)
件而言的。有些位图,如真彩色图是不需要调色板的,BITMAPINFOHEADER
后直接是位图数据。
调色板实际上是一个数组,共有 biClrUsed 个元素(如果该值为零,则
有 2 个元素)。数组中每个元素的类型是一个 RGBQUAD 结构,占 4 个字节,
其定义如下:
typedef struct tagRGBQUAD {
指定目标设备的垂直分辨Байду номын сангаас,单位同上。 46 biClrUsed
指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为 2。 50 biClrImportant
指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重 要的。
第三部分为调色板 Palette,当然,这里是对那些需要调色板的位图文
还有一点也需要注意:Windows 要求每一行的数据的长度必须是 4Bytes 的整 数倍,如果不是,要以值为 0 的字节补充,如果读取的时候不处理,会得到 一个倾斜的图像。
unsigned char data[9604]; FATFS fs; FRESULT res; UINT br; /* *********************************************************** * Function name : Pic_Viewer();
DWORD 为无符号 32 位整数),各个域的说明如下: 0 bfType
指定文件类型,必须是 0x424D,即字符串“BM” 2 bfSize
指定文件大小,包括这 14 个字节。 6 bfReserved1,bfReserved2
为保留字,不用考虑 10 bfOffBits
为从文件头到实际的位图数据的偏移字节数,即图中前三个部分的长度 之和。
BMP编码
![BMP编码](https://img.taocdn.com/s3/m/6ba5d14aa8956bec0975e360.png)
u16 biPlanes ; //为目标设备说明位面数,其值将总是被设为1
u16 biBitCount ; //说明比特数/象素,其值为1、4、8、16、24、或32
}RGBQUAD ;
//位图信息头
typedef __packed struct
{
BITMAPFILEHEADER bmfHeader;
BITMAPINFOHEADER bmiHeader;
u32 RGB_MASK[3]; //调色板用于存放RGB掩码.
//RGBQUAD bmiColors[256];
if(ex<sx||ey><sy)return PIC_WINDOW_ERR; //区域错误
if(sx>LCD_W||ex>LCD_W)return PIC_WINDOW_ERR; //区域错误
if(sy>LCD_H||ey>LCD_H)return PIC_WINDOW_ERR; //区域错误
if(res==FR_OK)//创建成功
{
res=f_write(f_bmp,(u8*)&hbmp,bmpheadsize,&bw);//写入BMP首部
for(y=ey;hbmp.bmiHeader.biHeight;y--)
{
pixcnt=0;
for(x=sx;pixcnt!=(bi4width/2);)
u32 biCompression ; //说明图象数据压缩的类型。其值可以是下述值之一:
//BI_RGB:没有压缩;
//BI_RLE8:每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计数和颜色索引);
bmp
![bmp](https://img.taocdn.com/s3/m/7c4922c14028915f804dc272.png)
BMP图象格式BMP是bitmap的缩写形式,bitmap顾名思义,就是位图也即Windows位图。
它一般由4部分组成:文件头信息块、图像描述信息块、颜色表(在真彩色模式无颜色表)和图像数据区组成。
在系统中以BMP为扩展名保存。
打开Windows 的画图程序,在保存图像时,可以看到三个选项:2色位图(黑白)、16色位图、256色位图和24位位图。
这是最普通的生成位图的工具,在这里讲解的BMP位图形式,主要就是指用画图生成的位图(当然,也可以用其它工具软件生成)。
现在讲解BMP的4个组成部分:1.文件头信息块0000-0001:文件标识,为字母ASCII码“BM”。
0002-0005:文件大小。
0006-0009:保留,每字节以“00”填写。
000A-000D:记录图像数据区的起始位置。
各字节的信息依次含义为:文件头信息块大小,图像描述信息块的大小,图像颜色表的大小,保留(为01)。
2.图像描述信息块000E-0011:图像描述信息块的大小,常为28H。
0012-0015:图像宽度。
0016-0 019:图像高度。
001A-001B:图像的plane总数(恒为1)。
001C-001D:记录像素的位数,很重要的数值,图像的颜色数由该值决定。
001E-0021:数据压缩方式(数值位0:不压缩;1:8位压缩;2:4位压缩)。
0022-0025:图像区数据的大小。
0026-0029:水平每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。
002A-002D:垂直每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。
002E-0031:此图像所用的颜色数,如值为0,表示所有颜色一样重要。
3.颜色表颜色表的大小根据所使用的颜色模式而定:2色图像为8字节;16色图像位64字节;256色图像为1024字节。
其中,每4字节表示一种颜色,并以B(蓝色)、G(绿色)、R(红色)、alpha(32位位图的透明度值,一般不需要)。
bmp转jpg算法原理 -回复
![bmp转jpg算法原理 -回复](https://img.taocdn.com/s3/m/7bf3b98309a1284ac850ad02de80d4d8d15a0139.png)
bmp转jpg算法原理-回复BMP转JPG算法原理BMP(位图文件)和JPG(Joint Photographic Experts Group)是两种常见的图像文件格式。
由于JPEG格式的高压缩率和较小的文件大小,很多时候我们需要将BMP文件转换为JPG格式。
本文将详细介绍BMP转JPG算法的原理,包括色彩空间转换、离散余弦变换、量化和熵编码等一系列步骤。
一、色彩空间转换(从RGB到YCbCr)BMP文件使用RGB色彩空间,而JPG文件通常使用YCbCr色彩空间。
在BMP转JPG算法中,我们首先需要将RGB图像转换为YCbCr图像。
色彩空间转换的原理在于RGB和YCbCr之间的线性变换关系,公式如下:Y = 0.299R + 0.587G + 0.114BCb = -0.1687R - 0.3313G + 0.5BCr = 0.5R - 0.4187G - 0.0813B其中,Y表示亮度分量,Cb和Cr表示色度分量。
通过将RGB图像的每个像素点按照上述公式进行计算,我们可以得到对应的YCbCr图像。
二、离散余弦变换(DCT)在JPEG编码中,离散余弦变换(DCT)是一种重要的信号处理技术,用于将图像从空间域转换到频域,并且能够对图像进行良好的压缩。
在BMP 转JPG算法中,我们对每个Y、Cb、Cr分量的8x8小块进行DCT变换。
DCT变换的原理在于将图像分解成一系列频率成分,其中每个成分的权重由对应位置的余弦函数确定。
三、量化量化是JPEG编码中的重要步骤,用于减小DCT系数的精度,从而进一步降低图像的质量和文件大小。
在BMP转JPG算法中,我们使用预先定义的量化表对每个8x8块的DCT系数进行量化操作。
量化表中的每个元素表示对应位置DCT系数的量化步长。
量化的原理在于舍弃较大的DCT系数,从而降低信息的冗余度。
为了实现更高的压缩比,量化表中的元素通常设置为较小的值。
因此,量化操作会导致一定水平的信息丢失,图像的质量也会有所下降。
BMP文件格式图解
![BMP文件格式图解](https://img.taocdn.com/s3/m/11aa8288bceb19e8b8f6ba8e.png)
BMP文件格式图解BMP格式简单的说就是「File Header + Info Header + (optional palette) + Raw Data」,不过「File Header + Info Header + Raw Data」比较多,故以此格式为例。
【FILE HEADER 实例图解实例图解】14 bytestypedef struct {/* type : Magic identifier,一般为BM(0x42,0x4d) */unsigned short int type;unsigned int size;/* File size in bytes,全部的档案大小*/unsigned short int reserved1, reserved2; /* 保留位*/unsigned int offset;/* Offset to image data, bytes */} FILEHEADER;1.type:2 bytes,一般都是'B' (0x42)、'M' (0x4D)2.size:4 bytes,记录该BMP档的大小,0x436 = 1078 bytes3.reserved1:保留位,2 bytes4.reserved2:保留位,2 bytes5.offset:4 bytes,0x36 = 54 bytes实例图解】40 bytes【INFO HEADER 实例图解typedef struct {unsigned int size;/* Info Header size in bytes */int width,height;/* Width and height of image */unsigned short int planes;/* Number of colour planes */unsigned short int bits; /* Bits per pixel */unsigned int compression; /* Compression type */unsigned int imagesize; /* Image size in bytes */int xresolution,yresolution; /* Pixels per meter */unsigned int ncolours; /* Number of colours */unsigned int importantcolours; /* Important colours */} INFOHEADER;1.size:4 bytes,0x28 = 40 bytes,表示Info Header的大长度总共40 bytes2.width:4 bytes,0x10 = 16,图像宽度为16 pixel3.height:4 bytes,0x10 = 16,图像高度为16 pixel4.planes:2 bytes,0x01 = 1,位元面数为15.bits:2 bytes,0x20 = 32,每個pixel需要32bitspression:4 bytes,0代表不压缩7.imagesize:4 bytes,0x400 = 1024 bytes,点阵图资料大小为1024 bytes8.xresolution:4 bytes,水平解析度9.yresolution:4 bytes,垂直解析度10.ncolours:4 bytes,点阵图使用的调色板颜色数11.importantcolours:4 bytes,重要的颜色数实例图解】【RAW DATA 实例图解刚刚的File Header共14bytes,Info Header为40bytes,「imagesize」= 1024 bytes,所以「14 + 40 + 1024 = 1078」,即等于File Header中「size」的大小。
图像文件格式BMP文件格式详解
![图像文件格式BMP文件格式详解](https://img.taocdn.com/s3/m/ed0fc59ab8d528ea81c758f5f61fb7360b4c2b33.png)
BMP文件格式BMP文件格式是Microsoft Windows下最常见的图像文件格式之一,它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大;BMP 文件的图像深度可选lbit、4bit、8bit及24bit;BMP文件存储数据时,图像的像素值在文件中的存放顺序为从左到右,从下到上,也就是说,在BMP文件中首先存放的是图像的最后一行像素,最后才存储图像的第一行像素,但对与同一行的像素,则是按照先左边后右边的的顺序存储的;另外一个需要关注的细节是:文件存储图像的每一行像素值时,如果存储该行像素值所占的字节数为4的倍数,则正常存储,否则,需要在后端补0,凑足4的倍数;由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像都支持BMP图像格式;典型的BMP文件由四部分组成:1、位图头文件数据结构主要包含文件的大小、文件类型、图像数据偏离文件头的长度等信息;2、信息数据结构包含图象的尺寸信息、图像用几个比特数值来表示一个像素、图像是否压缩、图像所用的颜色数等信息;3、包含图像所用到的颜色表,显示图像时需用到这个颜色表来生成调色板,但如果图像为真彩色,既图像的每个像素用24个比特来表示,文件中就没有这一块信息,也就不需要操作调色板;4、位图数据记录了位图的每一个像素值或该对应像素的颜色表的索引值,图像记录顺序是在扫描行内是从左到右, 扫描行之间是从下到上;这种格式我们又称为Bottom_Up位图,当然与之相对的还有Up_Down形式的位图,它的记录顺序是从上到下的,对于这种形式的位图,也不存在压缩形式;BMP文件结构位图文件bitmap file, BMP格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式; 以后的BMP格式与显示设备无关,因此把这种BMP格式称为设备无关位图Device Independentbit Bitmap , DIB格式, Windows能够在任何类型的显示设备上显示BMP位图;BMP位图默认的文件扩展名是bmp;1、文件结构位图文件可看成由4个部分组成:位图文件头Bitmap-File、位图信息头Bitmap-Information Header、彩色表Color Table和定义位图的字节阵列,它们的名称和符号如下表1所示:2、位图文件结构可综合在下表中:3、结构详解1位图文件头:它包含有关于文件类型、文件大小和存放位置等信息,在Windows 以上版本的位图文件中用BITMSPFILEHEADER结构体来定义;位图文件头包含了图像类型、图像大小、图像数据存放地址和两个保留未使用的字段;BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息;其结构定义如下:typedef struct tagBITMAPFILEHEADER{WORD bfType; mp格式支持32位色DWORD biCompression; // 位图压缩类型,必须是0不压缩,// 1BI_RLE8压缩类型或2BI_RLE4压缩类型之一DWORD biSizeImage; // 位图的大小,以字节为单位LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数DWORD biClrUsed; // 位图实际使用的颜色表中的颜色数DWORD biClrImportant; // 位图显示过程中重要的颜色数} BITMAPINFOHEADER; //该结构占据40个字节它由位图信息头和彩色表组成,前者用BITMAPINFOHEADER结构体定义,后者用RGBQUAD结构体定义;1彩色表的定位:应用程序进行彩色表的定位时,可使用存储在biSize成员中的信息来查找在BITMAPINFO结构体中的彩色表;2biBitCount:biBitCount=1表示位图最多有两种颜色,黑色和白色;图像数据阵列中的每一位表示一个pixel:biBiCount=4表示位图最多有16种颜色;每个像素用场bit表示,交用这4bit 作为彩色表的表项来查找该像素的颜色;3ClrUsed:BITMAPINFOHEADER结构中的成员ClrUsed指定实际使用的颜色数目;48bit/pixel的图像数据压缩:BI_RLE8 8bit/pixel的RLE压缩编码,可使用编码方式和绝对方式中的任何一种进行压缩,这两种方式可在同一幅图中的任何地方使用;编码方式由此及彼个字节组成,第一个字节指定使用相同颜色的像素数目,第二个字节指字使用的颜色索引;此外,这个字节对中的第一个字节可设置为0,联合使用第二个字节的值表示:●第二个字节的值为0 行的结束●第二个字节的值为1 图像结束●第二个字节的值为2 其后的两个字节表示下一个像素从当前开始的水平和垂直位置的偏移量绝对方式第一个字节设置为0,而第二个字节设置为03h~0FFh之间的一个值;在这种方式中,第二个字节表示跟在这个字节后面的字节数,每个字节包含单个像素的颜色索引;5每个像素为4位的图像数据压缩:BI_RLE4 每个像素为4位的RLE压缩编码,同样也可使用编码方式和绝对方式中的任何一种进行压缩,这两种方式也可在同一幅图中的任何地方使用;编码方式由2个字节组成,第一个字节指定像素数目,第二个字节包含两种颜色索引;绝对方式这个字节对中的第一个字节设置为0,第二个字节包含有颜色索引数,其后续字节包含有颜色索引,颜色索引存放在该字节的高、低4位中,一个颜色索引对应一个像素;BI_RLE4也同样联合使用第二个字节中的值表示:●第二个字节的值为0 行的结束●第二个字节的值为1 图像结束●第二个字节的值为2 其后的两个字节表示下一个像素从当前开始的水平和垂直位置的偏移量3彩色表:包含的元素与位图所具有的颜色数相同,像素的颜色用RGBQUAD结构来定义;彩色表中的颜色按颜色的重要性排序,这可辅助显示驱动程序为不能显示足够多颜色数的显示设备显示彩色图像;颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色;RGBQUAD结构的定义如下:typedef struct tagRGBQUAD {BYTE rgbBlue; // 蓝色的亮度值范围为0-255BYTE rgbGreen; // 绿色的亮度值范围为0-255BYTE rgbRed; // 红色的亮度值范围为0-255BYTE rgbReserved; // 保留,必须为0} RGBQUAD;彩色表/调色板color table是单色、16色和256色图像文件所特有的,相对应的调色板大小是2、16和256,调色板以4字节为单位,每4个字节存放一个颜色值,图像的数据是指向调色板的索引;可以将调色板想象成一个数组,每个数组元素的大小为4字节,假设有一256色的BMP图像的调色板数据为:调色板0=黑、调色板1=白、调色板2=红、调色板3=蓝…调色板255=黄图像数据01 00 02 FF表示调用调色板1、调色板0、调色板2和调色板255中的数据来显示图像颜色;每个调色板的大小为4字节,按蓝、绿、红存储一个颜色值;4位图数据:紧跟在彩色表之后的是图像数据字节阵列;图像的每一扫描行由表示图像像素的连续的字节组成,每一行的字节数取决于图像的颜色数目和用像素表示的图像宽度;位图的一个像素值所占的字节数:当biBitCount=1时,8个像素占1个字节;当biBitCount=4时,2个像素占1个字节;当biBitCount=8 时,1个像素占1个字节;当biBitCount=24时,1个像素占3个字节,此时图像为真彩色图像;当图像不是为真彩色时,图像文件中包含颜色表,位图的数据表示对应像素点在颜色表中相应的索引值,当为真彩色时,每一个像素用三个字节表示图像相应像素点彩色值,每个字节分别对应R、G、B分量的值,这时候图像文件中没有颜色表;上面我已经讲过了,Windows规定图像文件中一个扫描行所占的字节数必须是4的倍数即以字为单位,不足的以0填充,图像文件中一个扫描行所占的字节数计算方法:DataSizePerLine = biWidth biBitCount + 31 / 8;// 一个扫描行所占的字节数位图数据的大小按下式计算不压缩情况下:DataSize = DataSizePerLine biHeight;。
JPGBMPTIFPNG图像编码压缩率和编解码时间比较
![JPGBMPTIFPNG图像编码压缩率和编解码时间比较](https://img.taocdn.com/s3/m/d70e06a1dc3383c4bb4cf7ec4afe04a1b071b02d.png)
JPGBMPTIFPNG图像编码压缩率和编解码时间⽐较Test picture compression format .bmp:Time of reading : 28.68 msTime of writing : 6.79 msTime of decoding : 3.98 msTime of encoding : 4.82 msEncode radio : 100.00% Psnr : 361.20Test picture compression format .jpg:Time of reading : 0.99 msTime of writing : 0.54 msTime of decoding : 19.51 msTime of encoding : 20.15 msEncode radio : 5.77% Psnr : 39.71Test picture compression format .tif:Time of reading : 8.79 msTime of writing : 2.85 msTime of decoding : 70.26 msTime of encoding : 97.59 msEncode radio : 38.89% Psnr : 361.20Test picture compression format .png:Time of reading : 5.53 msTime of writing : 2.38 msTime of decoding : 76.55 msTime of encoding : 216.28 msEncode radio : 32.01% Psnr : 361.20具体测试程序:#include <stdio.h>#include "m_tools.h"#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <fstream>using namespace std;int calPsnr(const string filepath, const char * _ext, double& t_read, double& t_write, double& t_decode, double& t_encode, double& encode_ratio, double & psnr){long long t0 = _getTickCount();cv::Mat src_bmp = cv::imread(filepath);long long t1 = _getTickCount();int w = src_bmp.cols;int h = src_bmp.rows;const std::string ext = _ext;vector<int> opts;if( ext == ".png" ){opts.push_back(cv::IMWRITE_PNG_COMPRESSION);opts.push_back( 9);}else if ( ext == ".jpg" ){opts.push_back(cv::IMWRITE_JPEG_QUALITY);opts.push_back( 90);}else if ( ext == ".bmp" ){}std::vector<uchar> pkg_buff;cv::imencode(ext, src_bmp, pkg_buff, opts);long long t2 = _getTickCount();cv::Mat src_png = cv::imdecode(pkg_buff,CV_LOAD_IMAGE_COLOR);long long t3 = _getTickCount();{FILE* file = fopen((string("dst")+ext).c_str(), "w" );fwrite(&pkg_buff[0],1, pkg_buff.size(), file );fclose(file);}long long t4 = _getTickCount();{std::ifstream f(string("dst")+ext);std::string s;while (f>>s);}long long t5 = _getTickCount();double _psnr= cv::PSNR( src_bmp, src_png );psnr += _psnr;//printf("Psnr of %dx%d%s and %s is %.2f ", w, h, filepath.c_str(), ext.c_str(), _psnr);float src_kb = w*h*3/1024.0;float dst_kb = pkg_buff.size()/1024.0;encode_ratio += dst_kb*100.0/src_kb;//printf("In=%.2fKB Out=%.2fKB Compression ratio=%.2f%\n", src_kb, dst_kb, dst_kb*100.0/src_kb); t_read += (t5-t4)/_getTickFrequency();t_write += (t4-t3) /_getTickFrequency();t_decode += (t3-t2) /_getTickFrequency();t_encode += (t2 - t1) /_getTickFrequency();return0;}int main( int argc, char ** argv ){int max_test_loops = 100;vector<string> paths = getFiles(argv[1]);max_test_loops = paths.size() < max_test_loops? paths.size() : max_test_loops;double t_read=0, t_write=0, t_decode=0, t_encode=0, encode_ratio=0, psnr=0;for( int i=0;i!=max_test_loops; ++i ){calPsnr(paths[i], argv[2], t_read, t_write, t_decode, t_encode, encode_ratio, psnr);}printf("Test picture compression format %s:\n", argv[2]);printf("Time of reading : %.2lf ms\n", 1000.0*t_read/max_test_loops);printf("Time of writing : %.2lf ms\n", 1000.0*t_write/max_test_loops);printf("Time of decoding : %.2lf ms\n", 1000.0*t_decode/max_test_loops);printf("Time of encoding : %.2lf ms\n", 1000.0*t_encode/max_test_loops);printf("Encode radio : %.2lf%% \n", encode_ratio/max_test_loops);printf("Psnr : %.2lf \n\n", psnr/max_test_loops);return0;}。
bmp转jpg算法原理
![bmp转jpg算法原理](https://img.taocdn.com/s3/m/ef8e8d58fbd6195f312b3169a45177232f60e4ec.png)
bmp转jpg算法原理随着数字图像处理技术的不断发展,图像格式的转换变得越来越普遍。
其中,BMP转JPG是一种常见的格式转换需求。
JPG是一种有损压缩格式,而BMP是一种位图格式,它们之间的转换涉及到一些算法原理。
本文将详细介绍BMP转JPG 的算法原理。
一、BMP格式简介BMP(BitmapPicture)是一种位图文件格式,通常用于存储图像数据。
BMP 文件以结构化的方式组织图像数据,每个像素由红、绿、蓝三个分量表示,通常还包含有关于图像大小、分辨率和压缩方式等信息。
BMP文件结构包括文件头、位图信息头、像素数据等部分。
二、JPG格式简介JPG(JointPhotographicExpertGroup)是一种有损压缩格式,广泛用于静态图像的存储和传输。
它采用基于离散余弦变换(DCT)的算法对图像数据进行压缩,能够大幅度减小图像数据的大小,同时尽可能保持较好的图像质量。
JPG文件结构包括文件头、Exif(ExchangeableImageFileFormat)信息、JPG信息头、数据等部分。
1.图像尺寸调整:在进行BMP转JPG转换时,首先需要将BMP图像调整为与JPG格式兼容的大小。
这可以通过重新采样图像像素数据来实现。
2.DCT变换:JPG压缩算法基于离散余弦变换(DCT)原理。
将BMP图像数据通过DCT变换,可以将空间域的数据转换为频率域的数据,从而实现了压缩的目的。
在转换过程中,需要对DCT系数进行量化和平滑处理,以减小数据量同时保持较好的图像质量。
3.熵编码与游程编码:为了进一步减小数据量,需要对量化后的DCT系数进行熵编码和游程编码。
熵编码是对DCT系数的编码方式,游程编码则是利用连续的零值像素块进行压缩。
4.存储文件头与数据:将转换后的图像数据存储到JPG文件中,包括文件头、Exif信息、JPG信息头和数据等部分。
其中,数据部分包含了转换后的图像像素数据。
5.质量设置:在转换过程中,可以通过设置JPG文件的质量参数来控制图像的压缩比和图像质量。
Bmp图像的哈夫曼编码代码
![Bmp图像的哈夫曼编码代码](https://img.taocdn.com/s3/m/fd85e160ddccda38376bafa2.png)
Bmp图像的哈夫曼编码代码#include <stdio.h>#include <stdlib.h>#include <string.h>#include <math.h>#include <windows.h>#include <ctype.h>#include <malloc.h>typedef struct{unsigned int weight;unsigned int parent,lchild,rchild;}HTNode, *huffmantree;// 动态分配数组存储赫夫曼树typedef char **huffmancode;// 动态分配数组存储赫夫曼编码表int power(int i){int j,result=1;for(j=0;j<i;j++){result*=2;}return result;}void write_file(char temp[],FILE *fp2){int i;unsigned char result=0;for(i=8;i>0;i--){if(temp[8-i]!='0'){result+=power(i-1);}}strcpy(temp,temp+8);}void select(huffmantree HT, unsigned int i, unsigned int *s1, unsigned int *s2) {// s1为最小的两个值中序号小的那个unsigned int j,temp;for(j=1;j<=i;j++){if(HT[j].parent==0){*s2=j;break;}}for(;j<=i;j++){if(HT[j].parent==0 && j!=*s2){*s1=j;break;}}for(j=1;j<=i;j++){if(HT[j].parent==0 && HT[j].weight < HT[*s1].weight && *s2!=j){*s1=j;}}for(j=1;j<=i;j++){if(HT[j].parent==0 && HT[j].weight < HT[*s2].weight && *s1!=j){*s2=j;}}if(*s1>*s2){temp=*s1;*s1=*s2;*s2=temp;}}void huffmancoding(huffmantree &HT, huffmancode &HC,unsigned long int *w, unsigned int n) {// w存放n个字符的权值(均>0),构造赫夫曼树HT,并求出n个字符的赫夫曼编码HCunsigned int s1,s2,start,c,f,i,m;// 0号单元未用huffmantree p;char *cd;if (n<=1){return;}m=2*n-1;HT=(huffmantree)malloc((m+1)*sizeof(HTNode));//malloc 向系统申请分配指定size个字节的内存空间。
BMP文件的编码方式
![BMP文件的编码方式](https://img.taocdn.com/s3/m/4c250edea58da0116c17490b.png)
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 类型的结构,定义一种颜色。
- 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可查看几乎所有文件的二进制代码,。