はじめに
Google から Deflate 互換の圧縮アルゴリズム実装 Zopfli が公開されました。
「Deflate 互換ってどういうこと?」って方もいると思いますので簡単に説明します。
- 符号アルゴリズムは同じ(LZSS + Huffman符号)
- RFC では、 LZSS はこんな感じで Huffman 符号はこんな感じと大体のやり方が書かれている
- RFC に書かれている方法とは異なる手法でより最適な LZSS + ハフマン符号化を行うのが今回の Zopfli
Kflate との比較
PNG の圧縮界隈では、一部で Kflate と呼ばれる Deflate 互換実装が圧縮効率の良いものが知られています。
(この実装は PNGOUT として PNGGauntlet や ImageOptim で使用されている)
今回は ImageOptim と比較することで Zopfli と Kflate の圧縮性能の比較を行いたいと思います。
比較方法
- ImageOptim で圧縮最適化を行う
- 最適化を行った PNG ファイルの IDAT チャンクを展開し、Zopfli で圧縮しなおした IDAT チャンクに置き換える
- ファイルサイズの比較を行う
また、Zopfli ではパラメータで最適化を調整できるのだが、今回の検証ではすべて 15(デフォルト値) と 1000 で行います。
コマンドラインオプションの説明ではこの数値が高い方が圧縮率が高いとされています。
結果
画像 | ImageOptim | Zopfli (i=15) | Zopfli (i=1000) |
---|---|---|---|
617 | 618 | 618 | |
953 | 956 | 957 | |
1,410 | 1,412 | 1,412 | |
2,263 | 2,239 | 2,247 | |
4,314 | 4,102 | 4,103 | |
1,631,506 | 1,630,475 | 1,630,471 |
- イラスト画像: 架空線 – AERIAL LINE - : 第1話 「うぶんちゅがやって来た!」:
http://www.aerialline.com/comics/ubunchu/episode01 - © 瀬尾浩史
ほとんど Zopfli (i=15) が最小になっています。
iterations が大きいほど圧縮率が高くなるはずですが、あまり変わらないようです。
実装
今回の検証では以下のコードを書いて使いました。
C言語で仕事してたこともあるのに全然書けなくなってて死にたくなりました。
結構適当なのでそのまま使うのは自己責任でどうぞ。
https://gist.github.com/imaya/5064438
おわりに
というわけで、簡単にですが Zopfli を使った PNG の再圧縮を検証してみました。
Kflate が優秀なため正直あまり期待していなかったのですが、互角の性能だと言えると思います。
今後はこの実装を活用したツールも出てくるのではないでしょうか。