克隆,模糊,裁剪和复合动画Gif

时间:2015-11-06 08:46:05

标签: php imagick animated-gif

我正在尝试从我的网站的youtube视频创建GIF动画,其中包含视频信息,我想克隆每个帧,裁剪它,模糊它并将其合成到某个位置,我有动画的图像,但是克隆的部分不是,就像是克隆第一帧然后将它合成到所有帧,我使用下面的代码

$img = "{$dir}{$vidInfo->id}.gif";

if( !file_exists($img) ) {
    $grabzIt->SetAnimationOptions("https://www.youtube.com/watch?v={$vidInfo->id}", "{$vidInfo->id}", 320, 180, 0, 5, 2, 10, 0, false, '', 100, "UK");
    $grabzIt->SaveTo($img);
}

$image = new Imagick($img);

$image = $image->coalesceImages(); 

foreach( $image as $frame ) {
    $blurred = clone $frame;
    $blurred->cropImage(360, 180, 241, 60);
    $blurred->blurImage(5,3);
    $frame->compositeImage($blurred, imagick::COMPOSITE_OVER, 241, 60);

    $blurred = clone $frame;
    $blurred->cropImage(320, 20, 0, 0);
    $blurred->blurImage(5,3);
    $frame->compositeImage($blurred, imagick::COMPOSITE_OVER, 0, 0);    

    $blurred = clone $frame;
    $blurred->cropImage(320, 20, 0, 160);
    $blurred->blurImage(5,3);
    $frame->compositeImage($blurred, imagick::COMPOSITE_OVER, 0, 160);
}

$image = $image->deconstructImages();
$image->writeImages("{$dir}{$vidInfo->id}_final.gif", true);
echo $image->getImagesBlob();

但它是这样的(注意模糊区域是静态的)

我不知道还有什么可做的,我已经找到了一些例子,但它们不能用于我想做的事情,我甚至尝试过

$blurred->clear();
$blurred->destroy();

在每一帧之后,但似乎也不起作用。

任何帮助都将非常感谢,谢谢你

1 个答案:

答案 0 :(得分:2)

在Imagick的foreach实现中看起来有一个' *。当你这样做时:

foreach ($animationImagick as $frameImagick) {
    //whatever
}

$frameImagick对象实际上并不是一个帧,而是整个动画的副本,内部迭代器设置为动画的相应帧。

正因为如此,当你去复合“框架图像”时,回到原始图像,ImageMagick发现它是一个包含多个内部图像的图像,并再次重置内部迭代器。这导致第一帧被粘贴。

将帧图像与动画图像集明确分离可解决此问题。此外,不修改您重复使用的数据是明智之举。此代码同时执行

$image = new Imagick("./SeriouslyBurned.gif");
$image = $image->coalesceImages(); 
$newImageFrames = [];
$numberImages = $image->getNumberImages();
$outputImage = new Imagick();


foreach ($image as $frame) {
    $frame = $frame->getImage();

    $blurred = clone $frame;
    $blurred->cropImage(360, 180, 241, 60);
    $blurred->blurImage(5,3);
    $frame->compositeImage($blurred, imagick::COMPOSITE_OVER, 241, 60);

    $blurred = clone $frame;
    $blurred->cropImage(320, 20, 0, 0);
    $blurred->blurImage(5,3);
    $frame->compositeImage($blurred, imagick::COMPOSITE_OVER, 0, 0);    

    $blurred = clone $frame;
    $blurred->cropImage(320, 20, 0, 160);
    $blurred->blurImage(5,3);
    $frame->compositeImage($blurred, imagick::COMPOSITE_OVER, 0, 160);

    $outputImage->addImage($frame);
}

$outputImage->setImageFormat('gif');
$outputImage->writeImages("output_file.gif", true);

*它可能在技术上不是一个错误...因为代码正在做它被告知要做的事情。这不是任何人真正想要的......