2015-04-15 40 views
1

我希望每一帧都能重新绘制,而不需要在它之后绘制它。我当前的代码是:(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)example image
  2. setImageDispose(2-3)example image

虽然(1)似乎工作如预期的那样,它仍在绘制下面的前一帧。我怎样才能简单地将它设置为Gimp的“替换”等价物,其中每个框架都是独立绘制的?我还没有发现可以解决这个问题的另一个功能吗?

谢谢。

其他备注:

  • 我已经使用setImageDispose()两个框对象上和 最终GIF对象尝试和两者都具有相同的结果(见上文)
  • 我试图setImagePage()无济于事,但也许我错用了它?
  • 当我的$框架单独回显时,它们都绘制完成。

回答

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