php-epegで高速サムネイル生成Tweet以前にブログで表示する大きな画像を縮小してサムネイル表示する事を検討した。従来使用していたGDによるキャッシュ作成方法を改め、epegを利用した動的生成を試みた。(この記事は2007年10月頃に書いたものです。)(当時はBlogn+を使っていて画像ファイルの管理が面倒だった)従来もブログ用画像のサムネイル化は行っていた。動的な縮小処理ではなく、最初の一回目のアクセス時のみ縮小処理を行いファイルにキャッシュし、2回目以降のアクセスではそのキャッシュファイルを読み込ますというPHPスクリプトを用いていた。従来はGDを用いたサムネイル生成をしていたが、結構処理が重くて遅い。その為キャッシュを作っていた訳だがファイルが増えてかさばり容量も増え、管理が面倒になる。そこでこの度仕組みを一新し、動的なサムネイル生成を試みた。手頃な物としてサムネイル生成ライブラリのEpegを使ってみることにした。これはJPEG専用ではあるが、高速かつメモリ消費も少ないと優れた性能を持つ。PHPでは使えないのでrsk氏の作成したphp-epegというモジュールを導入してみる。当方の環境(VineLinux4.1)にはEpegに必要なlibjpegはすでに導入されている。Epegだけを取ってきてmakeする。installconfigureしてmakeするだけ。php-epegの導入コンパイルにはphpizeを導入しておく必要がある。testしてみるとほとんど失敗するけど良いんでしょか?次はphpにモジュール登録エディタでphpのextentionディレクト下にphp-epeg.iniを作成する。[ini]php-epeg.so[/ini]そんでもってapache再起動して完了。テスト付属のサンプルを参考にテストコードを組んでみた。240);exit;[/php]epeg_thumbnail_create()に引数をもうひとつ追加することで画質の調整(0~100)もできる。85以上にすると出力データの前半部分が消えてしまう。正確な処理時間や消費メモリ量は計測していないが、瞬間表示できるほど高速で巨大なJPEGファイルもphpのメモリ制限を小さくしても問題ない(関係なかったりする?)ので両者共にGDと比べると大幅に削減出来たと思われる。以下はおなじみWindowsXPに付属のサンプルの800x600pixelのJPEG画像をそれぞれGDとphp-epegで生成したサムネイル画像。どちらも品質は75である。GDではimagecopyresampled()によるリサンプリングを行っている為、ジャギーがあまり目立たず高画質だが実行完了までに2,3秒かかった。それに対して、php-epegでは画質こそ劣っているものの、表示速度は瞬間的で、何枚処理に掛けてもほとんど処理時間を感じさせない。(右)php-epegによる縮小画像サムネイル画像なので画質にあまりこだわる必要もなく、この程度で十分と思う。ブラウザ上でのサイズ変更よりも綺麗に出来てる気もするので本件は一件落着とした。画像処理SNSでもご購読できます。TwitterでフォローするFeedlyでフォローするたかおファン(surface0)1983年生まれ。趣味はエレキギターなど。最近やってるゲームはWoWs、プリコネ、デレステ。