在過去的幾天裏,我已經做了一些關於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將是值得的。
濾波字節永遠是每個掃描線之前爲零。從我讀過的東西來看,在索引圖像中往往沒有好處。因此,我也剝去了過濾器字節以節省空間。我也不必使用deflate壓縮IDAT部分...我仍在測試其他壓縮算法設置,以查看我是否可以定位較少的bpp。 – 2012-02-27 03:54:55
過濾可以有利於索引圖像;它取決於圖像。正如我上面所說的,你正在傷害PNG濾波和尋找重複字節(而不是像素)的FLATE壓縮的好處。如果你有連續色調(照片類型)的圖像,你不會比JPEG更好的壓縮。對於卡通或線條圖,LZW(GIF)對於奇數像素尺寸可能會更好。 – BitBank 2012-02-27 04:24:32
在我沒有進行的測試中,GIF文件的大小在5-7bpp時比PNG8小,調色板相同。我能夠使用6bpp實現更好的壓縮,並且使用比最初的PNG8填充最後兩位的模式。我想知道是否有辦法將壓縮器設置爲每x字節量尋找模式?所以對於6bpp,我希望每個3字節的模式。我將嘗試使用LZMA和lc lp p開關。 – 2012-02-28 14:31:52