PHPで行う簡単画像リサイズと速度検証

こんばんは、笹亀です。

最近、暑い日が続きクーラーを節電で控えるという生活をしております。
最近の暑さでは下手したら寝ながらにして熱中症になるなんてことも起こそうです。
節電も身体を壊してまでするものではないので適度に頑張ろうと思います。

さて、本日はPHPでの画像処理について記述をまとめてみたいと思います。

一般的にはPHPではGDなどが有名です。PHPのマニュアルを見てみると、画像処理にはGDの他にImageMagick、Gmagickなどの関数もデフォルトで用意されています。
私自身はImageMagickを利用することが多く、Gmagicというのはあまり使ったことが無いのでこちらの使用についても今回を機会に検証をしてみたいと思います。

本日使用する画像:宮島の鹿さん(画像サイズ1.6M 1936 x 2592)

■GDにて画像リサイズ(スクリプト


//元画像のサイズ
$width = 1936;
$height = 2592;
//リサイズ後のサイズ
$resize_width = 240;
$resize_height = 320;
$image_name = "./img.jpg";
//--GD処理
list($mnow, $now) = split(' ', microtime());
$gd_start = $now + $mnow;
echo $gd_start . "\n";
$source = imagecreatefromjpeg($image_name);
$new_image = imagecreatetruecolor($resize_width, $resize_height);
imagecopyresampled($new_image, $source, 0, 0, 0, 0, $resize_width, $resize_height, $width, $height);
imagejpeg($new_image, 'resize_gd.jpg');
list($mnow, $now) = split(' ', microtime());
$gd_finish = $now + $mnow;
echo $gd_finish . "\n";
//実行時間を表示
echo 'gd_exec_time:' . round($gd_finish - $gd_start, 4) . "\n";

実行後のリサイズした画像

■Imagickにて画像リサイズ(スクリプト


$width = 1936;
$height = 2592;
$resize_width = 240;
$resize_height = 320;
$image_name = "./img.jpg";
//--Imagick処理
list($mnow, $now) = split(' ', microtime());
$imagick_start = $now + $mnow;
echo $imagick_start . "\n";
$thumb = new Imagick($image_name);
$thumb->resizeImage($resize_width, $resize_height, Imagick::FILTER_LANCZOS, 1);
$thumb->writeImage('resize_imagick.jpg');
list($mnow, $now) = split(' ', microtime());
$imagick_finish = $now + $mnow;
echo $imagick_finish . "\n";
echo 'imagick_exec_time:' . round($imagick_finish - $imagick_start, 4) . "\n";

実行後のリサイズした画像

■Gmagickにて画像リサイズ(スクリプト


$width = 1936;
$height = 2592;
$resize_width = 240;
$resize_height = 320;
$image_name = "./img.jpg";
//--gmagick処理
list($mnow, $now) = split(' ', microtime());
$gmagick_start = $now + $mnow;
echo $gmagick_start . "\n";
$thumb = new Gmagick($image_name);
$thumb->resizeImage($resize_width, $resize_height, Gmagick::FILTER_LANCZOS, 1);
$thumb->writeImage('resize_gmagick.jpg');
list($mnow, $now) = split(' ', microtime());
$gmagick_finish = $now + $mnow;
echo $gmagick_finish . "\n";
echo 'gmagick_exec_time:' . round($gmagick_finish - $gmagick_start, 4) . "\n";

実行後のリサイズした画像

PHPのスクリプトでリサイズを行う方法で変換処理について、
どれが一番早いかを確認してみたくて行ってみました。

実際の実行結果については下記のようになりました。


gd_exec_time      :0.4853(sec)
imagick_exec_time :0.475(sec)
gmagick_exec_time :0.4588(sec)

誤差ではありますが、gmagickが一番早いようです。
個人的な意見ですが、ImageMagickをよく使うことからImageMagickをお薦めしたいです。
Gmagickも速さが売りみたいなことが記載されていましたので、速さを求める場合にはこちらも検証の価値があるかと思います。

PHPで画像の変換処理をするには少し重たくなることに気をつけながら使用してください。いろんな箇所で動的に変換処理をするなど、乱用利用をしないように十分に気をつけてください。

※一番苦労したのはImagickとGmagickのクラスを使えるようにするための環境作りでした^^;
下記を参考にさせていただきました、ありがとうございます。
http://www.rakugaki.jp/blog/archives/20081106,11.html
http://tsukihito.dip.jp/2011/07/08/whitening-pdf-for-graphicsmagick/