克隆、模糊、裁剪和合成动画 Gif
Clone, Blur, crop and composite 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();
在每一帧之后,但这似乎也不起作用。
任何帮助将不胜感激,谢谢
在Imagick的foreach实现中好像有一个'bug'*。当您这样做时:
foreach ($animationImagick as $frameImagick) {
//whatever
}
$frameImagick
对象实际上不是单个帧,而是整个动画的副本,内部迭代器设置为动画的适当帧。
因此,当您将 'frame image' 合成回原始图像时,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);
*从技术上讲,这可能不是错误......因为代码正在执行它被告知要做的事情。这不是任何人真正想要的....
我正在尝试为我的网站从 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();
在每一帧之后,但这似乎也不起作用。
任何帮助将不胜感激,谢谢
在Imagick的foreach实现中好像有一个'bug'*。当您这样做时:
foreach ($animationImagick as $frameImagick) {
//whatever
}
$frameImagick
对象实际上不是单个帧,而是整个动画的副本,内部迭代器设置为动画的适当帧。
因此,当您将 'frame image' 合成回原始图像时,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);
*从技术上讲,这可能不是错误......因为代码正在执行它被告知要做的事情。这不是任何人真正想要的....