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を使っています。
後、phpはMacのphpじゃなくて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
それならMacのphp.hを使えば良いじゃんと思うところですが残念ながらMacのphp.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. |
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- +
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
とconfiureだけ行います。
その後、php-5.4.10ディレクトリを丸ごとMAMPのディレクトリまで移動させるのですが、
先にincludeディレクトリを以下のように作っておいて下しあ。
cd /Applications/MAMP/bin/php/php5.4.10 mkdir include
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みたいまで期待していたんですけど、流石に期待し過ぎでしたね。