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.

画像を表すのに6色しか必要ないので、3bppを使用してIDATをエンコードし、最大8色のパレットを作成することにしました。まず、IDATを解凍しました。これにより、新しいファイルサイズは368KBになります。IDATに3bppを適用した後、新しい非圧縮ファイルサイズは274KBです。良いスタートを切ったようです...次に、新しいIDATセクションにdeflateを適用しました。結果...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のサイズは3bppよりも小さくなっています。

なぜこれが起こっているのですか?圧縮アルゴリズムを微調整/変更して、8bpp圧縮を行う5、6、または7bpp形式を使用するPNGのような形式をターゲットにすることはできますか?それは時間の価値がありますか...そしてはい、さらに10KBを節約することはそれだけの価値があります。

4

2 に答える 2

2

あなたが見ているのは、奇数のピクセルサイズを使用すると、PNG 圧縮の仕組みが原因で効果的な圧縮が低下することです。単純な FLATE/ZIP 圧縮を使用する場合よりも PNG 圧縮の利点は、フィルタリングです。PNG 圧縮は、前処理フィルターの小さな品揃えを使用して、水平方向と垂直方向の対称性を利用しようとします。これらのフィルターはバイト境界で機能し、4/8/16/24/32/48/64 ビットのピクセル サイズで有効です。奇数サイズのピクセル (3/5/6/7 ビット) に移動すると、フィルタリングが無効になります。これは、8 ビット境界でフィルタリングした場合、同じ色のピクセルが水平方向に「互いに打ち消し合う」ことがないためです。

フィルタリングが問題にならなかったとしても、8 ビットのシンボル サイズも想定しているため、ピクセル サイズを 8 ビットから 7 ビットまたは 6 ビットに縮小する FLATE 圧縮の動作方法はあまり効果がありません。

結論として...奇数サイズのピクセルを使用することで得られる唯一の利点は、圧縮されていないデータが小さくなることです。ピクセルのバイト境界の対称性を破ると、PNG 圧縮の利点の多くが失われます。

GIF 圧縮は、1 ~ 8 ビットのすべてのピクセル サイズをサポートします。シンボル サイズをピクセル サイズとして定義し、事前フィルタリングを使用しません。8 ビット GIF 画像は、7 ビット ピクセルとして圧縮された場合、圧縮率が低下することはありませんが、圧縮はシンボル サイズよりもピクセルの繰り返しに大きく依存するため、メリットもありません。

于 2012-02-26T04:17:28.970 に答える
0

PNGで使用されるDEFLATE圧縮には、主に2つの手法があります。

  • 繰り返されるバイトシーケンスを検索し、それらを後方参照としてエンコードします
  • ハフマン符号化を使用してバイトをエンコードします

ピクセル長を8ビットから変更すると、バイト境界と同期しなくなり、DEFLATEは繰り返しピクセルランを繰り返しバイトとしてエンコードできなくなります。

また、ハフマンコーディングのおかげで、8ビットピクセルに未使用のビットが含まれていても問題ありません。コーディングでは、最も頻繁に発生する値に最短のコードを割り当てる可変幅コードでバイトがエンコードされるためです。

于 2013-03-07T14:36:45.003 に答える