PNGのファイルサイズの最適化について。オープンソースとWindowsバイナリ。
可逆圧縮画像フォーマットPNGでは、 アルゴリズムが固定されているGIFとは異なり、 内部的に、圧縮率に影響する多くのオプションを使える(例えば下記OptiPNGは自動で最大228パターン、手動では1000以上のオプション組み合わせを試せる)。 256色しか使えないGIFより優秀で、 256色以下でも通常GIFより5〜25%コンパクトなPNGだが、 内部のオプションを最適化することで、さらに最大20%以上、サイズが縮む。
画像処理ソフトが作成したPNGを入力し、 最適化したPNGを出力するPNG→PNG再圧縮系フリーウェアを2点、ご紹介しよう。 PNGそれ自体は可逆(ロスレス)圧縮なので、再圧縮したからといって画質は完全にもとのままだ。
手元の検証では、Padieで減色した16色PNGに特に有効で、 例えば40KBだったものが30KBになったりする。平均20〜30%縮む。 Padieが「美しい減色」に特化したソフトで、減色結果を保存する部分は標準的な(特に圧縮率を優先しない)設定になっているためと思われる(16色に減色だけして、書き出しはパレット方式でないのかも?)。 IrfanViewやBTJ32から圧縮率最高/フィルタ最適で出力したフルカラーPNGでも、さらに数パーセント、 サイズを節約できた。極端な例では、50%程度、サイズが減少するものもあった。
PNGを作る最初のソフトがすでに高度の最適化を行っている場合には効果がほとんどないが、 そうでないケースが大半なので、 一度PNG→PNG最適化をお試しあれ。 特にウェブ用の画像では、ウェブスペースの点でも、転送量の点でも、サイズが小さいに越したことはない。
PNGGauntletは、たまにエラーが出ることがあります。 大切な画像ファイルが破損しないよう、 処理前には、万一に備えてバックアップをとってください。 コマンドラインに抵抗がなければ、後述のようなバッチファイルまたはOptiPNGを使うのが無難。
PNGGauntletは、2つのコマンドラインツールPNGOutとPNGRewriteを使うGUIフロントエンドだ(ゴントレットは「両面からの攻撃」という程の意味)。使い方は簡単。
これで指定したPNGファイルは、すべてサイズが減ったPNGで上書きされる。 なお、[Overwrite Original Files] にチェックを入れず、Output Directoryで出力先を指定しても良いが、 その場合、変換元のファイルそれ自体は変化しないので、リストには変換後のサイズが100%と表示される。 これは変だが、現時点ではそういう仕様。出力先を上書き以外にしても、ちゃんとサイズは減少する。 たまに発生する処理エラーで画像ファイルが破損しないように、上書きはしないやり方のほうが無難かもしれない。
PngoutとPngrewriteの両方にチェックが入っている状態(デフォルト)では、まれにエラーが発生するという報告がある。もしエラーが出たら、その画像に対しては片方(Pngrewrite)のチェックを外して、二重使用をやめてみる。
Number A Productions : Softwareで、 Download PNGGauntletをクリックして、PngGauntlet.***.zipをダウンロード、 解凍して出てくるPngGauntletSetup.msiをクリックしてインストール開始。
[Next]を数回クリックして、 終わったら[Close]で閉じるだけなので、少しも難しくない。 「スタート」ボタン→「プログラム」に追加される。
.NET Framework上で動作するソフトなので、 もし.NET Frameworkが未導入なら、先に.NET Frameworkをインストールする必要がある。 Windows Updateまたは Microsoft .NET Framework Version 1.1 再頒布可能パッケージから入手できる。
これはGUIフロントエンドのないコマンドラインツールだが、内容は基本的にほぼ同じだ。 OptiPNG Home PageでソースやWindows版バイナリをダウンロードできる。 ダウンロードしてPATHの通ったところに入れたらすぐ使える軽快さがいい。 「このオプションで圧縮すると結果はどうなるか」をメモリ上で総当たり的にシミュレートして、 これが一番縮む、というパターンを見つけてそれを使ってファイルを保存するのだが、その試行錯誤プロセスがDOS窓上に流れるのが、いい感じ。動作は同種のpngcrushより高速であり、オプションも柔軟だ。
使い方の基本は
optipng input.png
であり、圧縮率を最高にしたい場合(時間をかけてもオプションを試す検索範囲を広げたい場合)には、
optipng -o7 input.png
などとする(7は最大範囲の捜索だが、ほとんどの場合、そこまでやる必要ない)。詳しくはヘルプかドキュメントを参照。ワイルドカードも使える。
これらのソフトは既に広く使われて安定性が確認されているものではなく、 日本語環境では使用実績がまだほとんどない(日本語のパス名、ファイル名など)。 上書き中にエラーやフリーズなどが発生するとファイルが壊れてしまう可能性もあるから、 取り返しのつかない貴重な画像を処理する前には、 必ずバックアップを取っておこう(別にこの処理に関係なく貴重な画像はバックアップするべきだが)。 手間が増えるが、上書きをしないようにするのも良いかもしれない。 OptiPNG では必要に応じて -kスイッチを活用してほしい。
ところで、PNGの圧縮率を高くすれば=ファイルサイズを小さくすれば常に良いのか。
RARなどと同じで、高圧縮にすれば展開も少し遅くなる。 ゴミヘッダを除去してJPEGを小さくするのとは、少しおもむきが違う。 しかし、現代のCPUなら――よほど巨大な画像か、よほどタイムクリティカルな用途でない限り――PNGの展開速度は気にならないだろう。実際、この記事中の4枚の画像は高圧縮の最適化をしたPNGだが、 特に問題ないと思われる。 ただし、圧縮率を高くするには圧縮にも時間がかかる。 これは本質的に、ファイルサイズという空間リソースを、圧縮時間という時間コストと取引する話だ。 バッチ処理できるので、CPUがアイドルのとき(ユーザが休憩中とか)に、まとめてやってしまえばいいだろう。
この記事に含まれる4枚の画像の合計サイズ。
変換前(キャプチャーしたBMPをPadieで16色に減色)=41.6KB
PNGGauntletで最適化すると=29.4KB
OptiPNGで最適化すると=34.6KB
トータルではPNGGauntletの方が良いが、
4枚中1枚はOptiPNGの方が高い再圧縮率を出しているので、あなどれない。
PNGGauntletがバージョンアップ、 不具合が修正され、安定性も向上したようです。
ところで、このサイト(妖精現実)のPNG画像は、じつはPNGGauntletで最適化しているのではありません。 optipng でもないです。 OPTPiX iMageStudio でもないです。
こんな png.bat をPATHの通ったところに置いて、
png in.png
とやってます。
減色するときは padie (padie でエラーになるときは xpadie)で減色してから。
del tmp.png copy /y %1 %1.bak pngrewrite %1 tmp.png del %1 pngout tmp.png %1 del tmp.png
たいていの場合、これで Optipng より縮むかと。 このバッチですが、考えてみると、 入力が gif のときはさらに自動で gif2png を通すようにするとより良いですね〜
というわけで、マウスまで手を伸ばすのが面倒というものぐさ派は参考にでもしてください。 ただ、手元のはどれかのバージョンが古いのか2色の透過PNGで透過色が失われる不具合あり。 透過にしたいとき、2色のときは色数を水増ししてます。