2015-04-15 41 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);