圖象文件就是描繪了一幅圖象的計算機磁盤文件。形成數(shù)字圖象數(shù)據(jù)后,將其存儲在計算機里的方法有2種,即位映射和向量處理方式。 我們這里主要討論的是位圖。不同圖象軟件幾乎都用各種的方法處理圖象,圖象格式也多種多樣,它主要包括文件識別頭和圖象數(shù)據(jù)。文件識別頭用來讓計算機判斷是哪種文件格式,圖象數(shù)據(jù)包含了整個對圖象描繪相關(guān)數(shù)據(jù),包括調(diào)色板、位圖映象等。根據(jù)壓縮算法不同,映象方式也不同,下面簡要介紹一下壓縮算法。
一、 行程長度壓縮 原理是將一掃描行中的顏色值相同的相鄰像素用一個計數(shù)值和那些像素的顏色值來代替。例如:aaabccccccddeee,則可用3a1b6c2d3e 來代替。對于擁有大面積,相同顏色區(qū)域的圖像,用RLE壓縮方法非常有效。由RLE原理派生出許多具體行程壓縮方法: 1.PCX行程壓縮方法: 該算法實際上是位映射格式到壓縮格式的轉(zhuǎn)換算法,該算法對于連續(xù)出現(xiàn)1次的字節(jié)Ch,若Ch>0xc0則壓縮時在該字節(jié)前加上0xc1,否則直接輸出Ch,對于連續(xù)出現(xiàn)N 次的字節(jié)Ch,則壓縮成0xc0+N,Ch這兩個字節(jié),因而N最大只能為ff-c0=3fh(十進制為63),當(dāng)N大于 63時, 則需分多次壓縮。 2.BI_RLE8壓縮方法:在WINDOWS的位圖文件中采用了這種壓縮方法。該壓縮方法編碼也是以兩個字節(jié)為基本單位。其中第一個字節(jié)規(guī)定了用第二個字節(jié)指定的顏色重復(fù)次數(shù)。 如編碼 0504表示從當(dāng)前位置開始連續(xù)顯示5個顏色值為04的像素。當(dāng)?shù)诙€字節(jié)為零時第二個字節(jié)有特殊含義:0表示行末;1表示圖末;2轉(zhuǎn)義后面2個字節(jié), 這兩個字節(jié)分別表示下一像素相對于當(dāng)前位置的水平位移和垂直位移。這種壓縮方法所能壓縮的圖像像素位數(shù)最大為8位(256色)圖像。 3.BI_RLE壓縮方法: 該方法也用于WINDOWS位圖文件中,它與 BI_RLE8編碼類似,唯一不同是:BI_RLE4的一個字節(jié)包含了兩個像素的顏色,因此,它只能壓縮的顏色數(shù)不超過16的圖像。因而這種壓縮應(yīng)用范圍有限。 4.緊縮位壓縮方法(Packbits):該方法是用于Apple公司的Macintosh機上的位圖數(shù)據(jù)壓縮 方法, TIFF 規(guī)范中使用了這種方法, 這種壓縮方法與BI_RLE8壓縮方法相似,如1c1c1c2132325648 壓縮為:83 1c 21 81 32 56 48,顯而易見, 這種壓縮方法最好情況是每連續(xù)128個字節(jié)相同,這128個字節(jié)可壓縮為一個數(shù)值7f。這種方法還是非常有效的。
二、霍夫曼編碼壓縮: 也是一種常用的壓縮方法。是1952年為文本文件建立的,其基本原理是頻繁使用的數(shù)據(jù)用較短的代碼代替,很少使用的數(shù)據(jù)用較長的代碼代替,每個數(shù)據(jù)的代碼各不相同。這些代碼都是二進制碼,且碼的長度是可變的。如: 有一個原始數(shù)據(jù)序列,ABACCDAA則編碼為A(0),B(10),C(110), (D111),壓縮后為010011011011100。產(chǎn)生霍夫曼編碼需要對原始數(shù)據(jù)掃描兩遍,第一遍掃描要精確地統(tǒng)計出原始數(shù)據(jù)中的每個值出現(xiàn)的頻率,第二遍是建立霍夫曼樹并進行編碼,由于需要建立二叉樹并遍歷二叉樹生成編碼,因此數(shù)據(jù)壓縮和還原速度都較慢,但簡單有效,因而得到廣泛的應(yīng)用。
三、LZW壓縮方法 LZW壓縮技術(shù)比其它大多數(shù)壓縮技術(shù)都復(fù)雜, 壓縮效率也較高。其基本原理是把每一個第一次出現(xiàn)的字符串用一個數(shù)值來編碼,在還原程序中再將這個數(shù)值還成原來的字符 串,如用數(shù)值0x100代替字符串"abccddeee"這樣每當(dāng)出現(xiàn)該字符串時,都用0x100代替,起到了壓縮的作用。 至于 0x100與字符串的對應(yīng)關(guān)系則是在壓縮過程中動態(tài)生成的,而且這種對應(yīng)關(guān)系是隱含在壓縮數(shù)據(jù)中,隨著解壓縮的進行這張編碼表會從壓縮數(shù)據(jù)中逐步得到恢復(fù),后面的壓縮數(shù)據(jù)再根據(jù)前面數(shù)據(jù)產(chǎn)生的對應(yīng)關(guān)系產(chǎn)生更多的對應(yīng)關(guān)系。直到壓縮文件結(jié)束為止。LZW是可逆的, 所有信息全部保留。
四、算術(shù)壓縮方法 算術(shù)壓縮與霍夫曼編碼壓縮方法類似,只不過它比霍夫曼編碼更加有效。算術(shù)壓縮適合于由相同的重復(fù)序列組成的文件,算術(shù)壓縮接近壓縮的理論極限。這種方法,是將不同的序列映像到0到1之間的區(qū)域內(nèi),該區(qū)域表示成可變精度(位數(shù) screen.width/2)this.width=screen.width/2" vspace=2 border=0>的二進制小數(shù),越不常見的數(shù)據(jù)要的精度越高(更多的位數(shù)),這種方法比較復(fù)雜,因而不太常用。
五、 JPEG( 聯(lián)合攝影專家組 Joint Photographic Exprerts Group) JPEG標(biāo)準(zhǔn)與其它的標(biāo)準(zhǔn)不同,它定義了不兼容的編碼方法,在它最常用的模式中,它是帶失真的,一個從JPEG文件恢復(fù)出來的圖像與原始圖像總是不同的,但有損壓縮重建后的圖像常常比原始圖像的效果更好。JPEG的另一個顯著的特點是它的壓縮比例相當(dāng)高,原圖像大小與壓縮后的圖像大小相比,比例可以從 1%到80~90%不等。 這種方法效 果也好,適合多媒體系統(tǒng)。
介紹完了壓縮算法,我們來簡要介紹一下三種位圖格式的異同和它們之間的相互轉(zhuǎn)換。 1. bmp圖象 · 位圖文件頭(BITMAPHEADER)數(shù)據(jù)結(jié)構(gòu) · 位圖信息(BITMAPINFO)數(shù)據(jù)結(jié)構(gòu) · 位圖陣列
1)位圖文件頭數(shù)據(jù)結(jié)構(gòu)包含BMP圖象文件的類型、顯示內(nèi)容等信息。 Typedef struct{ Int bfType; //must be "BM" Long bfSize; //位圖大小 Int bfReserved1;//must be "0" Int bfReserved2;//must be "0" Long bfOffBits;//位圖陣列的起始位置 }BITMAPEFILEHEADER;
2)位圖信息數(shù)據(jù)結(jié)構(gòu)由BITMAPINFOHEADER和RGBQUAD兩個數(shù)據(jù)結(jié)構(gòu)組成, typedef struct{ BITMAPINFOHEADER bmiHeader; RGBQUAD bmiColors[]; }BITMAPINFO
其中BITMAPINFOHEADER數(shù)據(jù)結(jié)構(gòu)包含了有關(guān)BMP圖象的寬、高、壓縮方法等信息。 數(shù)據(jù)結(jié)構(gòu)RGBQUAD定義一種顏色。
3)位圖陣列 位圖陣列記錄了圖象的每一個象素值。從圖象的左下角開始逐行掃描圖象。從左到右,從上到下,將圖象的象素值逐一記錄下來,這些記錄象素值的字節(jié)組成了位圖陣列。 位圖陣列數(shù)據(jù)的存儲格式有壓縮和非壓縮兩種格式。 1. 非壓縮格式 位圖中的每一個點的象素值對應(yīng)與位圖陣列的若干位,而位圖陣列的若干位由圖象的高度、寬度及圖象的顏色數(shù)決定。 2. 壓縮格式 在bmp格式文件中,Windows支持BI-RLE8和BI-RLE4兩種壓縮類型的存儲格式。
2、GIF圖象文件格式 GIF的全稱是Graphics Interchange Format,.譯做圖形交換格式。GIF是一種公用的圖象文件格式標(biāo)準(zhǔn),但它歸compuServe公司版權(quán)所有。
在一個GIF文件中首先碰到的是GIF的標(biāo)志,這個標(biāo)志告訴解碼程序這是個GIF文件。這個標(biāo)志是3字節(jié)的串:GIF。一個GIF文件中可以存放多幅圖象,但絕大多數(shù)的文件都只包含一幅圖象。 然后是屏幕描述字(screen descriptor),說明了用來生成的顯示文件中的圖象的顯示器分辨率,分別表示屏幕的寬和高。 緊跟下來的一個字節(jié)是全局標(biāo)志,其低三位說明了即將碰到的圖象是多少顏色的。最高位表示是否存在一個全局色彩表。 背景色表示把背景置成適當(dāng)?shù)念伾?,實際上是一個指向全局色彩表的數(shù)。 Struct Global_Data{ Unsigned short screen_width; Unsigned short screen_height; Unsigned char background; har tail=‘\0‘; } 接下來是全局色彩表,按順序存放所有的嚴(yán)肅,每一種嚴(yán)肅由色彩表的一項來描述,每項是3字節(jié),分別表示紅、綠、藍三種原色的強度。其長度有全局標(biāo)志的低三位表示。 以后的數(shù)據(jù)都是局部的了。是些數(shù)據(jù)塊的集合。下面是圖象數(shù)據(jù)塊的結(jié)構(gòu)。 Struct Local_Head{ Char heading=‘,‘; Unsigned short image_left;//圖象的屏幕上顯示的起始位置 Unsigned short image_top; Unsigned short image_width; Unsigned short image-height; Unsigned char local_flag;//局部標(biāo)志 }
局部標(biāo)志和 全局標(biāo)志的不同之處在于次高位,如果這位被置成1則表示圖像的位圖數(shù)據(jù)是以隔行方式存放的。也就是說,在解開的位圖數(shù)據(jù)中,第一行存放的是屏幕上第一行,第二行對應(yīng)屏幕上的第9行,第三行對應(yīng)屏幕上的第17行,以此遞增--這是第一遍掃描;第二遍掃描是從屏幕上的第5行開始,兩行之間也是以 8遞增;第三遍掃描是從屏幕上的第3行開始,兩行之間以4遞增;第四遍掃描,也是最后一遍,從第2行開始,兩行之間以2遞增。 隔行存放的GIF圖像在邊解碼邊顯示的時候可分成四遍掃描。第一遍掃描雖然只顯示了整個圖像的八分之一,第二遍的掃描后也只顯示了四分之一,但這已經(jīng)把整個圖像的概貌顯示出來了。在顯示GIF圖像的時,隔行存放的圖像會給你這樣一個印象:向它的顯示速度似乎要比其他圖像快一些,這是隔行存放的優(yōu)點。 在GIF圖像的編解碼中用到了LZW壓縮算法--把這些字符流轉(zhuǎn)換成另一種形式的代碼流,解碼過程則是把這種代碼流還原成原來的字符流。
3、JPEG圖象文件格式 JPEG是Joint Photographic Experts Group(聯(lián)合攝影專家小組)的首字母縮寫。JPEG的主要作用是用于數(shù)字化圖象的標(biāo)準(zhǔn)編碼技術(shù)。JPEG圖象文件是一種象素格式文件格式,但它比諸如象GIF、BMP等圖象文件要復(fù)雜的多。所幸,我們在使用由JPEG組成的JPEG 庫時,只要對該文件格式有個一般的了解就可以了。而沒有必要對JPEG文件格式做一個全面細致的了解。 JPEG格式是種有損的編碼格式,但如果GIF文件比,他經(jīng)過解碼后的重構(gòu)圖象要比GIF圖象更接近于原始的圖象。 JPEG編碼技術(shù)是由顏色轉(zhuǎn)換、DCT變換、進行量化、編碼。其壓縮格式由著名的JPEG集團所著的4.0版本的庫所定。
關(guān)于這3種圖象格式的互相轉(zhuǎn)換,主要是用c語言或c++和匯編語言,因為這些語言可以 直接進行底層的操作,把圖象解壓縮后按用另一種格式要求進行壓縮即可。
|