私は過去数日間に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を節約すればそれに値するでしょう。
フィルタリングバイトは、各スキャンラインの前に常にゼロになります。私が読んだことから、フィルタリングは索引付けされたイメージではしばしば有益ではありません。したがって、私はまた、スペースを節約するためにフィルタバイトを取り除いた。私はIDATセクションを圧縮するためにdeflateを使用する必要はありません...私はまだ他の圧縮アルゴリズムの設定をテストしています。 –
フィルタリングは、索引付けされたイメージに有益です。それは画像に依存します。上で述べたように、PNGフィルタリングとFLATE圧縮の両方の利点は、ピクセルではなく、繰り返しのバイトを探していることを傷つけています。連続トーン(写真タイプ)の画像をお持ちの場合、JPEGよりもはるかに優れた圧縮率は得られません。漫画や線画の場合、LZW(GIF)は奇数ピクセルサイズの方が適しています。 – BitBank
テストをしなかったのは、同じ縮小パレットを持つPNG8よりも5-7bppの方がGIFファイルサイズが小さかったことです。私は、6bppを使ってより良い圧縮を達成し、最初のPNG8よりも最後の2ビットをパッディングでパディングすることができました。私は、バイト数ごとにパターンを探すコンプレッサーを設定する方法があるのだろうか?だから6bppのために私はパターンのすべての3バイトをしたいと思います。私はLZMAとlc lp pスイッチで遊んでみるつもりです。 –