Вывод каждого отдельного анимированного GIF-кадра в соответствии с наглядностью

В некоторых анимированных GIF-файлах для последующих кадров сохраняются только данные по сравнению с более ранним кадром. Теперь я только коснулся поверхности внутренней работы структуры данных (анимированных) GIF-файлов, но я полагаю, что это делается с помощью того, что называется сжатием, разницей кадров или удалением (не совсем точно, на самом деле).

С помощью Gmagick или Imagick для PHP, как мне извлечь каждый кадр (записать их) так, чтобы извлекались не только эти минимальные данные, но и полное представление этого кадра в том виде, в котором оно предназначено визуально?

До сих пор я пробовал следующее с Gmagick, но, к сожалению, безрезультатно:

// as per this comment:
// http://php.net/manual/en/imagick.setimagedispose.php#95701
// I've tried values in the range 0-4 here:
$img->setImageDispose( 0 ); // $img is animated GIF instance of Gmagick
$frameIndex = 0;
do
{
    $img->setImageIndex( $frameIndex );
    $frame = $img->getImage();
    $frameName = ++$frameIndex . '.gif';
    $frame->writeImage( $frameName, false ); // or:
    // $frame->write( $frameName );
}
while( $img->hasNextImage() );

Я пробовал еще несколько вещей, таких как Gmagick::setImageScene()и т. д. Но ничего не работает. Я могу сохранять только данные о разнице кадров, а не такие, которые предназначены для визуального отображения.

1 ответ

Решение

Я сам узнал, как это сделать с помощью Imagick:

$frameIndex = 0;
$img = $img->coalesceImages();
foreach( $img as $frame )
{
    $frameName = ++$frameIndex . '.gif';
    $frame->writeImage( $frameName );
}

Другими словами, Imagick::coalesceImages() сделал трюк.

Другие вопросы по тегам