MAMPでzopfliを使ってpng画像を圧縮してみた。

最近桜も咲き始めて仕事をするのがバカらしい季節が訪れてきましたね。

現在のプロジェクトではpng画像をコネコネしてるんだけどどうしてもファイル容量がでかくなって困ったなぁ、困ったなぁ、どうしようかなぁ、怖いなぁという時に以下のページを見つけてしまいました。

http://inside.pixiv.net/blog/2013/03/25/zopfli-png-recompress/

丁度PHPだし今回の要望にピッタリやないか〜いという訳で早速zopfliを使ってみました。
相変わらずWindowsの人はごめんなさい。

zopfliというのは何かは自分で調べてください。最近Googleが発表した新しいオープンソースの圧縮アルゴリズムだそうです。


まずzopfliを使う前に、今回の開発環境にはMAMPを使っているのでMAMPでzopfliを使えるようにインストールしてみましたよノシ


MAMPで使うには色々と準備が必要なのでその手順を書いていきます。MAMPは2.1.2を使っています。
後、phpMacphpじゃなくてMAMPのphp5.4を使っています。

PATHには

/Applications/MAMP/bin/php/php5.4.10/bin

を先頭に通しています。



まず、http://inside.pixiv.net/blog/2013/03/25/zopfli-png-recompress/にも書いてある通り、

https://github.com/kjdev/php-ext-zopfliからphp-ext-zopfliを落としてきて解凍しておきましょう。

それと肝心なzopfliも落としてきましょう。
これはgitを使って落としてください。
ここGitHub - google/zopfli: Zopfli Compression Algorithm is a compression library programmed in C to perform very good, but slow, deflate or zlib compression.に書いてある通り、

git clone https://code.google.com/p/zopfli/

と入力してzopfliのソースを落としてきましょう。

git cloneで落としてきたら、zopfliディレクトリを丸ごとphp-ext-zopfliディレクトリの中へ移動させましょう。


そこまで出来たら次にモジュールを作成していきます。

ターミナルより

cd php-ext-zopfli

ディレクトリまで移動し、

https://github.com/kjdev/php-ext-zopfli:https://github.com/kjdev/php-ext-zopfli

にも書いてある通りビルド方法は、

phpize
./configure
make
make install

だけですね。

ビルドするにはautoconfも必要なのでautoconfが無ければbrewを使ってインストールしておいて下しあ。

brew install autoconf

ビルドこれだけなら余裕じゃ〜んと思っていたら早速phpizeで躓いてしまいましたorz

phpize
grep: /Applications/MAMP/bin/php/php5.4.10/include/php/main/php.h: No such file or directory
grep: /Applications/MAMP/bin/php/php5.4.10/include/php/Zend/zend_modules.h: No such file or directory
grep: /Applications/MAMP/bin/php/php5.4.10/include/php/Zend/zend_extensions.h: No such file or directory
Configuring for:
PHP Api Version:        
Zend Module Api No:     
Zend Extension Api No:  

おぉもう初っ端からエラーだよ、、、
というわけでphp.hがないですよと怒られていますね。

要は、MAMPにはphp.hが含まれていないんですね。
ちなみにMacにはphp.hがあります。

/usr/include/php/main/php.h

それならMacphp.hを使えば良いじゃんと思うところですが残念ながらMacphp.hは使えませぬ。。。


じゃあどうすれば良いの、、、というわけで無いならphp.hを作ってあげましょう。
php5.4.10のソースコードを公式サイトからダウンロードしてきます。
PHP: Releases

ダウンロードが完了すれば、

cd php-5.4.10
./configure 

checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for a sed that does not truncate output... /usr/bin/sed
checking build system type... i386-apple-darwin12.3.0
checking host system type... i386-apple-darwin12.3.0
・・・・
creating main/internal_functions_cli.c
                                                                                                                                          • +
License:
This software is subject to the PHP License, available in this
distribution in the file LICENSE. By continuing this installation
process, you are bound by the terms of this license agreement.
If you do not agree with the terms of this license, you must abort
the installation process at this point.
                                                                                                                                          • +
Thank you for using PHP. config.status: creating php5.spec config.status: creating main/build-defs.h config.status: creating scripts/phpize config.status: creating scripts/man1/phpize.1 config.status: creating scripts/php-config config.status: creating scripts/man1/php-config.1 config.status: creating sapi/cli/php.1 config.status: creating main/php_config.h config.status: executing default commands

とconfiureだけ行います。
その後、php-5.4.10ディレクトリを丸ごとMAMPディレクトリまで移動させるのですが、
先にincludeディレクトリを以下のように作っておいて下しあ。

cd /Applications/MAMP/bin/php/php5.4.10
mkdir include

ではphp-5.4.10ディレクトリを移動させましょう。

cd ..
mv php-5.4.10 /Applications/MAMP/bin/php/php5.4.10/include/php

これで準備は整いました。再度phpizeを実行してみましょう。

phpize
Configuring for:
PHP Api Version:         20100412
Zend Module Api No:      20100525
Zend Extension Api No:   220100525

無事にphpizeが実行出来ましたね。よかったよかった。
ではビルドの続きをしていきましょう。

./configure
make
make install

以上を実行するとzopfli.soというモジュールが作成されて、
/Applications/MAMP/bin/php/php5.4.10/lib/php/extensions/no-debug-non-zts-20100525/
へインストールされました。


ここまできたら最後はphp.iniの修正です。
MAMPには何故かphp.iniファイルが

/Applications/MAMP/bin/php/php5.4.10/conf/php.ini
/Applications/MAMP/conf/php5.4.10/php.ini

と2種類存在しますが、上の方なのでお間違いないように。
phpinfoを見れば分かりますね。

このファイルにインストールされたzopfli.soを定義してあげましょう。

; Extensions

extension=apc.so

extension=imap.so
extension=yaz.so
extension=mcrypt.so
extension=gettext.so
extension=pgsql.so
extension=pdo_pgsql.so
extension=pdo_mysql.so
extension=zopfli.so  ←追加する


以上で設定は終わりました。
zopfli.soを有効にするにはMAMPを起動していた場合、一旦停止させて起動させましょう。

zopfl.soが有効になっているかはMAMPのスタートページにあるphpinfoで確認しまっす。

これが表示されていれば有効になっています。

以上がzopfliのインストール方法です。
いやぁ長かったですねぇ。。。


ではプログラムで使ってみましょう。
使い方は簡単、圧縮したいpngファイルを以下のように扱えば良いだけです。

$imageFile = file_get_contents('/パス/pngファイル名');
$imageRecompress = zopfli_png_recompress($imageFile);
file_put_contents('/パス/pngファイル名', $imageRecompress);

これだけです。これでpngファイルが圧縮されます。
但し、http://inside.pixiv.net/blog/2013/03/25/zopfli-png-recompress/にも書いてある通り結構時間がかかります。
なので使う方は気をつけましょう。


ちなみにこれを使った結果、55kあったpngファイルのサイズはどうなったかというと、、、、
51kになりました。。。
うーん、まぁ良い方でしょう。
小さくなるには良い事なのでこれから色々と試してみます。

TinyPNG – Compress PNG images while preserving transparencyみたいまで期待していたんですけど、流石に期待し過ぎでしたね。