1

アニメーション GIF のサイズを変更し、PHP のimagick拡張機能を使用して背景を追加しています。

これは私が使用しているコードです:

$image = new Imagick('myfile.gif');
$image = $image->coalesceimages();

$final = new \Imagick();

foreach ($image as $frame){

    $frame->thumbnailImage($width, $height, true);
    $geometry = $image->getImageGeometry();

    $x = ( $width - $geometry['width'] ) / 2;
    $y = ( $height - $geometry['height'] ) / 2;

    $canvas = new \Imagick();
    $canvas->newImage( $width, $height, $background);

    $canvas->compositeImage( $image, \Imagick::COMPOSITE_OVER, $x, $y );

    $final->addimage($canvas);
}

$final->desconstructimages();
$final->writeImages('resized.gif', true);

コードは機能し、サイズ変更された画像は完璧です。ただし、アニメーション GIF のサイズを変更すると、かなり時間がかかります。

上記のコードでは、36kb の gif を 60 フレームでリサイズするのに約 10 秒かかります。アニメーションのない画像では、約 0.5 秒かかります。

で走っImageMagick 6.8.1-0 2012-12-20ていUbuntu 12.10 32-bitます。

サイズ変更を高速化する方法はありますか?

アップデート:

私は、thumbnailImage をすべてのフレームで呼び出す必要がないことがわかったので、これを使用しています。

$image = new Imagick('myfile.gif');
$image = $image->coalesceimages();

$final = new \Imagick();

$image->thumbnailImage($width, $height, true);
$geometry = $image->getImageGeometry();

$x = ( $width - $geometry['width'] ) / 2;
$y = ( $height - $geometry['height'] ) / 2;

foreach ($image as $frame){

    $canvas = new \Imagick();
    $canvas->newImage( $width, $height, $background);

    $canvas->compositeImage( $image, \Imagick::COMPOSITE_OVER, $x, $y );

    $final->addimage($canvas);
}

$final->desconstructimages();
$final->writeImages('resized.gif', true);

サムネールを 1 回行うだけで、以前に比べて平均 1 秒 (10%!) 節約できました。だから、私はパフォーマンスに満足すべきであり、文句を言うべきではないと言った人にとって、これは以前に満足していたことを調査して改善する必要があるという証拠です。

もちろん、私は変換時間をさらに短縮しようとしており、プロファイリングを行って、どの呼び出しが最も高価であるかを判断し、それらをターゲットにします.

4

3 に答える 3

-3

60 フレームのサイズ変更に 10 秒かかる場合、各フレームは実際には 1/6 秒かかります。これは、1 フレームの結果よりも優れていますね。60 倍の作業が少し長くかかる場合、文句を言うべきではありません。

于 2013-06-15T09:53:33.863 に答える