一?行程长度压羃
原理是将一扫描行中的颜色值相同的盔R像素用一个计数值和那些像素的颜色值来代替。例?aaabccccccddeeeQ则可用3a1b6c2d3e来代ѝ对于拥有大面积Q相同颜色区域的囑փQ用RLE压羃Ҏ非常有效。由RLE原理z多具体行E压~方?
1.PCX行程压羃Ҏ: 该算法实际上是位映射格式到压~格式的转换法Q该法对于q箋出现1ơ的字节ChQ若Ch>0xc0则压~时在该字节前加?xc1Q否则直接输出ChQ对于连l出现N ơ的字节ChQ则压羃?xc0QNQChq两个字节,因而N最大只能ؓffQc0=3fh(十进制ؓ63)Q当N大于63Ӟ 则需分多ơ压~?
2.BI_RLE8压羃Ҏ:在WINDOWS的位图文件中采用了这U压~方法。该压羃Ҏ~码也是以两个字节ؓ基本单位。其中第一个字节规定了用第二个字节指定的颜色重复次数?如编?0504表示从当前位|开始连l显C?个颜色gؓ04的像素。当W二个字节ؓ零时W二个字节有Ҏ含义:0表示行末;1表示图末;2转义后面2个字节, q两个字节分别表CZ一像素相对于当前位|的水^位移和垂直位UR这U压~方法所能压~的囑փ像素位数最大ؓ8?256?囑փ?br /> 3.BI_RLE压羃Ҏ: 该方法也用于WINDOWS位图文g中,它与 BI_RLE8~码cMQ唯一不同?BI_RLE4的一个字节包含了两个像素的颜Ԍ因此Q它只能压羃的颜色数不超q?6的图像。因而这U压~应用范围有限?
4.紧羃位压~方?Packbits):该方法是用于Apple公司的MacintoshZ的位图数据压~?ҎQ?TIFF 规范中用了q种ҎQ?q种压羃Ҏ与BI_RLE8压羃Ҏ怼Q如1c1c1c2132325648 压羃?83 1c 21 81 32 56 48Q显而易见, q种压羃Ҏ最好情冉|每连l?28个字节相同,q?28个字节可压羃Z个数?f。这U方法还是非常有效的?
二、霍夫曼~码压羃:
也是一U常用的压羃Ҏ。是1952qؓ文本文g建立的,其基本原理是频繁使用的数据用较短的代码代替,很少使用的数据用较长的代码代替,每个数据的代码各不相同。这些代码都是二q制码,且码的长度是可变的。如: 有一个原始数据序列,ABACCDAA则编码ؓA(0)QB(10)QC(110),(D111)Q压~后?10011011011100。生霍夫曼~码需要对原始数据扫描两遍Q第一遍扫描要_地统计出原始数据中的每个值出现的频率Q第二遍是徏立霍夫曼树ƈq行~码Q由于需要徏立二叉树q历二叉树生成~码Q因此数据压~和q原速度都较慢,但简单有效,因而得到广泛的应用?/span>
三、LZW压羃Ҏ
LZW压羃技术比其它大多数压~技术都复杂Q?压羃效率也较高。其基本原理是把每一个第一ơ出现的字符串用一个数值来~码Q在q原E序中再这个数D成原来的字符 Ԍ如用数?x100代替字符?abccddeee"q样每当出现该字W串Ӟ都用0x100代替QvC压羃的作用?至于0x100与字W串的对应关pd是在压羃q程中动态生成的Q而且q种对应关系是隐含在压羃数据中,随着解压~的q行q张~码表会从压~数据中逐步得到恢复Q后面的压羃数据再根据前面数据生的对应关系产生更多的对应关pR直到压~文件结束ؓ止。LZW是可逆的Q?所有信息全部保留?/span>
四、算术压~方?/font>
术压羃与霍夫曼~码压羃ҎcMQ只不过它比霍夫曼编码更加有效。算术压~适合于由相同的重复序列组成的文gQ算术压~接q压~的理论极限。这U方法,是将不同的序列映像到0?之间的区域内Q该区域表示成可变精?位数 )的二q制数Q越不常见的数据要的_ֺ高(更多的位?Q这U方法比较复杂,因而不太常用?/span>
五?JPEG( 联合摄媄专家l?Joint Photographic Exprerts Group)
JPEG标准与其它的标准不同Q它定义了不兼容的编码方法,在它最常用的模式中Q它是带q的,一个从JPEG文g恢复出来的图像与原始囑փL不同的,但有损压~重建后的图像常常比原始囑փ的效果更好。JPEG的另一个显著的特点是它的压~比例相当高Q原囑փ大小与压~后的图像大相比,比例可以?Q到80?0Q不{?q种Ҏ?果也好,适合多媒体系l?/span>
介绍完了压羃法Q我们来要介l一下三U位图格式的异同和它们之间的怺转换?br /> 1. bmp图象
· 位图文g?BITMAPHEADER)数据l构
· 位图信息(BITMAPINFO)数据l构
· 位图阵列
1)位图文g头数据结构包含BMP图象文g的类型、显C内容等信息?br /> Typedef struct{
Int bfType; //must be "BM"
Long bfSize; //位图大小
Int bfReserved1;//must be "0"
Int bfReserved2;//must be "0"
Long bfOffBits;//位图阵列的v始位|?br /> }BITMAPEFILEHEADER;
2)位图信息数据l构由BITMAPINFOHEADER和RGBQUAD两个数据l构l成Q?br /> typedef struct{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[];
}BITMAPINFO
其中BITMAPINFOHEADER数据l构包含了有关BMP图象的宽、高、压~方法等信息?br /> 数据l构RGBQUAD定义一U颜艌Ӏ?/span>
3Q位N?br /> 位图阵列记录了图象的每一个象素倹{从图象的左下角开始逐行扫描图象。从左到叻I从上CQ将图象的象素值逐一记录下来Q这些记录象素值的字节l成了位N列?br /> 位图阵列数据的存储格式有压羃和非压羃两种格式?br /> 1Q?非压~格?位图中的每一个点的象素值对应与位图阵列的若q位Q而位N列的若干位由图象的高度、宽度及图象的颜色数军_?br /> 2Q?压羃格式 在bmp格式文g中,Windows支持BI-RLE8和BI-RLE4两种压羃cd的存储格式?/span>
2、GIF图象文g格式
GIF的全U是Graphics Interchange Format,.译做囑Ş交换格式。GIF是一U公用的图象文g格式标准Q但它归compuServe公司版权所有?br />GIF文gl构包含一个文件头Q?/span>
在一个GIF文g中首先碰到的是GIF的标志,q个标志告诉解码E序q是个GIF文g。这个标志是3字节的串QGIF。一个GIF文g中可以存攑֤q图象,但绝大多数的文g都只包含一q图象?br /> 然后是屏q描q字(screen descriptor),说明了用来生成的昄文g中的图象的显C器分L率,分别表示屏幕的宽和高?br /> 紧跟下来的一个字节是全局标志Q其低三位说明了卛_到的图象是多少颜色的。最高位表示是否存在一个全局色彩表?br /> 背景色表C把背景|成适当的颜Ԍ实际上是一个指向全局色彩表的数?br /> Struct Global_Data{
Unsigned short screen_width;
Unsigned short screen_height;
Unsigned char background;
har tail='\0';
}
接下来是全局色彩表,按顺序存放所有的严肃Q每一U严肃由色彩表的一Ҏ描述Q每Ҏ3字节Q分别表C红、绿、蓝三种原色的强度。其长度有全局标志的低三位表示?br /> 以后的数据都是局部的了。是些数据块的集合。下面是图象数据块的l构?br /> Struct Local_Head{
Char heading=',';
Unsigned short image_left;//图象的屏q上昄的v始位|?br /> Unsigned short image_top;
Unsigned short image_width;
Unsigned short image-height;
Unsigned char local_flag;//局部标?br /> }
局部标志和 全局标志的不同之处在于次高位Q如果这位被|成1则表C图像的位图数据是以隔行方式存放的。也是_在解开的位图数据中Q第一行存攄是屏q上W一行,W二行对应屏q上的第9行,W三行对应屏q上的第17行,以此递增--q是W一遍扫描;W二遍扫描是从屏q上的第5行开始,两行之间也是?递增Q第三遍扫描是从屏幕上的W?行开始,两行之间?递增Q第四遍扫描Q也是最后一遍,从第2行开始,两行之间?递增?/span> 隔行存放的GIF囑փ在边解码ҎC的时候可分成四遍扫描。第一遍扫描虽然只昄了整个图像的八分之一Q第二遍的扫描后也只昄了四分之一Q但q已l把整个囑փ的概貌显C出来了。在昄GIF囑փ的时Q隔行存攄囑փ会给你这样一个印象:向它的显C速度g要比其他囑փ快一些,q是隔行存放的优炏V?br /> 在GIF囑փ的编解码中用CLZW压羃法--把这些字W流转换成另一UŞ式的代码,解码q程则是把这U代码流q原成原来的字符?/span>
3、JPEG图象文g格式
JPEG是Joint Photographic Experts Group(联合摄媄专家组)的首字母~写。JPEG的主要作用是用于数字化图象的标准~码技术。JPEG图象文g是一U象素格式文件格式,但它比诸如象GIF、BMP{图象文件要复杂的多。所q?我们在用由JPEGl成的JPEG库时,只要对该文g格式有个一般的了解可以了。而没有必要对JPEG文g格式做一个全面细致的了解?br /> JPEG格式是种有损的编码格式,但如果GIF文g比,他经q解码后的重构图象要比GIF图象更接q于原始的图象?JPEG~码技术是由颜色{换、DCT变换、进行量化、编码。其压羃格式p名的JPEG集团所著的4.0版本的库所定?/span>
关于q?U图象格式的互相转换Q主要是用c语言或c++和汇~语aQ因些语a可以 直接q行底层的操作,把图象解压羃后按用另一U格式要求进行压~即可?br />本文属{载,原文地址Q?a >http://www.chinaaspx.com/comm/dotnetbbs/Showtopic.aspx?Forum_ID=44&Id=139926&PPage=1