我正在调整动画 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 的大小时,需要相当长的时间。
使用上面的代码,大约需要 10 秒来调整一个 60 帧的 36kb gif 的大小。对于非动画图像,大约需要半秒钟。
我正在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 秒(10%!)与以前相比!所以,对于那个说,我应该对性能感到满意而不是抱怨的人,这证明你应该调查和改进你以前满意的东西,否则你将永远是一个平庸的开发者。
当然,我正在尝试进一步减少转换时间,并将进行一些分析以确定哪些调用是最昂贵的,然后针对这些调用。