過去数日間、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を節約することはそれだけの価値があります。