анимация — Gif, созданный с помощью Imagick, не зацикливается (PHP)

Я использую Imagick для создания анимированного GIF из моего массива кадров. Образец GIF, который я создал, оживляет, как и ожидалось, но анимация не возвращается к началу.

Пример переменных:

$durations = array(100, 100);
$loops = 0; // infinite

Основной код / ​​create_gif ()

$gif = new Imagick();
$gif->setFormat('gif');
for ($i = 0; $i < count($frames); $i++) {
$gif->addImage($frames[$i]);
$gif->setImageDelay($durations[$i]);
}
$gif->setImageIterations($loops);
$gif = $gif->deconstructImages();
$gif->writeImages('test.gif', true);

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

Что я могу изменить, чтобы зациклить GIF?


РЕДАКТИРОВАТЬ Как и требовалось, вот (несколько урезанный) код, используемый для построения фреймов:

// Build an array of still frames
$frames = array();
for ($i = 0; $i < $frame_num; $i++) {
// Build an array of image layers
$layers = array();
for ($j = 0; $j < 11; $j++) {
$layers[$j] = new Imagick();
$layers[$j]->readImage('path_to_this_layer.gif');
}
// Combine the image layers into a frame
$frames[$i] = create_frame($layers);
}

// Combine the frames into an animated gif
$gif = create_gif($image_string, $frames, $durations, $loops);
// create_gif() triggers the code I originally posted

create_frame ():

$frame = new Imagick();
$frame->readImageBlob($layers[0]);
for ($i = 1; $i < count($layers); $i++) {
if ($layers[$i] != false) {
$frame->compositeImage($layers[$i], Imagick::COMPOSITE_DEFAULT, 0, 0);
}
}
$frame->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
return $frame;

3

Решение

Наконец, после долгих раздумий я обнаружил проблему:

setImageIterations() должен быть назван после deconstructImages()

Поэтому моя рабочая функция gif_create () теперь выглядит следующим образом:

$gif = new Imagick();
$gif->setFormat('gif');
for ($i = 0; $i < count($frames); $i++) {
$gif->addImage($frames[$i]);
$gif->setImageDelay($durations[$i]);
}

// These two were swapped around
$gif = $gif->deconstructImages();
$gif->setImageIterations($loops);

$gif->writeImages('test.gif', true);

Надеюсь, я смогу спасти кого-то еще от головной боли, если они тоже смешают эти два.

0

Другие решения

Других решений пока нет …