モノノフ日記

普通の日記です

Imagick::resizeImageのフィルタ別速度を計測してみた

Imagick::resizeImageメソッドにはデフォルトでやたらフィルタが用意されていますけど、どれが良いのかさっぱりわからないので全部計測してみました。チェックしたのは http://www.php.net/manual/ja/imagick.constants.php で定義されているフィルタ定数すべてです。
ベンチマーク計測には PEAR::Benchmark を使ってみました。

測定条件

測定PCスペック

下記スペックで動いてるVMWare上のCentOSで測定してます。

  • CPU: Xeon L5310
  • メモリ: 2GB
利用した画像

PHOTOHITOからクリエイティブコモンズライセンスが指定されている下記の画像を使わせていただきました。

この画像の長辺を1024pxに縮小する処理でベンチを取ってみました。

ベンチ測定コード

毎回同じ画像読み込んで、フィルタ別にリサイズするだけのコードです。

<?php

require_once 'Benchmark/Timer.php';

$filter = array(
    'undefined' => imagick::FILTER_UNDEFINED,
    'point'     => imagick::FILTER_POINT,
    'box'       => imagick::FILTER_BOX,
    'triangle'  => imagick::FILTER_TRIANGLE,
    'hermite'   => imagick::FILTER_HERMITE,
    'hanning'   => imagick::FILTER_HANNING,
    'hamming'   => imagick::FILTER_HAMMING,
    'blackman'  => imagick::FILTER_BLACKMAN,
    'gaussian'  => imagick::FILTER_GAUSSIAN,
    'quadratic' => imagick::FILTER_QUADRATIC,
    'cubic'     => imagick::FILTER_CUBIC,
    'catrom'    => imagick::FILTER_CATROM,
    'mitchell'  => imagick::FILTER_MITCHELL,
    'lanczos'   => imagick::FILTER_LANCZOS,
    'bessel'    => imagick::FILTER_BESSEL,
    'sinc'      => imagick::FILTER_SINC
);

$timer = new Benchmark_Timer();

$timer->setMarker('start');
$image = new Imagick();

foreach ($filter as $key => $value) {
    $image->readImage('./imagick-benchmark.jpg');
    $image->resizeImage(0, 1024, $value, 1);
    $image->writeImage("./imagick-benchmark-$key.jpg");
    $image->clear();
    $timer->setMarker("filter_$key");
}

$image->destroy();

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

測定結果

marker time index ex time perct
Start 1260871659.59941500 - 0.00%
filter_undefined 1260871665.86842200 6.2690069675446 6.56%
filter_point 1260871670.85382700 4.9854049682617 5.21%
filter_box 1260871675.76367100 4.9098439216614 5.13%
filter_triangle 1260871680.99208100 5.2284100055695 5.47%
filter_hermite 1260871686.43630300 5.4442219734192 5.69%
filter_hanning 1260871693.67035700 7.2340540885925 7.56%
filter_hamming 1260871700.61708200 6.9467251300812 7.26%
filter_blackman 1260871707.45802100 6.8409388065338 7.15%
filter_gaussian 1260871712.89468100 5.4366600513458 5.69%
filter_quadratic 1260871718.32548100 5.4307999610901 5.68%
filter_cubic 1260871724.02629700 5.70081615448 5.96%
filter_catrom 1260871729.90510900 5.8788118362427 6.15%
filter_mitchell 1260871735.57420000 5.6690909862518 5.93%
filter_lanczos 1260871741.90656400 6.3323640823364 6.62%
filter_bessel 1260871748.33760900 6.4310450553894 6.73%
filter_sinc 1260871755.22181000 6.8842010498047 7.20%
Stop 1260871755.22493200 0.0031218528747559 0.00%
total - 1260865367.140610 0.00%

まとめ

  • 実行速度にそこまで大きな差はないが、若干の差はある。多量の画像を処理するときには影響しそう。
  • 画質も若干差がある。一見ではわからない程度だが、シャープネス寄りになるかぼやけた感じになるかの2通り。*1
  • FILTER_POINTだけ何故か処理後の画像が変なことに。
  • 出力結果とベンチマーク結果からFILTER_LANCZOS、FILTER_CATROM、FILTER_BLACKMANあたりが鉄板?

*1:後から処理した画像は比較のため追加する予定