如何使用Gmagick在静态图像中展平动画GIF

时间:2013-05-27 05:59:32

标签: php animated-gif gmagick

我想要做的只是在静态图像中保存动画GIF的第一帧(非动画gif)。

使用Gmagick 1.1.2RC1和GraphicMagick 3.1.18

我阅读了很多关于它的帖子。有人说它在以前的Gmagick版本中有效,但在新版本中却没有。

这是我目前的测试代码:

public function testAnimatedGifFrame()
{
    $testAnimGif = $this->assets.'/animated.gif';

    $im = new \Gmagick($testAnimGif);
    $frameNumber = $im->getNumberImages();

    $this->assertEquals(47, $frameNumber, 'The number of frame for the animated GIF should be 47');

    // Select the first frame and save it
    $frameIndex = 0;
    $img = $im->coalesceImages();
    foreach ($img as $frame) {
        die('here');
        $frameName = ++$frameIndex . '.gif';
        $frame->writeImage( $frameName );
    }
}

动画GIF由47帧组成,但在使用coalesceImages()时,脚本永远不会进入foreach循环(它永远不会死亡)。

不确定我在这里错过了什么。

1 个答案:

答案 0 :(得分:0)

对于那些希望像我一样使用Imagick或Gmagick来做的人。

只需将其另存为JPG和BAM!

public function testAnimatedGifFrame()
{
    $testAnimGif = $this->assets.'/animated.gif';
    $singleFrame = $this->assets.'/test_single_frame.jpg';

    $im = new \Gmagick($testAnimGif);
    $frameNumber = $im->getNumberImages();

    $this->assertEquals(47, $frameNumber, 'The number of frame for the animated GIF should be 47');

    // Save the image as JPG to disable the animation
    $im->setImageFormat('JPG');
    $im->writeImage($singleFrame);
    $im->destroy();
}

如果您想保存动画的最后一张图片而不是第一张图片,则只需在$im = $im->flattenImages();之前添加$im->setImageFormat('JPG');

我希望这会对你们中的一些人有所帮助;)