(PHP) Созданная Imagick GIF-анимация: настройка удаления фрейма?

Я бы хотел, чтобы каждый кадр был нарисован заново, без того, чтобы кадр был нарисован позади него. Мой текущий код:

// $frames is an array of image blobs
$durations = array(50, 50, 50, 50)
$loops = 0;

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

Ни один из setImageDispose() настройки достижения того, что я хочу:

  1. setImageDispose(1): пример изображения
  2. setImageDispose(2-3): пример изображения

Хотя (1), кажется, работает как задумано, он все еще рисует предыдущие кадры внизу. Как я могу просто установить в Gimp эквивалент «заменить», где каждый кадр рисуется независимо? Есть ли еще одна функция, которую я не нашел, чтобы решить эту проблему?

Спасибо.

Дополнительные примечания:

  • Я пытался использовать setImageDispose() как на объекте кадра, так и на
    возможный объект GIF и оба имеют одинаковый результат (выше)
  • я пытался setImagePage() безрезультатно, но, возможно, я использовал это неправильно?
  • Когда мои $ фреймы отображаются индивидуально, каждый из них рисуется завершенным.

1

Решение

Я нашел решение. deconstructImages() оптимизировал кадры так, как мы видим в setImageDispose(2-3) пример выше. Мое решение состояло в том, чтобы иметь переключатель для этих функций твио, так что я могу вывести либо:

  • setImageDispose(1) — больший размер файла, но без перекрывающихся кадров
  • setImageDispose(2); deconstructImages() — меньший размер файла

В зависимости от анимации, которую я строю, я могу распоряжаться или нет. Мой окончательный код выглядит примерно так:

// $frames is an array of image blobs
$durations = array(50, 50, 50, 50)
$loops = 0;
$dispose = false;

$dispose_mode = ($dispose) ? 2 : 1;

$big = new Imagick();
$big->setFormat('gif');
for ($i = 0; $i < count($frames); $i++) {
$frames[$i]->setImageDispose($dispose_mode);
$frames[$i]->scaleImage(140, 140);
$big->addImage($frames[$i]);
$big->setImageDelay($durations[$i]);
}
$big->setImageIterations($loops);
$big = ($dispose) ? $big : $big->deconstructImages();
$big->writeImages('output.gif', true);
1

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

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

По вопросам рекламы [email protected]