BMP、GIF和JPEG檔案格式簡介及相互轉換

來源:互聯網
上載者:User
BMP、GIF和JPEG檔案格式簡介及相互轉換 作者:江平 發布時間:2000/11/27
 
文章摘要:
  本文主要討論的是位元影像的壓縮方法。

       

本文:  

BMP、GIF和JPEG檔案格式簡介及相互轉換  

  圖象檔案就是描繪了一幅圖象的電腦磁碟檔案。形成數字圖象資料後,將其儲存在電腦裡的方法有2種,即位映射和向量處理方式。
  我們這裡主要討論的是位元影像。不同圖象軟體幾乎都用各種的方法處理圖象,圖象格式也多種多樣,它主要包括檔案識別頭和圖象資料。檔案識別頭用來讓電腦判斷是哪種檔案格式,圖象資料包含了整個對圖象描繪相關資料,包括調色盤、位元影像映象等。根據壓縮演算法不同,映象方式也不同,下面簡要介紹一下壓縮演算法。

一、 行程長度壓縮
  原理是將一掃描行中的顏色值相同的相鄰像素用一個計數值和那些像素的顏色值來代替。例如:aaabccccccddeee,則可用3a1b6c2d3e來代替。對於擁有大面積,相同顏色地區的映像,用RLE壓縮方法非常有效。由RLE原理派生出許多具體行程壓縮方法:
  1.PCX行程壓縮方法: 該演算法實際上是位映射格式到壓縮格式的轉換演算法,該演算法對於連續出現1次的位元組Ch,若Ch>0xc0則壓縮時在該位元組前加上0xc1,否則直接輸出Ch,對於連續出現N 次的位元組Ch,則壓縮成0xc0+N,Ch這兩個位元組,因而N最大隻能為ff-c0=3fh(十進位為63),當N大於63時, 則需分多次壓縮。
  2.BI_RLE8壓縮方法:在WINDOWS的位元影像檔案中採用了這種壓縮方法。該壓縮方法編碼也是以兩個位元組為基本單位。其中第一個位元組規定了用第二個位元組指定的顏色重複次數。 如編碼 0504表示從當前位置開始連續顯示5個顏色值為04的像素。當第二個位元組為零時第二個位元組有特殊含義:0表示行末;1表示圖末;2轉義後面2個位元組, 這兩個位元組分別表示下一像素相對於當前位置的水平位移和垂直位移。這種壓縮方法所能壓縮的映像像素位元最大為8位(256色)映像。
  3.BI_RLE壓縮方法: 該方法也用於WINDOWS位元影像檔案中,它與 BI_RLE8編碼類別似,唯一不同是:BI_RLE4的一個位元組包含了兩個像素的顏色,因此,它只能壓縮的顏色數不超過16的映像。因而這種壓縮應用範圍有限。
  4.緊縮位壓縮方法(Packbits):該方法是用於Apple公司的Macintosh機上的位元影像資料壓縮 方法, TIFF 規範中使用了這種方法, 這種壓縮方法與BI_RLE8壓縮方法相似,如1c1c1c2132325648 壓縮為:83 1c 21 81 32 56 48,顯而易見, 這種壓縮方法最好情況是每連續128個位元組相同,這128個位元組可壓縮為一個數值7f。這種方法還是非常有效。

二、霍夫曼編碼壓縮:
  也是一種常用的壓縮方法。是1952年為文字檔建立的,其基本原理是頻繁使用的資料用較短的代碼代替,很少使用的資料用較長的代碼代替,每個資料的代碼各不相同。這些代碼都是二進位碼,且碼的長度是可變的。如: 有一個未經處理資料序列,ABACCDAA則編碼為A(0),B(10),C(110),(D111),壓縮後為010011011011100。產生霍夫曼編碼需要對未經處理資料掃描兩遍,第一遍掃描要精確地統計出未經處理資料中的每個值出現的頻率,第二遍是建立霍夫曼樹並進行編碼,由於需要建立二叉樹並遍曆二叉樹產生編碼,因此資料壓縮和還原速度都較慢,但簡單有效,因而得到廣泛的應用。

三、LZW壓縮方法
  LZW壓縮技術比其它大多數壓縮技術都複雜, 壓縮效率也較高。其基本原理是把每一個第一次出現的字串用一個數值來編碼,在還原程式中再將這個數值還成原來的字元 串,如用數值0x100代替字串"abccddeee"這樣每當出現該字串時,都用0x100代替,起到了壓縮的作用。 至於0x100與字串的對應關係則是在壓縮過程中動態產生的,而且這種對應關係是隱含在壓縮資料中,隨著解壓縮的進行這張編碼錶會從壓縮資料中逐步得到恢複,後面的壓縮資料再根據前面資料產生的對應關係產生更多的對應關係。直到壓縮檔結束為止。LZW是可逆的, 所有資訊全部保留。

四、算術壓縮方法
  算術壓縮與霍夫曼編碼壓縮方法類似,只不過它比霍夫曼編碼更加有效。算術壓縮適合於由相同的重複序列組成的檔案,算術壓縮接近壓縮的理論極限。這種方法,是將不同的序列映像到0到1之間的地區內,該地區表示成可變精度(位元 )的二進位小數,越不常見的資料要的精度越高(更多的位元),這種方法比較複雜,因而不太常用。

