簡體   English   中英

將動畫Gif合並為背景圖像

[英]Merging animated Gif into background image

我正在嘗試將動畫gif合並為靜態jpeg作為背景,這是由html畫布和用戶上傳的文件上傳生成的。 我在imagemagick命令行上運行得很好

exec("convert ".$_paths['images_dir'].$fname.".gif  \( gif/cleared_dance".$dance.".gif -resize '80%' -repage 0x0-10+$imgHeight\! \) -coalesce -delete 0 -deconstruct -loop 0 ".$_paths['images_dir'].$fname.".gif");

這大約需要15秒鍾才能完成,但是后來我發現我不能使用exec命令,而必須使用Imagick API,最終我可以使用以下代碼重新創建過程:

$data = $_POST["imgData"]; 
$dance = $_POST["dancer"]+1;
$spriteLeft = $_POST['left'];
$spriteTop = $_POST['top'];
$scale = $_POST['scale'];
$canvas = new Imagick();
$data = str_replace("data:image/png;base64,", "",$data); 
$data = base64_decode($data);
$canvas->readImageBlob($data);

$fname = 'tmp_'.uniqid();
$gif = new Imagick();
$gif->readImage('gif/cleared_dance'.$dance.'.gif');
do {
  $canvas->addImage($gif);
} while ($gif->nextImage());

foreach($canvas as $frame){
   if($frame->getIteratorIndex() != 0){
      $page = $frame->getImagePage();
      $frame->setImagePage(200,200,$page['x']+$spriteLeft,$page['y']+$spriteTop);
   }
}

這段代碼大約需要5秒鍾,這很棒,但是當循環播放時,它們是gif中的空白幀,這非常煩人,因此我在以下代碼中添加了它:

$canvas->setIteratorIndex(0);
$canvas->removeImage();
$canvas = $canvas->deconstructImages();
$canvas->writeImages('tmp/'.$fname.'.gif', true);

這會取出空白幀,但會增加大約20-30秒的處理時間。 我是在做錯什么嗎?我在代碼順序方面做了很多嘗試,並嘗試了不同的方法。 有沒有辦法像命令行一樣將處理時間縮短到20秒以下?

您的代碼很奇怪。 為什么要設置將包含動畫gif的Imagick對象的格式為JPG? 合成圖像為什么還要擺弄圖像頁面?

我很確定您希望您的代碼看起來更像

$static = new Imagick();
//$static->readImage("./testFile.png");
$inputGif->readImageBlob($data);

$inputGif = new Imagick();
//$inputGif->readImage('./testGif.gif');
$inputGif->readImage('gif/cleared_dance'.$dance.'.gif');

$gifFrames = $inputGif->coalesceImages();

$outputGif = new Imagick();
$outputGif->setFormat('gif');

foreach ($gifFrames as $gifFrame) {
    $frame = clone $static;
    $frame->compositeimage(
        $gifFrame,
        Imagick::COMPOSITE_OVER,  // or maybe \Imagick::COMPOSITE_ATOP,
        0, 0 // Set the offset here if you don't want the gif in the top left corner.
    );

    $outputGif->addImage($frame);
}

$outputGif->setImageIterations(0); //loop forever
$outputGif->deconstructImages();
$outputGif->writeImages("./outso.gif", true);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM