发布时间:2025-07-05 08:18:05源自:本站作者:PB2345素材网阅读(14)
如何理解PNG的格式和他們使用的算法?PNG和jpeg有什麽區別?我們可以去看看。
Png是便攜式網絡圖形的縮寫。由於PNG具有透明通道和無損壓縮,可以提高設計元素的呈現效果。所以PNG對設計情有獨鍾,廣泛應用於設計、遊戲、網頁、app開發。實踐中存在很多誤區,導致濫用。下麵總結一下我之前學習PNG的經驗。
首先,PNG及其誕生與GIF格式有很大關係。裏麵有很多有趣的東西,你可以自己去查閱。PNG的壓縮過程是完全無損的,壓縮後的文件可以準確還原原始圖像,並且可以封裝各種pixfmt格式的數據,是一種可擴展的封裝格式。
PNG文件格式包含不同的塊,每個塊包含不同類型的數據。典型的PNG數據包括四個部分,在此基礎上,APNG運動圖像格式增加了acTL(動畫控製塊)、fcTL(幀控製塊)和fdAT(幀數據塊)。
PNG簽名(PNG簽名塊,包含PNG類型標識)IHDR(圖像頭塊,包括圖片的寬度、高度、位深和顏色類型)IDAT(圖像數據塊,像素壓縮數據)IEND(圖像結束塊,結束ID)
PNG圖像格式文件由一個8字節的PNG文件簽名(PNG簽名:0x89、0x50、0x4e、0x47、0x0D、0x0A、0xa、0x0A)和三個以上的數據塊組成,按照特定的PNG定義了兩種類型的數據塊,一種稱為關鍵塊(critical chunk),是標準的數據塊,另一種稱為輔助塊(ancillary chunks),是可選的數據塊。關鍵數據塊定義了四個標準數據塊,每個PNG文件都必須包含它們。PNG讀寫軟件也必須支持這些數據塊。雖然PNG文件規範不要求PNG編解碼器對可選數據塊進行編解碼,但是規範提倡支持可選數據塊。
PNG圖像格式文件由一個8字節PNG文件簽名(PNG簽名:0x89、0x50、0x4e、0x47、0x0D、0x0A、0x1A、0x0A)和三個以上按照特定結構組織的數據塊組成。PNG定義了兩種類型的數據塊,一種稱為關鍵塊(critical chunk),是標準的數據塊,另一種稱為輔助塊(ancillary chunks),是可選的數據塊。關鍵數據塊定義了四個標準數據塊,每個PNG文件都必須包含它們。PNG讀寫軟件也必須支持這些數據塊。雖然PNG文件規範不要求PNG編解碼器對可選數據塊進行編解碼,但是規範提倡支持可選數據塊。
每個數據塊的排列如下,包括數據塊中的數據長度、塊類型、塊數據和CRC校驗碼。
典型PNG文件的十六進製如下:
(1)PNG signaturePNG signature是固定的8個字節0x89、0x50、0x4e、0x47、0x0d、0x0a、0x1A (2) ihdr文件頭數據塊IHDR(header chunk,13個字節)包含存儲在PNG文件中的圖像數據的基本信息。包括分辨率、位深、顏色模式、壓縮方式,都是非常重要的數據塊,必須作為第一個數據塊出現在PNG數據流中,一個PNG數據流中隻能有一個文件頭數據塊。
(3)IDAT圖像數據塊IDAT(圖像數據塊)存儲實際數據,並且數據流可以包含多個連續的圖像數據塊。IDAT存儲了圖像的真實數據信息,因此如果我們能夠了解IDAT的結構,我們就可以很容易地生成PNG圖像。生成IDAT需要通過過濾器(用
體算法由IHDR指定),再經過Deflate(具體算法由IHDR指定)(4)IEND圖像結束數據IEND(image trailer chunk)用來標記PNG文件或者數據流已經結束,並且必須要放在文件的尾部。如果我們仔細觀察PNG文件,我們會發現,文件的結尾12個字符看起來總應該是這樣的:00 00 00 00 49 45 4E 44 AE 42 60 82由於IEND數據塊的長度是0(00 00 00 00,除非人為加入信息),數據標識總是IEND(49 45 4E 44),因此,CRC碼也總是AE 42 60 82。IDAT的壓縮過程主要包括Filter和deflate兩部分,Filter即對像素做過濾,PNG編碼使用差分對原始像素數據進行Filter,該過程無任何壓縮損失,並且完全可逆。對圖像來說,存儲殘差所需的比特遠遠小於實際圖像所需,這也是差分編碼的收益來源。
差分編碼原理如下,對於每一行像素點X,使用左、左上、上的三個像素來進行約束,對於不同的內容,須使用不同的Filter類型來提升壓縮收益。
PNG在壓縮時,對每行的圖像以byte為單位進行filter,如圖像為真彩色RGBA圖像,則先對R分量進行filter,再依次對G、B、A進行Filter[5]。
PNG中的Deflate與gzip、zlib中的deflate原理一樣,結合了LZ77和Hoffman算法。Ziv和Lempel於1977年發表《A Universal Algorithm for Sequential Data Compression 》進行像素數據的壓縮,定義了一種編碼標準而沒定義具體實現,後來稱為LZ77算法,LZ77壓縮算法采用字典的方式進行壓縮,是一個簡單但十分高效的數據壓縮算法。其方式就是把數據中一些可以組織成短語(最長字符)的字符加入字典,然後再有相同字符出現采用標記來代替字典中的短語,如此通過標記代替多數重複出現的方式以進行壓縮。Hoffman是一種變長編碼,即用少的bit數表示出現概率大的數據。deflate算法用在壓縮圖片數據上,有以下特點:
本文到此結束,希望對大家有所幫助呢。
欢迎分享转载→ vsszwf.hor4s.com