2

次のコードを使用して、PHPとImagickを使用して複数の画像を1つのアニメーション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);
?>

フレームごとに背景画像と「Helloworld」が表示されることになっています。ご覧のとおり、テキスト画像、背景画像、レイヤーを1つのフレームに結合しています。レイヤー画像には、背景が透明なある種の描画が含まれているため、その場合は、提供された背景とテキストが表示されます。ただし、問題はアニメーションGIF「result.gif」のファイルサイズにあり、30フレームの画像で約3MBであることがわかります。

問題は、品質にそれほど影響を与えずにファイルサイズを小さくするにはどうすればよいですか?システムでコマンドラインツールを実行するなど、回答を受け付けています。

ありがとう

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 に答える