Я бы хотел, чтобы каждый кадр был нарисован заново, без того, чтобы кадр был нарисован позади него. Мой текущий код:
// $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()
настройки достижения того, что я хочу:
setImageDispose(1)
: пример изображенияsetImageDispose(2-3)
: пример изображенияХотя (1), кажется, работает как задумано, он все еще рисует предыдущие кадры внизу. Как я могу просто установить в Gimp эквивалент «заменить», где каждый кадр рисуется независимо? Есть ли еще одна функция, которую я не нашел, чтобы решить эту проблему?
Спасибо.
Дополнительные примечания:
setImageDispose()
как на объекте кадра, так и наsetImagePage()
безрезультатно, но, возможно, я использовал это неправильно?Я нашел решение. 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);
Других решений пока нет …