OptiPNG とは

OptiPNG は、PNG 画像を再圧縮することによって画像ファイルのサイズを減らすための最適化ソフトウェアです。 また、PNG 以外にも BMP、GIF、PNM、TIFF ファイルを最適化し、PNG として出力することも可能です。

上記の公式ページから最新の安定板をダウンロードし、インストールすることも可能ですが、ここでは、yum を使ってインストールし、圧縮効率がどれくらい良いか確認してみます。 (なぜか最近リンクが切れてたので、直接ファイルダウンロード可能な URL をリンクしました)

  • optipng : rpm パッケージインストール
  • png ファイルを圧縮してみる

optipng : rpm パッケージインストール

yum を使うので、インストール自体は非常に簡単です。

optipng インストールRaw Code(S)Raw Code(T)
# yum -y install optipng

# rpm -qa | grep optipng
optipng-0.6.4-1.el6.x86_64

# optipng -v
OptiPNG 0.6.4: Advanced PNG optimizer.
Copyright (C) 2001-2010 Cosmin Truta.

This program is open-source software. See LICENSE for more details.

Portions of this software are based in part on the work of:
  Jean-loup Gailly and Mark Adler (zlib)
  Glenn Randers-Pehrson and the PNG Development Group (libpng)
  Miyasaka Masaru (BMP support)
  David Koblas (GIF support)

Using libpng version 1.2.49 and zlib version 1.2.3

これでインストールは完了したので、どんなオプションが使えるか確認します。

# optipng --help
OptiPNG 0.6.4: Advanced PNG optimizer.
Copyright (C) 2001-2010 Cosmin Truta.

Synopsis:
    optipng [options] files ...
Files:
    Image files of type: PNG, BMP, GIF, PNM or TIFF
Basic options:
    -?, -h, -help       show this help
    -o <level>          optimization level (0-7)                default 2
    -v                  verbose mode / show copyright and version info
General options:
    -fix                enable error recovery
    -force              enforce writing of a new output file
    -keep               keep a backup of the modified files
    -preserve           preserve file attributes if possible
    -quiet              quiet mode
    -simulate           simulation mode
    -snip               cut one image out of multi-image or animation files
    -out <file>         write output file to <file>
    -dir <directory>    write output file(s) to <directory>
    -log <file>         log messages to <file>
    --                  stop option switch parsing
Optimization options:
    -f  <filters>       PNG delta filters (0-5)                 default 0,5
    -i  <type>          PNG interlace type (0-1)                default <input>
    -zc <levels>        zlib compression levels (1-9)           default 9
    -zm <levels>        zlib memory levels (1-9)                default 8
    -zs <strategies>    zlib compression strategies (0-3)       default 0-3
    -zw <window size>   zlib window size (32k,16k,8k,4k,2k,1k,512,256)
    -full               produce a full report on IDAT (might reduce speed)
    -nb                 no bit depth reduction
    -nc                 no color type reduction
    -np                 no palette reduction
    -nx                 no reductions
    -nz                 no IDAT recoding
Optimization details:
    The optimization level presets
        -o0  <=>  -o1 -nx -nz
        -o1  <=>  [use the libpng heuristics]   (1 trial)
        -o2  <=>  -zc9 -zm8 -zs0-3 -f0,5        (8 trials)
        -o3  <=>  -zc9 -zm8-9 -zs0-3 -f0,5      (16 trials)
        -o4  <=>  -zc9 -zm8 -zs0-3 -f0-5        (24 trials)
        -o5  <=>  -zc9 -zm8-9 -zs0-3 -f0-5      (48 trials)
        -o6  <=>  -zc1-9 -zm8 -zs0-3 -f0-5      (120 trials)
        -o7  <=>  -zc1-9 -zm8-9 -zs0-3 -f0-5    (240 trials)
    The libpng heuristics
        -o1  <=>  -zc9 -zm8 -zs0 -f0            (if PLTE is present)
        -o1  <=>  -zc9 -zm8 -zs1 -f5            (if PLTE is not present)
    The most exhaustive search (not generally recommended)
      [no preset] -zc1-9 -zm1-9 -zs0-3 -f0-5    (1080 trials)
Examples:
    optipng file.png                            (default speed)
    optipng -o5 file.png                        (moderately slow)
    optipng -o7 file.png                        (very slow)
    optipng -i1 -o7 -v -full -sim experiment.png

圧縮レベル指定、シミュレーションモード、元のファイルをバックアップするなど、いろいろ出来そうですね。

png ファイルを圧縮してみる

テスト画像として MAC の壁紙画像の一部をキャプチャした 250x250px、103KB のファイルを使い、最適化を実施してみます。

以下の例では、最適化レベルは、0 ~ 7 まで指定できるので、一番高い 7 を指定し、元のファイルは、バックアップするようにします。

png 圧縮テストRaw Code(S)Raw Code(T)
# ls -lh
合計 104K
-rw-r--r-- 1 root root 103K  5月 23 16:07 2015 test.png

# optipng -o7 -keep test.png
OptiPNG 0.6.4: Advanced PNG optimizer.
Copyright (C) 2001-2010 Cosmin Truta.

** Processing: test.png
250x250 pixels, 3x8 bits/pixel, RGB
Input IDAT size = 98507 bytes
Input file size = 105298 bytes

Trying:
  zc = 9  zm = 9  zs = 0  f = 1         IDAT size = 94698
  zc = 8  zm = 9  zs = 0  f = 1         IDAT size = 94698
  zc = 9  zm = 9  zs = 1  f = 1         IDAT size = 91325
  zc = 9  zm = 8  zs = 1  f = 1         IDAT size = 91170
  zc = 9  zm = 9  zs = 1  f = 3         IDAT size = 89427
  zc = 9  zm = 8  zs = 1  f = 3         IDAT size = 89278
  zc = 9  zm = 9  zs = 1  f = 5         IDAT size = 86703
  zc = 9  zm = 8  zs = 1  f = 5         IDAT size = 86612

Selecting parameters:
  zc = 9  zm = 8  zs = 1  f = 5         IDAT size = 86612

Output IDAT size = 86612 bytes (11895 bytes decrease)
Output file size = 93331 bytes (11967 bytes = 11.36% decrease)

# ls -lh
合計 196K
-rw-r--r-- 1 root root  92K  5月 23 16:16 2015 test.png
-rw-r--r-- 1 root root 103K  5月 23 16:07 2015 test.png.bak

終わりに

以下は、圧縮前・後の png 画像です。

普通に見てると違いが分かりません。

optipng before after

圧縮率は、11.36% で、103KB から 92KB にあまり減りませんでした。 (OptiPNG は画像が劣化しないため、圧縮率は期待しないほうが良いです)

もっと圧縮率がほしいなら OptiPNG 以外に、もっと効率の良いオプティマイザを検討したほうが良いかもしれません。

OptiPNG の代わりに、TinyPNG の内部エンジンとして使われている pngquant の導入を検討してみてはいかがでしょうか。

以上、OptiPNG を使って PNG 画像を最適化する でした。