如何用PHP提取动画GIF的帧

时间:2012-09-23 10:42:12

标签: php frame extract gif animated-gif

我搜索了很长时间如何用PHP从动画GIF中提取帧...不幸的是我刚刚找到了如何获得它们的持续时间......

我真的需要提取GIF帧及其持续时间以在每个帧上应用一些调整大小,旋转等,然后使用已编辑的帧重新生成GIF!

我不想使用任何软件,外部库(如ImageMagick),只需PHP:事实上我需要允许我的班级http://phpimageworkshop.com/使用动画GIF。

如果您有任何想法,我正在听你^^!

4 个答案:

答案 0 :(得分:22)

我花了一天时间基于this one创建一个类来实现我想要的只使用PHP!

您可以在此处找到它:https://github.com/Sybio/GifFrameExtractor

感谢您的回答!

答案 1 :(得分:4)

嗯,我真的不建议这样做,但这是一个选项。 GIF动画实际上只是一些由分隔符“\ x00 \ x21 \ xF9 \ x04”连接在一起的GIF。知道这一点,你只需将图像作为字符串拉入PHP,运行爆炸,然后遍历运行转换的数组。代码可能看起来像这样。

$image_string = file_get_contents($image_path);

$images = explode("\x00\x21\xF9\x04", $image_string);

foreach( $images as $image ) {
  // apply transformation
}

$new_gif = implode("\x00\x21\xF9\x04", $images);

我不是100%确定重新连接图片的具体细节,但这里是wikipedia page regarding the file format of animated GIFs

答案 2 :(得分:2)

我是https://github.com/stil/gif-endec库的作者,它在解码GIF时明显比接受答案的Sybio/GifFrameExtractor库快得多(大约2.5倍)。它的内存使用量也较少,因为它允许您在解码时处理一帧接一帧,而无需一次将所有内容加载到内存中。

小代码示例:

<?php
require __DIR__ . '/../vendor/autoload.php';

use GIFEndec\Events\FrameDecodedEvent;
use GIFEndec\IO\FileStream;
use GIFEndec\Decoder;

/**
 * Open GIF as FileStream
 */
$gifStream = new FileStream("path/to/animation.gif");

/**
 * Create Decoder instance from MemoryStream
 */
$gifDecoder = new Decoder($gifStream);

/**
 * Run decoder. Pass callback function to process decoded Frames when they're ready.
 */
$gifDecoder->decode(function (FrameDecodedEvent $event) {
    /**
     * Write frame images to directory
     */
    $event->decodedFrame->getStream()->copyContentsToFile(
        __DIR__ . "/frames/frame{$event->frameIndex}.gif"
    );
});

答案 3 :(得分:1)

  

我不想使用任何软件,外部库(如ImageMagick)

好吧,祝你好运,因为Zend Engine导出到PHP运行时的90%的功能来自库。

  

如果您有任何想法,我正在听你^^!

以GIF格式解析二进制数据。你可以使用unpack()等等。