【问题标题】:How to extract frames of an animated GIF with PHP如何使用 PHP 提取动画 GIF 的帧
【发布时间】:2012-09-15 02:56:42
【问题描述】:

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

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

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

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

【问题讨论】:

  • 有你的限制,你不能。
  • 如您所见,我找到了一个仅使用 PHP 调整每个框架大小的类:gist.github.com/3769812 所以这是可能的,但该类没有很好的文档记录。如果没有人有更简单的解决方案,我会检查并理解所有这些行:s

标签: php frame extract gif animated-gif


【解决方案1】:

我花了一天时间创建一个基于 this one 的类,以实现我想要的仅使用 PHP 的目标!

你可以在这里找到它:https://github.com/Sybio/GifFrameExtractor

感谢您的回答!

【讨论】:

    【解决方案2】:

    好吧,我真的不建议这样做,但这里有一个选项。动画 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

    【讨论】:

    • 我尝试了你的解决方案,但它不起作用:(无论如何谢谢^^
    【解决方案3】:

    我是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"
        );
    });
    

    【讨论】:

      【解决方案4】:

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

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

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

      解析GIF格式的二进制数据。除其他外,您可以使用 unpack()。

      【讨论】:

      • 你将如何使用 unpack 来分解动画 gif 的帧?
      • 我的回答提到“除其他外”,例如常规编程结构、循环、条件。那里的关键字不是“unpack()”,而是 parse.
      • 同意解析是这里的关键。它只是看起来不像unpack() 是获取动画 gif 帧的可行方法,至少从我通过查看它支持的格式可以看出。 php.net/manual/en/function.pack.php
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-25
      • 2014-06-16
      相关资源
      最近更新 更多