最近同じ問題に遭遇しましたが、元の 2592x1944 から 300xbestFit または bestFitx300 にサイズ変更するために、画像を 1 回だけ通過していました。
コマンド ラインの代わりに PHP クラスの imagick を使用していますが、私の場合は -scale または scaleImage に変更することで時間を半分に短縮できました。これが私のテストコードのスニペットです。
while ($images = readdir($handle)) {
// check to see if the first or second character is a '.' or '..',
// if so then remove from list
if (substr($images,0,1) != '.') {
//Check files to see if there extensions match any of the following image extensions.
// GLOB_BRACE looks for all glob criteria within the {braces}
$images = glob($dir."{*.gif,*.jpg,*.png,*.jpeg}", GLOB_BRACE);
// the glob function gives us an array of images
$i = 0;
foreach ($images as $image) {
// parse the data given and remove the images/ $dir,
// imagemagick will not take paths, only image names.
$i++;
list ($dir, $image) = split('[/]', $image);
echo $i, " ", $image, "<br />";
$magick = new Imagick($dir."/".$image);
$imageprops = $magick->getImageGeometry();
if ($imageprops['width'] <= 300 && $imageprops['height'] <= 300) {
// don't upscale
} else {
// 29 Images at 2592x1944 takes 11.555036068 seconds ->
// output size = 300 x 255
$magick->scaleImage(300,300, true);
// 29 Images at 2592x1944 takes 23.3927891254 seconds ->
// output size = 300 x 255
//$magick->resizeImage(300,300, imagick::FILTER_LANCZOS, 0.9, true);
$magick->writeImage("thumb_".$image);
}
}
}
}
2592x1944 で 29 枚の画像を処理していますが、23.3927891254 秒から 11.555036068 秒になりました。これが役立つことを願っています。
編集:
上で言ったことに加えて、ImageMagick v6 Examples -- API & Scriptingで役立つかもしれない以下に出くわしました:
「シェルスクリプトは本質的に遅いです。解釈され、複数のステップとディスクへの余分なファイル処理が必要です。これはもちろん、新しい IM v6 オプション処理のおかげで改善され、単一のコマンドで多数の画像処理操作を実行できます。 . それでも、1 つのコマンドですべてを実行できることはめったにないconvert
ため、目的を達成するために複数のコマンドを使用する必要があることがよくあります。
「大量の画像または多数の画像を読み取る場合は、読み取りモディファイアを使用してサイズ変更またはトリミングすることをお勧めします。IM は完全な画像を読み取らないため、メモリ要件が軽減されます。」
「ImageMagick を Apache モジュールとして呼び出すと、再ロードを何度も行う必要がなく、パーツが一度ロードされ、複数回使用できるようになるため、起動時間も短縮されます。これは、永続的な「デーモン」IM プロセスを実行しています。」