(PHP)Imagick创建的gif动画:设置框架处理?

时间:2015-04-15 09:03:47

标签: php animation gif imagick

我希望每一帧都能重新绘制,在它背后绘制之前没有框架。我目前的代码是:

// $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)example image
  2. setImageDispose(2-3)example image
  3. 虽然(1)似乎按预期工作,但它仍然在下面绘制前面的帧。我怎样才能简单地将它设置为Gimp相当于“替换”,其中每个帧都是独立绘制的?还有其他我没有找到的功能会解决这个问题吗?

    谢谢。

    附加说明:

    • 我尝试在框架对象和框架对象上使用setImageDispose() 最终的gif对象,两者都有相同的结果(上图)
    • 我试过setImagePage()无济于事,但也许我错了?
    • 当我的$ frames被单独回显时,每个帧都被绘制完毕。

1 个答案:

答案 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);