想象一下:从动画GIF中删除帧?

时间:2009-07-28 09:09:46

标签: php imagemagick animated-gif

我正在尝试了解如何从动画GIF中删除帧。

目前我正在尝试这个(作为测试):

$count = 1;
foreach ($_im AS $frame) {
    if ($count > 1) { $frame->removeImage(); }
    $count++;        
}

然而,这似乎是对象中的所有东西。

来自同事的建议只是创建另一个IM对象,并将其中的一个famee提取到其中等等。但这似乎非常混乱。

2 个答案:

答案 0 :(得分:5)

我已经浏览了Imagick文档了一段时间,并尝试了几件事......但我没有设法做你想要的事情 - 所以,我们是至少有两个谁找不到干净的方式^^

无论如何,我设法删除动画GIF图像的框架的唯一方法是创建一个新的框架,仅包含我不想删除的框架: - (


考虑到我以这种方式加载图像:

// Load the existing image
$image = new Imagick(dirname(__FILE__) . '/animated-gif-source.gif');

(这是一个动画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++;
}

所以:

  • 制作新图片
  • 遍历orignal one
  • 的帧
  • 如果当前帧是我想保留的帧,则将其复制到新图像


并且,最后,将图像输出到浏览器:

// To directly output to the browser
header('Content-Type: image/gif');
echo $new_image->getImagesBlob();

或者,将其写入文件:

// 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);

这些输出中的每一个仅包含第一帧和第三帧;所以,它的工作......
但是,正如你所说,感觉不好: - (


我认为它对大多数图像都可能正常工作;你可能会遇到大图像的麻烦,但动画GIF通常不是那么大...... 是吗?


其他方式可能是从命令行使用转换...但是......不是那么好,我没有找到一种方法来删除那些的框架: - (

答案 1 :(得分:2)

我只使用命令行实用程序进行IM。

转换srcImage.gif [0] dstImage.gif

除非我忘了一个选项,否则应该这样做。

[0]引用动画gif的第一帧。