五、 JPEG( 聯合攝影專家組 Joint Photographic Exprerts Group)
  JPEG標準與其它的標準不同,它定義了不相容的編碼方法,在它最常用的模式中,它是帶失真的,一個從JPEG檔案恢複出來的映像與原始映像總是不同的,但有損壓縮重建後的映像常常比原始映像的效果更好。JPEG的另一個顯著的特點是它的壓縮比例相當高,原映像大小與壓縮後的映像大小相比,比例可以從1%到80~90%不等。 這種方法效 果也好,適合多媒體系統。

  介紹完了壓縮演算法,我們來簡要介紹一下三種位元影像格式的異同和它們之間的相互轉換。
  1. bmp圖象
   · 位元影像檔案頭(BITMAPHEADER)資料結構
   · 位元影像資訊(BITMAPINFO)資料結構
   · 位元影像陣列

  1)位元影像檔案頭資料結構包含BMP圖象檔案的類型、顯示內容等資訊。
  Typedef struct{
      Int bfType; //must be "BM"
      Long bfSize; //位元影像大小
      Int bfReserved1;//must be "0"
      Int bfReserved2;//must be "0"
      Long bfOffBits;//位元影像陣列的起始位置
  }BITMAPEFILEHEADER;

  2)位元影像資訊資料結構由BITMAPINFOHEADER和RGBQUAD兩個資料結構組成,
  typedef struct{
      BITMAPINFOHEADER bmiHeader;
      RGBQUAD bmiColors[];
  }BITMAPINFO

  其中BITMAPINFOHEADER資料結構包含了有關BMP圖象的寬、高、壓縮方法等資訊。
  資料結構RGBQUAD定義一種顏色。

  3)位元影像陣列
  位元影像陣列記錄了圖象的每一個象素值。從圖象的左下角開始漸進式掃描圖象。從左至右,從上到下,將圖象的象素值逐一記錄下來,這些記錄象素值的位元組組成了位元影像陣列。
  位元影像陣列資料的儲存格式有壓縮和非壓縮兩種格式。
  1. 非壓縮格式 位元影像中的每一個點的象素值對應與位元影像陣列的若干位,而位元影像陣列的若干位由圖象的高度、寬度及圖象的顏色數決定。
  2. 壓縮格式 在bmp格式檔案中,Windows支援BI-RLE8和BI-RLE4兩種壓縮類型的儲存格式。

  2、GIF圖象檔案格式
  GIF的全稱是Graphics Interchange Format,.譯做圖形交換格式。GIF是一種公用的圖象檔案格式標準,但它歸compuServe公司著作權。
GIF檔案結構包含一個檔案頭,
            

  在一個GIF檔案中首先碰到的是GIF的標誌,這個標誌告訴解碼程式這是個GIF檔案。這個標誌是3位元組的串:GIF。一個GIF檔案中可以存放多幅圖象,但絕大多數的檔案都只包含一幅圖象。
  然後是螢幕描述字(screen descriptor),說明了用來產生的顯示檔案中的圖象的顯示器解析度,分別表示螢幕的寬和高。
  緊跟下來的一個位元組是全域標誌,其低三位說明了即將碰到的圖象是多少顏色的。最高位表示是否存在一個全域色彩表。
  背景色表示把背景置成適當的顏色,實際上是一個指向全域色彩表的數。
  Struct Global_Data{
    Unsigned short screen_width;
    Unsigned short screen_height;
    Unsigned char background;
    har tail='/0';
    }
  接下來是全域色彩表,按順序存放所有的嚴肅,每一種嚴肅由色彩表的一項來描述,每項是3位元組,分別表示紅、綠、藍三種原色的強度。其長度有全域標誌的低三位表示。
  以後的資料都是局部的了。是些資料區塊的集合。下面是圖象資料區塊的結構。
  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;//局部標誌
    }

  局部標誌和 全域標誌的不同之處在於次高位,如果這位被置成1則表示映像的位元影像資料是以隔行方式存放的。也就是說,在解開的位元影像資料中,第一行存放的是螢幕上第一行,第二行對應螢幕上的第9行,第三行對應螢幕上的第17行,以此遞增--這是第一遍掃描;第二遍掃描是從螢幕上的第5行開始,兩行之間也是以8遞增;第三遍掃描是從螢幕上的第3行開始,兩行之間以4遞增;第四遍掃描,也是最後一遍,從第2行開始,兩行之間以2遞增。隔行存放的映像資料和順序(不隔行)存放的映像資料的對應關係如所示:
  

  隔行存放的GIF映像在邊解碼邊顯示的時候可分成四遍掃描。第一遍掃描雖然只顯示了整個映像的八分之一,第二遍的掃描後也只顯示了四分之一,但這已經把整個映像的概貌顯示出來了。在顯示GIF映像的時,隔行存放的映像會給你這樣一個印象:向它的顯示速度似乎要比其他映像快一些,這是隔行存放的優點。
  在GIF映像的編解碼中用到了LZW壓縮演算法--把這些字元流轉換成另一種形式的代碼流,解碼過程則是把這種代碼流還原成原來的字元流。

  3、JPEG圖象檔案格式
  JPEG是Joint Photographic Experts Group(聯合攝影專家小組)的首字母縮寫。JPEG的主要作用是用於數字化圖象的標準編碼技術。JPEG圖象檔案是一種象素格式檔案格式,但它比諸如象GIF、BMP等圖象檔案要複雜的多。所幸,我們在使用由JPEG組成的JPEG庫時,只要對該檔案格式有個一般的瞭解就可以了。而沒有必要對JPEG檔案格式做一個全面細緻的瞭解。
  JPEG格式是種有損的編碼格式,但如果GIF檔案比,他經過解碼後的重構圖象要比GIF圖象更接近於原始的圖象。 JPEG編碼技術是由色彩轉換、DCT變換、進行量化、編碼。其壓縮格式由著名的JPEG集團所著的4.0版本的庫所定。

  關於這3種圖象格式的互相轉換,主要是用c語言或c++和組合語言,因為這些語言可以 直接進行底層的操作,把圖象解壓縮後按用另一種格式要求進行壓縮即可。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.