Spo*_*pot 5 php imagemagick animated-gif
我试图了解如何从动画GIF中删除帧.
目前我正在尝试这个(作为测试):
$count = 1;
foreach ($_im AS $frame) {
if ($count > 1) { $frame->removeImage(); }
$count++;
}
Run Code Online (Sandbox Code Playgroud)
然而,这似乎是对象中的一切.
来自同事的建议只是创建另一个IM对象,然后将其中的一个famee提取出来,等等.但这似乎非常混乱.
我已经阅读了Imagick一段时间的文档,并尝试了几件事......但我没有设法做你想做的事- 所以,我们至少有两个人找不到干净方式^^
无论如何,我设法删除动画GIF图像的帧的唯一方法是创建一个新的,只包含我不想删除的帧:-(
考虑到我以这种方式加载图像:
// Load the existing image
$image = new Imagick(dirname(__FILE__) . '/animated-gif-source.gif');
Run Code Online (Sandbox Code Playgroud)
(这是一个动画gif,有3帧;我想"删除"第二个).
正如我所说,我发现"删除框架"的方法就是这样:
$new_image = new Imagick();
$i = 1;
foreach ($image as $frame) {
if ($i===1 || $i===3) {
// 3 frames ; we keep the first and third one
// ie, remove the second one
$new_image->addImage($frame->getImage());
}
$i++;
}
Run Code Online (Sandbox Code Playgroud)
所以:
并且,最后,将图像输出到浏览器:
// To directly output to the browser
header('Content-Type: image/gif');
echo $new_image->getImagesBlob();
Run Code Online (Sandbox Code Playgroud)
或者,将其写入文件:
// To write the new image to a file
// Must use writeImages, and not writeImage (multi-frames ! )
$new_image->writeImages(dirname(__FILE__) . '/animated-gif-output.gif', true);
Run Code Online (Sandbox Code Playgroud)
这些输出中的每一个仅包含第一帧和第三帧; 所以,它的工作......
但是,正如你所说,它感觉不舒服:-(
我认为它对大多数图像都可能正常工作; 你可能会遇到大图像的麻烦,但动画GIF通常不是那么大...... 是吗?
其他方式可能是从命令行使用转换......但是......不是很好,我没有找到一种方法来删除框架与这些:-(