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

(PHP)Imagick创建的gif动画:设置帧处理?,php,animation,gif,imagick,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

我希望每一帧都能被重新画出来,没有之前的帧被画在后面。我目前的代码是:

// $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');
/$frames是一组图像斑点
$durations=数组(50,50,50,50)
$loops=0;
$big=新的Imagick();
$big->setFormat('gif');
对于($i=0;$iscaleImage(140140);
$frames[$i]>setImagePage(140,140,0,0);
$frames[$i]>setImageDispose(1);
$big->addImage($frames[$i]);
$big->setImageDelay($durations[$i]);
}
$big=$big->解构图像();
$big->setImageIterations($loops);
$big->writeImages('test.gif');
所有
setImageDispose()
设置都没有达到我想要的效果:

  • setImageDispose(1)
  • setImageDispose(2-3)
  • 虽然(1)看起来像预期的那样工作,但它仍然在下面绘制前面的帧。我如何简单地将其设置为Gimp的“替换”,即独立绘制每个帧?有没有其他我没有找到的函数可以解决这个问题

    多谢各位

    附加说明:

    • 我已尝试在frame对象和 最终的gif对象和两者具有相同的结果(如上)
    • 我尝试了
      setImagePage()
      但没有成功,但可能是我用错了
    • 当我的$frames被单独回显时,它们都被完整地绘制出来

      • 我找到了解决办法
        deconstructImages()
        正在以我们在上面的
        setImageDispose(2-3)
        示例中看到的方式优化帧。我的解决方案是为这些tweo函数设置一个切换,因此我可以输出为:

        • setImageDispose(1)
          -文件大小更大,但没有重叠帧
        • setImageDispose(2);解构图像()
          -更小的文件大小
        根据我正在构建的动画,我可以处置或不处置。我的最终代码如下所示:

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

        $dispose\u mode=($dispose)?2 : 1;
        $big=新的Imagick();
        $big->setFormat('gif');
        对于($i=0;$isetImageDispose($dispose\u模式);
        $frames[$i]>scaleImage(140140);
        $big->addImage($frames[$i]);
        $big->setImageDelay($durations[$i]);
        }
        $big->setImageIterations($loops);
        $big=($dispose)$大:$big->解构图像();
        $big->writeImages('output.gif',true);
        
        $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);