PNGは、Filters + LZ77 + Huffmanの組み合わせです(LZ77 + Huffmanの組み合わせはDeflateと呼ばれます):
ステップ1)フィルターがNoneと異なる場合、ピクセルの値は隣接するピクセルとの差に置き換えられます(詳細については、http://www.libpng.org/pub/png/book/chapter09.htmlを参照してください) 。これにより、グラデーションを使用した画像の圧縮が増加し(... 4 5 6 7が... 1 1 1 1 1になります)、同じ色の領域で役立ちます(... 3 3 3 5 5 5 5 5が0になります) 0 0 2 0 0 0 0 0)。デフォルトでは、フィルターは24ビット画像で有効になり、パレット付きの8ビット画像で無効になります。
ステップ2)データはLZ77で圧縮され、繰り返される(一致する)バイト文字列を、一致までの距離と一致の長さを含むタプルに置き換えます。
ステップ3)ステップ2の結果は、固定長シンボルを可変長コードに置き換えるハフマンコードでエンコードされます。シンボルが頻繁になるほど、コードは短くなります。
複数の問題があります:
わずかなピクセルに影響する小さな変更により、PNG圧縮の3つのステップの結果が変更されます。
1)使用されるフィルターに応じて、隣接するピクセルのフィルター処理された値が変わります。それは小さな変化の影響を増幅します。
2)変更は、そのエリアへの一致が異なることを意味します。たとえば、333333を333533に変更すると、333333の別のオカレンスが一致しなくなるため、異なる距離で333333に別の一致が選択されるか、同じ一致を選択しますが、長さが短く、最後の3バイトに別の一致が選択されます。それだけで結果が大きく変わります。
3)最大の問題はステップ3にあります。ハフマンコードは可変ビット数を使用するため、小さな変更でも後続のすべてが整列しなくなります。知っている限り、ほとんどの圧縮アルゴリズムは、バイトアラインされていない一致を検出できないため、コンプレッサーがバイトアラインされていない一致を検出できない限り、変更後に既に圧縮されているデータの圧縮を防止します(または少なくとも大幅に削減します)。
その他の問題は、すでに他の返信でカバーされています。
4)Gzipは同じDeflateアルゴリズムと32KBディクショナリを使用するため、PNGファイルが32KBより大きい場合、同一であっても一致は検出されません。Bzip2は900 KBブロックを使用するため、この点で優れています。XZはLZMAを使用します。IIZには、デフォルトの圧縮レベルで4 MBの辞書があります。5)Zip形式は固体圧縮を使用しないため、類似または同一のファイルを圧縮することはできません。
おそらく、PAQまたはPPMDファミリーのコンプレッサーの方が圧縮率は高くなりますが、同様の画像ファイルを大量に圧縮する必要がある場合は、次の3つのアプローチを検討できます。
1)圧縮されていない画像を保存し(PNG -0または圧縮なしの形式で)、大きな辞書またはブロックサイズのコンプレッサーで圧縮します。(LZMAはうまく機能します)
2)別のオプションは、フィルターを保持するが、PNGからDeflate圧縮を削除することです。これは、たとえば(AdvDef)ユーティリティを使用して実行できます。次に、結果の非圧縮PNGを圧縮します。解凍後、非圧縮PNGを保持するか、AdvDefで再度圧縮できます(ただし、時間がかかります)。
どちらが最も圧縮されるかを確認するには、両方のアプローチをテストする必要があります。
3)最後のオプションは、ビデオのPNG画像を変換し、x264ロスレスのようなロスレスビデオコンプレッサーで圧縮し(適切なカラーフォーマットを使用するように特別に注意して)、抽出時にフレームを個々のPNG画像に抽出します。それはffmpegでできます。また、フレーム番号と元の名前の間のマッピングを保持する必要があります。
これは最も複雑なアプローチですが、PNGがすべてアニメーションの一部である場合、最も効果的です。ただし、必要に応じて透明度をサポートするビデオ形式が必要になります。
編集:MNG形式もあり、あまり使用されません。