Уменьшение размера GIF-файлов с помощью ImageMagick и PHP - PullRequest
2 голосов
/ 26 марта 2011

Я пишу некоторый код, используя 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", который оказывается около 3 МБ для изображения 30 кадров.

Вопрос в том, как я могу уменьшить размер файла, не сильно влияя на качество? я открыт для ответов, включая запуск инструмента командной строки в системе.

Спасибо

Ответы [ 2 ]

1 голос
/ 26 марта 2011

попробуйте использовать

$anim->setImageFormat('gif');

вместо setFormat.

некоторые примеры можно найти здесь:

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

0 голосов
/ 02 марта 2015

Вы пробовали это, он сравнивает кадры и удаляет реплицированные данные по кадрам?

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

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

Источник: Imagick OptimizeLayers

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...