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にリサイズ
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% [?]




