按视觉方式输出每个单独的动画GIF帧

时间:2012-12-07 03:23:18

标签: php frame imagick gmagick

对于一些动画GIF,对于后续帧,唯一存储的数据是与早期帧相比的差异。现在,我刚刚触及(动画)GIF数据结构内部工作的表面,但我相信这是通过称为压缩,帧差异或处置(实际上并不完全确定)来完成的。

对于PHP,使用Gmagick或者Imagick,如何提取每个帧(写出来),这样不仅可以提取这个最小数据,而且可以直观地表示该帧的完整表示?

到目前为止,我和Gmagick一起尝试了以下内容,但遗憾的是无济于事:

// as per this comment:
// http://php.net/manual/en/imagick.setimagedispose.php#95701
// I've tried values in the range 0-4 here:
$img->setImageDispose( 0 ); // $img is animated GIF instance of Gmagick
$frameIndex = 0;
do
{
    $img->setImageIndex( $frameIndex );
    $frame = $img->getImage();
    $frameName = ++$frameIndex . '.gif';
    $frame->writeImage( $frameName, false ); // or:
    // $frame->write( $frameName );
}
while( $img->hasNextImage() );

我也尝试过其他一些事情,例如Gmagick::setImageScene()等等。但是没有任何作用。我只能保存帧差异数据,而不能保存视觉上的数据。

1 个答案:

答案 0 :(得分:0)

我自己发现了如何用Imagick做到这一点:

$frameIndex = 0;
$img = $img->coalesceImages();
foreach( $img as $frame )
{
    $frameName = ++$frameIndex . '.gif';
    $frame->writeImage( $frameName );
}

换句话说,Imagick::coalesceImages()完成了这个伎俩。