2013-05-27 107 views
0

我想要做的僅僅是在靜態圖像中保存動畫GIF的第一幀(非動畫gif)。如何使用Gmagick在靜態圖像中展示動畫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循環中獲取(它永遠不會死亡)。

不知道我在這裏錯過了什麼。

+0

創建使用'GD'庫的gif副本會將gif保存爲靜態圖像,因爲您需要一個庫來調整w/frames的大小。 – Class

+0

你確定$ img是一個數組嗎?如果它不是,foreach不會去「內部」。 – Uberfuzzy

+0

另外,你確定它已經過去了嗎? – Uberfuzzy

回答

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->setImageFormat('JPG');

我希望這將幫助一些您添加$im = $im->flattenImages();;)

相關問題