版本記錄
| 版本號 | 時間 |
|---|---|
| V1.0 | 2017.09.05 |
前言
只要是做圖片的或者與圖片相關(guān)的,那么圖片的格式就是一個不可以繞過的問題,我們見過很多的圖片格式,但是具體不同的圖片格式是如何定義的,又具有什么特點(diǎn),很多時候我們都沒有深入研究過,下面我們就開始深入研究。
幾種圖片格式
圖片有很多的格式,包括PNG、JPEG、JPG、BMP等,下面我們就詳細(xì)的說一下這幾張圖片的格式,并進(jìn)行詳細(xì)的對比。
PNG
便攜式網(wǎng)絡(luò)圖形(Portable Network Graphics)是一種無損壓縮的位圖圖形格式 。其設(shè)計目的是試圖替代GIF和TIFF文件格式,同時增加一些GIF文件格式所不具備的特性。PNG的名稱來源于“可移植網(wǎng)絡(luò)圖形格式(Portable Network Graphic Format,PNG)”,也有一個非官方解釋“PNG's Not GIF”。PNG使用從LZ77派生的無損數(shù)據(jù)壓縮算法,一般應(yīng)用于JAVA程序、網(wǎng)頁或S60程序中,原因是它壓縮比高,生成文件體積小。
1. 特點(diǎn)
PNG格式的圖片具有如下特點(diǎn):
體積?。壕W(wǎng)絡(luò)通訊中因受帶寬制約,在保證圖片清晰、逼真的前提下,網(wǎng)頁中不可能大范圍的使用文件較大的
bmp格式文件。無損壓縮:
PNG文件采用LZ77算法的派生算法進(jìn)行壓縮,其結(jié)果是獲得高的壓縮比,不損失數(shù)據(jù)。它利用特殊的編碼方法標(biāo)記重復(fù)出現(xiàn)的數(shù)據(jù),因而對圖像的顏色沒有影響,也不可能產(chǎn)生顏色的損失,這樣就可以重復(fù)保存而不降低圖像質(zhì)量。索引彩色模式:
PNG-8格式與GIF圖像類似,同樣采用8位調(diào)色板將RGB彩色圖像轉(zhuǎn)換為索引彩色圖像。圖像中保存的不再是各個像素的彩色信息,而是從圖像中挑選出來的具有代表性的顏色編號,每一編號對應(yīng)一種顏色,圖像的數(shù)據(jù)量也因此減少,這對彩色圖像的傳播非常有利。更優(yōu)化的網(wǎng)絡(luò)傳輸顯示: PNG圖像在瀏覽器上采用流式瀏覽,即使經(jīng)過交錯處理的圖像會在完全下載之前提供瀏覽者一個基本的圖像內(nèi)容,然后再逐漸清晰起來。它允許連續(xù)讀出和寫入圖像數(shù)據(jù),這個特性很適合于在通信過程中顯示和生成圖像。
支持透明效果:PNG可以為原圖像定義
256個透明層次,使得彩色圖像的邊緣能與任何背景平滑地融合,從而徹底地消除鋸齒邊緣。這種功能是GIF和JPEG沒有的。PNG同時還支持真彩和灰度級圖像的Alpha通道透明度。
最高支持
24位真彩色圖像以及8位灰度圖像。支持
Alpha通道的透明/半透明特性。支持圖像亮度的
Gamma校準(zhǔn)信息。支持存儲附加文本信息,以保留圖像名稱、作者、版權(quán)、創(chuàng)作時間、注釋等信息。
漸近顯示和流式讀寫,適合在網(wǎng)絡(luò)傳輸中快速顯示預(yù)覽效果后再展示全貌。
使用
CRC防止文件出錯。最新的
PNG標(biāo)準(zhǔn)允許在一個文件內(nèi)存儲多幅圖像。
2. 文件結(jié)構(gòu)
PNG圖像格式文件(或者稱為數(shù)據(jù)流)由一個8字節(jié)的PNG文件署名(PNG file signature)域和按照特定結(jié)構(gòu)組織的3個以上的數(shù)據(jù)塊(chunk)組成。
文件署名域
8字節(jié)的PNG文件署名域用來識別該文件是不是PNG文件。該域的值是:
- 十進(jìn)制數(shù)
137 80 78 71 13 10 26 10 - 十六進(jìn)制數(shù)
89 50 4e 47 0d 0a 1a 0a
數(shù)據(jù)塊類型碼命名約定
輔助位: 第一個字節(jié)的第5位是0(大寫)=關(guān)鍵,1(小寫)=輔助。一個解碼器遇到一個不能識別的塊時,如果發(fā)現(xiàn)輔助位為1則可以放心地忽略該塊,并繼續(xù)顯示圖像。
私人位:第二個字節(jié)的第5位是0(大寫)=公用,1(小寫)=私人。應(yīng)用程序也可以定義私有(未注冊)塊來達(dá)到自己的目的。需要注意的是解碼器并不需要理會塊的私人位——因?yàn)樗鼪]有功能上的意義,它只是一個管理上的便利,以確保公共塊和私人塊名稱不會沖突。
保留位:第三個字節(jié)的第5位必須為0(大寫)。該位的意義是為將來可能的擴(kuò)展保留。
-
安全拷貝位:第4個字節(jié)的第5位是0(大寫)=復(fù)制不安全,1(小寫)=復(fù)制安全。
- 該位為0(大寫),表示該塊的內(nèi)容隨圖像數(shù)據(jù)的更新而更新,如果修改了任何關(guān)鍵數(shù)據(jù)塊(包括增添、修改、刪除以及關(guān)鍵塊的重新排序),就不要把不能識別且“復(fù)制不安全”的塊輸出到新的png文件中。(如果png編輯器可以識別該塊,那么當(dāng)然可以選擇輸出適當(dāng)修改后的版本)
- 該位為1(小寫),表示不論png編輯器是否可以識別該塊,也不管png文件被多大程度地修改,該塊都可以被拷貝到修改后的png文件中。
- 如果只有輔助塊的增添、刪除、修改或輔助塊的重新排序,png編輯器將總是被允許將不能識別的輔助塊拷貝到修改后的png文件中,這就要求:不論”安全拷貝位“如何設(shè)置,一個輔助塊都不能僅隨其它輔助塊的更新而更新。(即,如果在png中加入自定義的輔助塊,必須做到當(dāng)僅更新其他輔助塊中的數(shù)據(jù)時,該輔助塊不需要連帶更新,否則上述機(jī)制就會破壞該輔助塊與其余圖像數(shù)據(jù)的一致性)
- 如果png編輯器遇到一個不能識別的關(guān)鍵塊,因?yàn)闆]有辦法確定修改包含這種塊的文件后png文件還是否有效,所以png編輯器應(yīng)立刻停止修改這個png文件。(簡單地刪除這個塊的做法不夠好,因?yàn)檫@個塊還可能與解碼其他塊有關(guān))
- 復(fù)制安全/不安全的機(jī)制是為輔助塊設(shè)計的。對于關(guān)鍵塊,”安全拷貝位“應(yīng)該總是為0。
3. 數(shù)據(jù)塊結(jié)構(gòu)
PNG定義了兩種類型的數(shù)據(jù)塊,一種是稱為關(guān)鍵數(shù)據(jù)塊(critical chunk),這是必需的數(shù)據(jù)塊,另一種叫做輔助數(shù)據(jù)塊(ancillary chunks),這是可選的數(shù)據(jù)塊。關(guān)鍵數(shù)據(jù)塊定義了4個標(biāo)準(zhǔn)數(shù)據(jù)塊,每個PNG文件都必須包含它們,PNG讀寫軟件也都必須要支持這些數(shù)據(jù)塊。雖然PNG文件規(guī)范沒有要求PNG編譯碼器對可選數(shù)據(jù)塊進(jìn)行編碼和譯碼,但規(guī)范提倡支持可選數(shù)據(jù)塊。
數(shù)據(jù)塊的4個域組成如下圖所示。

