PHPプログラミング

php-epegで高速サムネイル生成

以前にブログで表示する大きな画像を縮小してサムネイル表示する事を検討した。
従来使用していたGDによるキャッシュ作成方法を改め、epegを利用した動的生成を試みた。

この記事は2007年10月頃に書いたものです。

当時はBlogn+を使っていて画像ファイルの管理が面倒だった

従来もブログ用画像のサムネイル化は行っていた。しかし動的な縮小処理ではなく、最初の一回目のアクセス時のみ縮小処理を行いファイルにキャッシュし、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によるリサイズ画像 epegによるリサイズ画像

(左)GDによる縮小画像 (右)php-epegによる縮小画像

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


rsk氏のサイト

記事を書いた人

システムえんじにゃー🐈
趣味はエレキギター、自転車など。作曲したい。
World of Warshipsやってます。
記事に関する質問はお気軽にどうぞ。

surface0 (さーふぇす)をフォローする
シェアする
スポンサーリンク

コメント

タイトルとURLをコピーしました