2

我正在使用 PHP 和 Imagick 编写一些代码,它使用以下代码将多个图像收集到一个动画 GIF 中:

<?php
    error_reporting(E_ALL);
    ini_set('display_errors',1);

    $anim = new Imagick();


    for($i = 0; $i<=36; $i++) {
        $bgImage = new Imagick('Background.gif');

        $imagick = new Imagick("sw_layers-$i.gif");

        $bgImage->setImageColorspace($imagick->getImageColorspace());
        $bgImage->compositeImage($imagick, imagick::DISPOSE_PREVIOUS,0,0);

        $draw = new ImagickDraw();

        /*** set the fill color ***/
        $draw->setFillColor( new ImagickPixel( "orange" ) );

        $draw->annotation( 10, 10, 'Hello world');

        $bgImage->drawImage( $draw );

        $anim->addImage($bgImage);
        $anim->setFormat("gif");
        $anim->setImageDispose(3);
        $anim->setImageCompression(imagick::COMPRESSION_JPEG);
        $anim->setImageCompressionQuality(50);
    }

    echo $anim->writeImages('Result.gif', true);
?>

背景图像和“Hello world”应该出现在每一帧中。如您所见,我将文本图像、背景图像和图层合并到一个框架中。图层图像包含某种具有透明背景的绘图,因此我提供的背景和文本应该出现在这种情况下。但是,问题在于动画 gif “result.gif”的文件大小,对于 30 帧的图像,它的大小约为 3 MB。

问题是,如何在不影响质量的情况下减小文件大小?我愿意接受答案,包括在系统上运行命令行工具。

谢谢

4

2 回答 2

1

尝试使用

$anim->setImageFormat('gif');

而不是 setFormat。

一些例子可以在这里找到:

http://uk.php.net/manual/en/function.imagick-setimageformat.php

于 2011-03-25T22:31:46.463 回答
0

您是否尝试过,它比较帧并删除跨帧的复制数据?

/* optimize the image layers */
$im->optimizeImageLayers();

/* write the image back */
$im->writeImages("test_optimized.gif", true);

来源:Imagick OptimizeLayers

于 2015-03-02T20:40:10.200 回答