2010/01/11

GD vs. Imagick (ImageMagick)

由於之前聽到網路上傳言 ImageMagick 函式庫的效能比 GD 還要好,不過找不到實在測試資料,所以自己來跑測試。

測試方式是由自己的一張全景照片 (512 x 512, 340KB) 分別用 GD 與 ImageMagick 的縮圖函式進行縮圖 (256 x 256),並紀錄執行函式所需要的時間。

產生縮圖用的程式碼分別如下:

Imagick.php:
<?php
function mtime()
{
   list($usec, $sec) = explode(" ", microtime());
   return ((float)$usec + (float)$sec);
}
$img = new Imagick();
$img->readImage('lenna.jpg');

for($a=0;$a<5;$a++){
   $start = mtime();
   $img->resizeImage(256,256,Imagick::FILTER_LANCZOS,1);
   $stop = mtime();
   echo ($stop - $start)."\n";
   exec('sleep 1');
}

$img->writeImage('s_imagick.jpg');
$img->clear();
$img->destroy();
?>

gd.php:
<?php
function mtime()
{
          list($usec, $sec) = explode(" ", microtime());
          return ((float)$usec + (float)$sec);
}

$src = imagecreatefromjpeg("lenna.jpg");
$thumb = imagecreatetruecolor(256,256);
$src_w = imagesx($src);
$src_h = imagesy($src);

for($a=0;$a<5;$a++){
   $start = mtime();
   imagecopyresampled($thumb, $src, 0, 0, 0, 0, 256, 256, $src_w, $src_h);
   $stop = mtime();
   exec('sleep 1');
   echo  ($stop - $start)."\n";
}

imagejpeg($thumb, "s_gd.jpg");
?>

由於 PHP 原本的 time() 精確度只有到秒,對於這種小圖檔實在不夠用,於是找了 microtime() 來紀錄時間,呼叫 mtime() 以後會傳回當時的毫秒數並以 float 儲存,縮圖完畢在將結束時間與開始時間相減取得執行時間。

分別執行五次並紀錄結果。

使用 ImageMagick 函式庫:
0.050060033798218
0.048804998397827
0.051737070083618
0.048964977264404
0.048758983612061    平均:0.0496652126312256 秒

使用 GD 函式庫:
0.094849109649658
0.095477104187012
0.096488952636719
0.097059011459351
0.098549127578735    平均:0.096484661102295 秒

接下來比較原始圖檔以及縮圖品質。


原始圖 340 KB (點圖放大)



ImageMagick resizeImage() 產生出來的縮圖 50 KB



GD imagecopyresampled() 產生出來的縮圖 12 KB


產生出來的縮圖感覺 ImageMagick 的銳利度較高,可由帽子上的紋路看出。在這次測試時 ImagickMagic 些微勝出。

前一次測試時使用相機拍攝的 2.7M 全景圖製作 3/10 的縮圖,反而是 ImageMagick 較慢,時間接近 GD 的二倍,但是銳利度仍然是 ImageMagick 較高。但 ImageMagick 的銳利度是可以調整的,如果將銳利度降低不知速度是否會加快。

2 則留言:

  1. 基本上size差太多,明顯看出ImageMagick的品質好於GD,GD影像的細節不見太多了 參數再調一下讓兩張size差不多再來比品質和時間。

    回覆刪除