[PEAR]Benchmarkの使い方Tips MacのSipsをPHPから呼び出し利用する際の注意点
4月 16

phpで画像処理する定番といえば、組み込みのGD(PHP: GD – Manual)が定番なのだけれど、どうも処理元の画像が大きいと、非常に処理が重たい気がする。

とある画像データベースサイトでは、デジカメで撮影した画像を大量にアップロード・リサイズする必要があり、GDで処理していたのだが、最近のデジカメは1ファイルが12~15Mバイトもめずらしくなく、コレを何十枚と処理していくと、結局、apacheさんの負荷およびCPUの負荷がハンパなく、すぐにLoad avgが急上昇してしまう。

なんとか改善できないかと考えて、サーバがMac(OS X)だから、sipsコマンド【Scriptable Image Processing System(スクリプト可能イメージ処理システム)】が使えないかと考えた。変換処理をコマンドに任せることでapache(httpd)の負荷も減らせるかもしれないし。

- sips 公式テクニカルノート Technical Note TN2035: ColorSync on Mac OS X
- SIPS コマンド – 画像をコマンドラインで – その1 (リサイズ / 回転 / 反転 など) — — 脳みその中身-

試しにいくつかリサイズしてみたところ、体感的にはPHP/GDのリサイズより早い気がした。

気がしただけでは面白くないので、実際に簡単なサンプルを作ってベンチマークをとってみた。
つまり、SIPS vs GDである。

実験環境

  • Mac OS 10.4.11(1.5H Core Solo)
  • php 4.4.7
  • 4272× 2843pxの画像を、高さ100pxにリサイズ

変換元の画像 (約15M)

GDを使ったリサイズ

GDで変換する際、地味に面倒なので、
- thumbnail.inc.php PHP Thumbnailer Class v2.0 « Gen X Design | Ian Selby
こちらを使わせてもらった。これ便利ですよ。

require_once 'thumbnail.inc.php';
require_once 'Benchmark/Timer.php';

$src_filename = 'large_image.jpg';
$dst_filename = 'small_image_gd.jpg';

$tm = new Benchmark_Timer;
$tm->start();

$img = new Thumbnail($src_filename);
$img->resize(0,100);
$img->save($dst_filename);

$tm->stop();
$tm->display();

結果↓

  time index ex time %
Start 1239848348.57394600 - 0.00%
Stop 1239848353.94621700 5.372271 100.00%
total - 5.372271 100.00%

SIPSコマンドを使ったリサイズ

require_once 'Benchmark/Timer.php';

$src_filename = 'large_image.jpg';
$dst_filename = 'small_image_sips.jpg';

$dir = getcwd();
$cmd = sprintf("/usr/bin/sips --resampleHeight 100 %s/%s --out %s/%s",$dir,$src_filename,$dir,$dst_filename);

$tm = new Benchmark_Timer;
$tm->start();

exec($cmd); 

$tm->stop();
$tm->display();

結果↓

  time index ex time %
Start 1239848381.50884500 - 0.00%
Stop 1239848382.64041800 1.131573 100.00%
total - 1.131573 100.00%

結果報告

それぞれ、5回ずつ実行し、平均値を測定。

GD:5.34秒
SIPS:1.19秒

と、sipsコマンドでリサイズしたほうが、約5倍速かったということになる。

念のため、ソース画像を600×400でやってみた。ソース画像の大きさで違いがでるかもしれないと思ったので。
結果は、やはりsipsのほうが2倍ほど早かった。

処理速度の違いの原因は、ロジックなのかそれともapacheのモジュールとして動くphpの仕組み上の制限なのか、底までは調べていないが、外部コマンド起動のオーバーヘッドを考慮しても、充分に速い(=使える)と思った。ソース画像が大きければ大きいほど、外部コマンドで処理したほうがhttpdには優しいかもししれない(間違ってたら指摘歓迎)

欠点としては、SIPSはMacでしか使えな(ry

linux系のサーバなら、素直にImageMagick使った方がいいかな。
今回、imagemagick(PECL版、コマンド版)も比較したかったのだけど、Mac OS XのImageMagickの設定がちょっと面倒なので、準備でき次第、比較したいと思う。

…またもやニッチな記事になってしまったかな~

[関連エントリー]
PDFからJPEGやPNG画像を作成 » TECH Matari

Popularity: 13% [?]

written by ANN

add to hatena hatena.comment (1) add to del.icio.us (0) add to livedoor.clip (0) add to Yahoo!Bookmark (0) Total: 1

Leave a Reply