PHPとImageMagickでの画像縮小比較

売店に行ったらおもしろいのが売っていたので購入。

ImageMagick逆引きコマンドリファレンス

ImageMagick逆引きコマンドリファレンス

コマンドラインで画像の拡大縮小やフィルターができるImageMagickの参考書。
PHPとの連携(phpのextentionでなく純粋にコマンド実行)があるのがうれしい。

ってことで、ちょっくら画像のサムネイルをしてみました。
コマンドは簡単なので、もしPHPで画像の縮小とかに挫折した人はこちらがお勧めかも。
#コマンド実行なのでファイル名のエスケープ(escapeshellcmd)など付けてね。

$CONPATH = "C:\\Program Files\\ImageMagick-6.2.8-Q16\\";
$dirpath = "img";
$filename = "01.jpg";
$cmd = " \"{$CONPATH}convert.exe\" {$dirpath}/{$filename} -resize 100x thumimg_imagick/{$filename}";

これで画像を横幅100pxに縮小保存してくれます。
100x200とかにすると横100pxか縦200pxに縮小します。縦横のサイズは縮小する際、その値に達した時のほうが優先されます。
んでベンチマークはどうなんだろうってことでやってみました。

いまいち!
しかしImageMagickコマンドライン一行でいろいろなこと(フィルターとか)ができるのでこれはケースバイケースだね。
パラ見して便利そうだなぁって思った機能リスト

  • AVIをアニメーションGIFに変換
  • いろいろなフィルター
  • 画像・テキスト合成
  • 画像形式変換

ベンチを計測したプログラムのソースはこちら

<?php
ini_set('include_path', 'c:\wamp\php\pear' . PATH_SEPARATOR . ini_get('include_path'));
//ImageMagickのパス
$CONPATH = "C:\\Program Files\\ImageMagick-6.2.8-Q16\\";
//ベンチマーク
require_once 'Benchmark/Timer.php';
$profiler = new Benchmark_Timer;
$profiler->start();
//ファイルリスト取得
$dirpath = "img";
$dir = dir( $dirpath );
while( $item = $dir->read() ){
    if( $item != "." &&  $item != ".." ){
        $filelist[] = $item;
    }
}
$profiler->setMarker('init');
/******* PHPでのサムネイル作成 *******/
foreach( $filelist as $number => $filename ){
    //画像の読み込み
    $fileurl    = "{$dirpath}/{$filename}";
    $im_src     = imagecreatefromjpeg( $fileurl );
    //画像出力ファイル名
    $filename = "thumimg_php/{$filename}";
    //画像のサイズ取得
    $im_src_x   = imagesx($im_src);
    $im_src_y   = imagesy($im_src);
    $width      = 100;
    //画像の比率作成(指定された横幅から縦幅を作成)
    $height = intval( $im_src_y * ( $width / $im_src_x ) );
    //画像を作成する。
    $im = @imagecreatetruecolor ( $width , $height );
    //画像の縮小
    imagecopyresampled ( $im , $im_src , 0 , 0, 0, 0, $width , $height , imagesx( $im_src ) , imagesy( $im_src ) );
    //出力
    imagejpeg($im , $filename );
    //メモリ解放
    imagedestroy($im);
}
$profiler->setMarker('php');
/******* ImageMagick(convert.exe)でのサムネイル作成 *******/
foreach( $filelist as $number => $filename ){
    $cmd = " \"{$CONPATH}convert.exe\" {$dirpath}/{$filename} -resize 100x thumimg_imagick/{$filename}";
    exec( $cmd );
}
$profiler->setMarker('imagick');
/******* ベンチマーク終了 *******/
$profiler->stop();
$time = $profiler->getProfiling();
//$profiler->display();
for( $i = 0 ; $i < count ( $time ) ; $i ++ ){
    $time[$i]["name"];
    $time[$i]["diff"];
    $time[$i]["total"];
    $total = $time[$i]["total"];
    $w = intval( $time[$i]["diff"] * 70 );
    $title .=<<<EOD
<tr>
 <td nowrap style="border:1px solid gray;">
  {$time[$i]["name"]}
 </td>
 <td style="border:1px solid gray;">
  {$time[$i]["diff"]}
 </td>
 <td style="border:1px solid gray;">
  <img src="bar.gif" width="{$w}" height="15">
 </td>
</tr>
EOD;
}
echo <<<EOD
<h2>PHP と ImageMagick の比較(サムネイル作成)</h2>
<hr>
イラスト49枚を横幅100pxに縮小保存
<table  cellspacing="1" cellpadding="4" style="border:1px solid gray;">
{$title}
</table>
<br >
数値が低いほうがベター
EOD;
exit;
?>