ImageMagick で WebP
WebP の仕様自体は何年も前からあって今更感ありますが、Facebook での導入のゴタゴタで世の中への認知が拡がる感があり、便乗して ImageMagick で WebP を扱う件のメモです。
はじめにまとめ
- ImageMagick v6.6.8 (2011年3月)から WebP に対応
- ImageMagick の build 時に libwebp 組み込みが必要 (これしないと convert でエラー出さずに元ファイルの形式のまま .webp に格納する)
- オプションで lossless=true を指定しないと png からでも不可逆圧縮で変換する。
- lossless webp は img src だとインライン表示出来るが、URL を直接開くとダウンロード扱い。
仕様が出てから結構たつのに Chrome でしか画像を表示できない状況が心配でなりません。
(2015/08/28 追記) 参考の事 => How We Gain "Mobile First" Using WebP with ImageMagick - Speaker Deck
(2016/06/09 追記)
ImageMagick バージョン
6.6.8 から対応してます。(coders/webp.c が追加されてます)
yoya@sakura:~$ ~/ImageMagick/6.6.8-10/bin/convert madoka.jpg madoka.webp
参考までに 6.6.7 のエラーメッセージ
yoya@sakura:~$ ~/ImageMagick/6.6.7-10/bin/convert madoka.jpg madoka.webp sh: webpconv: not found mv: `/tmp/magick-Dvpen1Xs.webp' を stat できません: そのようなファイルやディレクトリはありません convert: delegate failed `cp "%i" "%i.png"; "webpconv" "%i.png"; rm "%i.png"; mv "%i.webp" "%o"' @ error/delegate.c/InvokeDelegate/1061.
ちょっとした罠
convert で jpeg => webp 変換した madoka.webp の先頭バイナリを見ると、こんな場合があります。
yoya@sakura:~$ hexdump -C madoka.webp | head -1 00000000 ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 48 |......JFIF.....H|
webp 無効で build した ImageMagick だと、しれっと無言でフォーマット変換を無視します。
同様に PNG に対して、
convert madoka.png madoka.webp
とすると、PNG 形式のファイルが .webp に入ります。
ひどいw
libwebp の導入
いまいまの最新は v0.3.0 です。
wget http://webp.googlecode.com/files/libwebp-0.3.0.tar.gz cd libwebp-0.3.0 ./configure make sudo make install
これで /usr/local 以下に libwebp がインストールされます。
ImageMagick の build
libwebp が /usr/local なので LD_LIBRARY_PATH を使う方法が世の中でよく見られますが、それだと実行時に毎回 LD_LIBRARY_PATH を指定する手間が面倒になるので、今回は実行ファイルの rpath に埋め込む方式で。
yoya@sakura:~/imagemagick/src/ImageMagick-6.8.4-10$ LDFLAGS="-Wl,-rpath=/usr/local/lib" ./configure --without-perl --without-magick-plus-plus --prefix=$HOME/ImageMagick/6.8.4-10 --with-webp=yes <略> WEBP --with-webp=yes yes <略> yoya@sakura:~/imagemagick/src/ImageMagick-6.8.4-10$ make install
おまけ実験 (蛇足)
お約束だけど。rpath を埋め込まなかった場合のエラー。
yoya@sakura:~/magica$ ~/ImageMagick/6.8.4-10/bin/convert madoka.png madoka.webp /home/yoya/ImageMagick/6.8.4-10/bin/convert: error while loading shared libraries: libwebp.so.4: cannot open shared object file: No such file or directory
LD_LIBRARY_PATH を指定すれば大丈夫。
yoya@sakura:~/magica$ LD_LIBRARY_PATH=/usr/local/lib ~/ImageMagick/6.8.4-10/bin/convert madoka.png madoka.webp
本実験
build 時に rpath 指定していれば LD_LIBRARY_PATH 無しでも大丈夫。
yoya@sakura:~/magica$ ~/ImageMagick/6.8.4-10/bin/convert madoka.png madoka.webp yoya@sakura:~/magica$ ~/ImageMagick/6.8.4-10/bin/convert madoka.png -define webp:lossless=true madoka-lossless.webp
今度は大丈夫。先頭見ても WebP っぽい。(RIFF コンテナなんですね)
yoya@sakura:~/magica$ hexdump -C madoka.webp | head -1 00000000 52 49 46 46 02 7d 02 00 57 45 42 50 56 50 38 20 |RIFF.}..WEBPVP8 | yoya@sakura:~/magica$ hexdump -C madoka-lossless.webp | head -1 00000000 52 49 46 46 12 84 10 00 57 45 42 50 56 50 38 4c |RIFF....WEBPVP8L|
- http://diary.awm.jp/~yoya/data/2013/04/24/madoka.png
- http://diary.awm.jp/~yoya/data/2013/04/24/madoka.webp
- http://diary.awm.jp/~yoya/data/2013/04/24/madoka-lossless.webp
- 直リンクだと表示せずにダウンロード扱いになるので。↓こっちで。
さて、ファイルサイズは。
yoya@sakura:~/magica$ ls -l -rw-r--r-- 1 yoya develop 1082394 2013-04-23 21:17 madoka-lossless.webp -rwxr--r-- 1 yoya develop 1604614 2012-10-30 00:47 madoka.png -rw-r--r-- 1 yoya develop 163082 2013-04-23 21:15 madoka.webp
元々の PNG が最適化されてない事もありますが、結構サイズ減ります。
madoka.webp は不可逆圧縮なので jpeg と比べないとアンフェアです。以下のは convert で変換した jpeg のサイズです。
yoya@sakura:~/magica$ ls -l madoka.jpg -rw-r--r-- 1 yoya yama 538881 2013-04-24 04:23 madoka.jpg