我希望每一帧都能重新绘制,在它背后绘制之前没有框架。我目前的代码是:
// $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)
:example image setImageDispose(2-3)
:example image 虽然(1)似乎按预期工作,但它仍然在下面绘制前面的帧。我怎样才能简单地将它设置为Gimp相当于“替换”,其中每个帧都是独立绘制的?还有其他我没有找到的功能会解决这个问题吗?
谢谢。
附加说明:
setImageDispose()
最终的gif对象,两者都有相同的结果(上图)setImagePage()
无济于事,但也许我错了?答案 0 :(得分:1)
我找到了解决方案。 deconstructImages()
正在我们在上面的setImageDispose(2-3)
示例中看到的方式优化框架。我的解决方案是对这些tweo函数进行切换,因此我可以输出为:
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);