以前にブログで表示する大きな画像を縮小してサムネイル表示する事を検討した。
従来使用していたGDによるキャッシュ作成方法を改め、epegを利用した動的生成を試みた。
従来もブログ用画像のサムネイル化は行っていた。しかし動的な縮小処理ではなく、最初の一回目のアクセス時のみ縮小処理を行いファイルにキャッシュし、2回目以降のアクセスではそのキャッシュファイルを読み込ますというPHPスクリプトを用いていた。
従来はGDを用いたサムネイル生成をしていたが、結構処理が重くて遅い。その為キャッシュを作っていた訳だがファイルが増えてかさばり容量も増え、管理が面倒になる。そこでこの度仕組みを一新し、動的なサムネイル生成を試みた。
手頃な物としてサムネイル生成ライブラリのEpegを使ってみることにした。これはJPEG専用ではあるが、高速かつメモリ消費も少ないと優れた性能を持つ。そのままではPHPでは使えないのでrsk氏の作成したphp-epegというモジュールを導入してみる。
php-epeg導入手順
Epegの導入
当方の環境(VineLinux4.1)にはEpegに必要なlibjpegはすでに導入されている。なのでEpegだけを取ってきてmakeする。
wget http://download.enlightenment.org/snapshots/LATEST/epeg-0.9.0.011.tar.gz
tar zxvf epeg-0.9.0.011.tar.gz
cd epeg-0.9.0.011
./configure
make
make install
configureしてmakeするだけ。特別な手続きは無い。
php-epegの導入
コンパイルにはphpizeを導入しておく必要がある。
wget http://page2.xrea.jp/pub/php_epeg-0.1.1.tgz
tar zxvf php_epeg-0.1.1.tgz
cd php_epeg-0.1.1
phpize
./configure --with-php-config=/path/to/php-config --with-epeg=/path/to/epeg-config
make
make install
なんかmakeの後にmake testしてみるとほとんど失敗するけど良いんでしょか?
次はphpにモジュール登録。
エディタでphpのextentionディレクトリ下にphp-epeg.iniを作成する。内容は以下だけ。
php-epeg.so
その後、Apacheを再起動して完了。
テスト
付属のサンプルを参考にテストコードを組んでみた。
$infile = 'sample.jpg';
echo epeg_thumbnail_create($infile, '', 240, 240);
exit;
epeg_thumbnail_create()に引数をもうひとつ追加することで画質の調整(0~100)もできる。
だがなぜか85以上にすると出力データの前半部分が消えてしまう。なぜだろう?
動作検証
正確な処理時間や消費メモリ量は計測していないが、瞬間表示できるほど高速で巨大なJPEGファイルもphpのメモリ制限を小さくしても問題ない(関係なかったりする?)ので両者共にGDと比べると大幅に削減出来たと思われる。
以下はおなじみWindowsXPに付属のサンプルの800x600pixelのJPEG画像をそれぞれGDとphp-epegで生成したサムネイル画像。どちらも品質は75である。
GDではimagecopyresampled()によるリサンプリングを行っている為、ジャギーがあまり目立たず高画質だが実行完了までに2,3秒かかった。
それに対して、php-epegでは画質こそ劣っているものの、表示速度は瞬間的で、何枚処理に掛けてもほとんど処理時間を感じさせない。

(左)GDによる縮小画像 (右)php-epegによる縮小画像
サムネイル画像なので画質にあまりこだわる必要もなく、この程度で十分と思う。ブラウザ上でのサイズ変更よりも綺麗に出来てる気もするので本件は一件落着とした。



コメント