2012-02-24 59 views
1

在過去的幾天裏,我已經做了一些關於PNG的擺弄工作,我對我的發現感到不滿。我得出結論,我的大多數結果都是關於壓縮的。所以這個週末我要深入研究高級壓縮文章。我想到目前爲止分享我的發現。看看有沒有人對實現我的目標有任何建議,也許可以指引我朝着正確的方向發展。自定義圖像格式:如何定位壓縮算法

我目前正在研究一個項目,我需要在小於15秒的窗口內獲得儘可能小的文件大小。

我正在使用的大多數圖像都是PNG-8bpp,具有完整的256色調色板。我可以用5bpp(32種顏色)準確表示這些圖像中的大多數。

但是PNG索引只支持1,2,4和8bpp。所以我的想法是剝離PNG格式到我需要的最小信息,並編寫一個編碼器/解碼器來支持3,5,6或7bpp的IDAT部分。

Test 1: 
Original File: 61.5KB, 750 * 500, 8pp Palette, 256 colors, No tRNS 
After Optimizations (Reductions to 4bpp, Strip Anx Chunks, & PNGOUT): 49.2KB 4bpp, 16 Colors 
Human Interpretation: I can see 6 distinguishable colors. 

因爲我只需要六種顏色來代表我決定使用3bpp給我的8個色的調色板最高編碼的IDAT的圖像。首先,我解壓縮了IDAT,導致368KB的新文件大小。在將一個3bpp應用到IDAT後,我的新的未壓縮文件大小是274KB。我開始看起來是一個好的開始...接下來我將deflate應用於我的新IDAT部分。結果... 59KB。

比使用4bpp大10KB。

Test 2: 
Original File: 102KB, 1000 * 750, 8bpp, 256 Colors, tRNS 1 fully transparent color 
After Optimization: 79KB, 8bpp, 193 colors, tRNS 1 full transparent color 
Human Interpretation: I need about 24 colors to represent this picture. 

24種顏色可用5bpp以32種顏色表示。使用上述相同的技術,我能夠在未壓縮的情況下獲得更好的結果,但是我又一次在壓縮時丟失了。最終尺寸壓縮... 84KB。然後我試着在6,7bpp ...相同的結果較差的壓縮,在8bpp。

爲了確保我保存了所有未壓縮的圖像並嘗試了其他幾種壓縮算法... LZMA,BZIP2,PAQ8 ...相同,結果是在8bpp處的壓縮比小於5,6或7bpp, 4bpp而不是3bpp。

這是爲什麼發生?我可以調整/修改壓縮算法,以使用5,6或7bpp格式的野獸8bpp壓縮的PNG格式嗎?這是值得的時間...是的,保存另一個10KB將是值得的。

回答

2

您所看到的是,通過使用奇數像素大小,由於PNG壓縮的方式,您的有效壓縮率會降低。 PNG壓縮比僅使用直接FLATE/ZIP壓縮的優點是過濾。 PNG壓縮試圖利用小分類的預處理濾波器來利用水平和垂直對稱性。這些濾波器在字節邊界上工作,並且對於4/8/16/24/32/48/64比特的像素尺寸有效。當你移動到一個奇數大小的像素時(3/5/6/7位),你正在擊敗濾波器,因爲在8位邊界上進行濾波時,相同顏色的像素將不會「相互抵消」。

即使濾波不成問題,FLATE壓縮的工作方式將像素大小從8個減少到7個或6個比特也不會產生太大影響,因爲它也假定符號大小爲8位。

總之......通過使用奇數大小的像素可以實現的唯一好處是未壓縮的數據會更小。通過打破像素的字節邊界對稱性,您可以擊敗PNG壓縮的許多好處。

GIF壓縮支持從1到8位的所有像素大小。它將符號大小定義爲像素大小,不使用任何預過濾。如果壓縮爲7位像素,8位GIF圖像不會受到較少的壓縮,但也不會受益,因爲壓縮更多地取決於像素的重複性而非符號大小。通過PNG使用

+0

濾波字節永遠是每個掃描線之前爲零。從我讀過的東西來看,在索引圖像中往往沒有好處。因此,我也剝去了過濾器字節以節省空間。我也不必使用deflate壓縮IDAT部分...我仍在測試其他壓縮算法設置,以查看我是否可以定位較少的bpp。 – 2012-02-27 03:54:55

+0

過濾可以有利於索引圖像;它取決於圖像。正如我上面所說的,你正在傷害PNG濾波和尋找重複字節(而不是像素)的FLATE壓縮的好處。如果你有連續色調(照片類型)的圖像,你不會比JPEG更好的壓縮。對於卡通或線條圖,LZW(GIF)對於奇數像素尺寸可能會更好。 – BitBank 2012-02-27 04:24:32

+0

在我沒有進行的測試中,GIF文件的大小在5-7bpp時比PNG8小,調色板相同。我能夠使用6bpp實現更好的壓縮,並且使用比最初的PNG8填充最後兩位的模式。我想知道是否有辦法將壓縮器設置爲每x字節量尋找模式?所以對於6bpp,我希望每個3字節的模式。我將嘗試使用LZMA和lc lp p開關。 – 2012-02-28 14:31:52

0

DEFLATE壓縮有兩個主要的技術:

  • 發現重複字節序列並且將它們編碼爲使用霍夫曼反向引用
  • 編碼字節編碼

通過從改變像素長度8位,你與字節邊界不同步,並且DEFLATE將不能將重複像素運行編碼爲重複字節。

而且由於採用Huffman編碼也沒關係該8位像素具有未使用的位,這是因爲編碼將編碼字節具有可變寬度碼最頻繁出現的值指派最短的。