下面我們就分析下這個結(jié)構(gòu)。
- 長度:一個4字節(jié)的無符號整數(shù),給出數(shù)據(jù)塊的數(shù)據(jù)字段的長度(以字節(jié)計)。 長度只計算數(shù)據(jù)域,為了兼容一些不支持無符號的語言,所以長度限制在(231 - 1)字節(jié),不能達(dá)到(232 - 1)字節(jié)。
- 數(shù)據(jù)塊類型碼:一個4字節(jié)的塊類型代碼。 為了便于描述和檢查PNG文件,類型代碼僅限于大寫和小寫的ASCII字母(A - Z和a - z,使用十進(jìn)制ASCII代碼表示為65-90和97-122)。 然而,編碼器和解碼器必須把代碼作為固定的二進(jìn)制值而非字符串來處理。
- 數(shù)據(jù)域:數(shù)據(jù)塊的數(shù)據(jù)域,存儲按照數(shù)據(jù)塊類型碼指定的數(shù)據(jù)(如果有的話)。 該字段可以是長度為零。
- 循環(huán)冗余檢測:一個4字節(jié)的CRC(循環(huán)冗余校驗(yàn))計算,在所述塊的前面的字節(jié),包括該塊類型的代碼和數(shù)據(jù)塊的數(shù)據(jù)字段,但是不包括長度字段。 CRC始終存在,即使不包含數(shù)據(jù)塊。
CRC(cyclic redundancy check)域中的值是對Chunk Type Code域和Chunk Data域中的數(shù)據(jù)進(jìn)行計算得到的。CRC具體算法定義在ISO 3309和ITU-T V.42中。
關(guān)鍵數(shù)據(jù)塊
關(guān)鍵數(shù)據(jù)塊的組成如下所示。

