2012-02-24 22 views
1

私は過去数日間にPNGでちょっとしたことをやっていましたが、私の所見にはうんざりです。結果の大半が圧縮を処理していると私は結論づけています。この週末、私は先進的な圧縮記事に飛び込みます。これまでのところ私の知見を共有したかったのです。誰かが私の目標を達成するためのアドバイスを持っているかどうかを確認し、正しい方向に私を向けるかもしれません。カスタム画像形式:圧縮アルゴリズムをターゲットにする方法

私は現在、15秒未満のウィンドウ内で可能な限り小さなファイルサイズを取得する必要があるプロジェクトに取り組んでいます。

私が扱っている画像の大部分は、全部で256色のパレットを持つPNG-8bppです。これらの画像のほとんどは、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. 

私は私が私に8色の最大パレットを与えること3bppを使用してIDATをエンコードすることを決定した画像を表現するために6色を必要とするので。最初にIDATの圧縮を解除し、新しいファイルサイズは368KBになりました。 3bppをIDATに適用すると、新しい非圧縮ファイルサイズは274KBになります。私は良いスタートだったようだった...私は新しい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の色は32色で5bppで表すことができます。上記と同じテクニックを使用すると、私は圧縮されていないものよりはるかに良い結果を達成することができましたが、再び圧縮して失われました。圧縮された最終サイズ... 84KB。それから、私は6,7bpp ... 8bppと同じ圧縮結果を得ました。

圧縮されていない画像をすべて保存し、いくつかの他の圧縮アルゴリズムを試してみました... LZMA、BZIP2、PAQ8 ...同じ結果圧縮サイズが8bppで5,6、または7bppより小さく、 4bppよりも4bpp。

なぜこのようなことが起こりますか? 5,6、または7bpp形式の八ストップ8bpp圧縮を使用するPNG形式をターゲットにするために圧縮アルゴリズムを調整/修正できますか?それは時間の価値があるのか​​...そして、別の10KBを節約すればそれに値するでしょう。

答えて

2

奇数ピクセルサイズを使用すると、PNG圧縮の仕組みのために効果的な圧縮が減少します。直線的なFLATE/ZIP圧縮を使用するだけではなく、PNG圧縮の利点はフィルタリングです。 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

フィルタリングバイトは、各スキャンラインの前に常にゼロになります。私が読んだことから、フィルタリングは索引付けされたイメージではしばしば有益ではありません。したがって、私はまた、スペースを節約するためにフィルタバイトを取り除いた。私はIDATセクションを圧縮するためにdeflateを使用する必要はありません...私はまだ他の圧縮アルゴリズムの設定をテストしています。 –

+0

フィルタリングは、索引付けされたイメージに有益です。それは画像に依存します。上で述べたように、PNGフィルタリングとFLATE圧縮の両方の利点は、ピクセルではなく、繰り返しのバイトを探していることを傷つけています。連続トーン(写真タイプ)の画像をお持ちの場合、JPEGよりもはるかに優れた圧縮率は得られません。漫画や線画の場合、LZW(GIF)は奇数ピクセルサイズの方が適しています。 – BitBank

+0

テストをしなかったのは、同じ縮小パレットを持つPNG8よりも5-7bppの方がGIFファイルサイズが小さかったことです。私は、6bppを使ってより良い圧縮を達成し、最初のPNG8よりも最後の2ビットをパッディングでパディングすることができました。私は、バイト数ごとにパターンを探すコンプレッサーを設定する方法があるのだろうか?だから6bppのために私はパターンのすべての3バイトをしたいと思います。私はLZMAとlc lp pスイッチで遊んでみるつもりです。 –

0

DEFLATE圧縮は、2つの主要な技術た:バイトシーケンスを繰り返す

  • を見つけ、
  • からピクセル長さを変更することにより

をハフマン符号化を使用してバイトを符号化する後方参照としてそれらをコード8ビットの場合、バイト境界との同期が外れ、DEFLATEは繰返しのピクセルランを繰り返しバイトとしてエンコードすることができません。

ハフマン符号化のおかげで、最も頻繁に出現する値に最も短いものを割り当てる可変幅コードで符号化するため、8ビットピクセルが未使用ビットを持っていても問題ありません。

関連する問題