-
IHDR:文件頭數(shù)據(jù)塊IHDR(header chunk):它包含有PNG文件中存儲的圖像數(shù)據(jù)的基本信息,并要作為第一個數(shù)據(jù)塊出現(xiàn)在PNG數(shù)據(jù)流中,而且一個PNG數(shù)據(jù)流中只能有一個文件頭數(shù)據(jù)塊。 -
PLTE:調(diào)色板數(shù)據(jù)塊PLTE(palette chunk)包含有與索引彩色圖像(indexed-color image)相關(guān)的彩色變換數(shù)據(jù),它僅與索引彩色圖像有關(guān),而且要放在圖像數(shù)據(jù)塊(image data chunk)之前。PLTE數(shù)據(jù)塊是定義圖像的調(diào)色板信息,PLTE可以包含1~256個調(diào)色板信息,每一個調(diào)色板信息由3個字節(jié)組成。 -
IDAT:圖像數(shù)據(jù)塊IDAT(image data chunk):它存儲實(shí)際的數(shù)據(jù),在數(shù)據(jù)流中可包含多個連續(xù)順序的圖像數(shù)據(jù)塊。IDAT存放著圖像真正的數(shù)據(jù)信息,因此,如果能夠了解IDAT的結(jié)構(gòu),我們就可以很方便的生成PNG圖像。 -
IEND:圖像結(jié)束數(shù)據(jù)IEND(image trailer chunk):它用來標(biāo)記PNG文件或者數(shù)據(jù)流已經(jīng)結(jié)束,并且必須要放在文件的尾部。如果我們仔細(xì)觀察PNG文件,我們會發(fā)現(xiàn),文件的結(jié)尾12個字符看起來總應(yīng)該是這樣的:
0000000049454E44AE426082,不難明白,由于數(shù)據(jù)塊結(jié)構(gòu)的定義,IEND數(shù)據(jù)塊的長度總是0(00 00 00 00,除非人為加入信息),數(shù)據(jù)標(biāo)識總是IEND(49 45 4E 44),因此,CRC碼也總是AE 42 60 82。
輔助數(shù)據(jù)塊
看下面這個數(shù)據(jù)結(jié)構(gòu)圖。

4. 幾種PNG格式
PNG格式有8位、24位、32位三種形式,其中8位PNG支持兩種不同的透明形式(索引透明和alpha透明),24位PNG不支持透明,32位PNG在24位基礎(chǔ)上增加了8位透明通道,因此可展現(xiàn)256級透明程度。
PNG8和PNG24后面的數(shù)字則是代表這種PNG格式最多可以索引和存儲的顏色值?!?″代表2的8次方也就是256色,而24則代表2的24次方大概有1600多萬色。
具體如下圖所示。

5. 與GIF比較
- 一般情況下將靜態(tài)GIF圖像無損轉(zhuǎn)換為PNG后可以壓縮率會略為提高(前提是同樣采用8位索引模式)。
- PNG可提供更大顏色深度的支持,包括24位(8位3通道)和48位(16位3通道)真彩色。加入α通道后可進(jìn)一步支持每像素64位的表示。
- 超過8位色深的PNG圖像轉(zhuǎn)換為GIF時,圖像質(zhì)量會由于分色(顏色數(shù)減少)而下降。
- GIF原生支持動態(tài)圖像,PNG只能通過非標(biāo)準(zhǔn)實(shí)現(xiàn),在PNG的基礎(chǔ)上另有發(fā)展出支持動畫的APNG和MNG格式,但目前普及度不高。
參考文章
1. PNG,JPEG,BMP,JIF圖片格式詳解及其對比
2. PNG
后記
未完,待續(xù)~~~
