如何使用PHP提取动画GIF的帧

如何使用PHP提取动画GIF的帧,php,frame,extract,gif,animated-gif,Php,Frame,Extract,Gif,Animated Gif,我搜索了很长一段时间如何提取帧从动画GIF与PHP。。。不幸的是,我刚刚发现如何获得他们的持续时间 我真的需要提取GIF帧及其持续时间,以便对每个帧应用一些调整大小、旋转等,然后使用编辑的帧重新生成GIF 我不想使用任何软件、外部库(比如ImageMagick),只想使用PHP:事实上,我需要允许我的类使用动画GIF 如果你有任何想法,我在听你说^^ 我不想使用任何软件、外部库(如ImageMagick) 好吧,祝你好运,因为Zend引擎导出到PHP运行时的90%的功能都来自库 如果你有任何想法

我搜索了很长一段时间如何提取帧从动画GIF与PHP。。。不幸的是,我刚刚发现如何获得他们的持续时间

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

我不想使用任何软件、外部库(比如ImageMagick),只想使用PHP:事实上,我需要允许我的类使用动画GIF

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

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

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

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


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

好吧,我不建议这样做,但这里有一个选项。动画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%确定重新连接图像的具体细节,但这里有一个例子。

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

你可以在这里找到它:

谢谢你的回答

我是library的作者,它比
Sybio/GifFrameExtractor
library从接受的答案中解码gif要快得多(大约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"
    );
});

根据您的限制集,您不能这样做。正如您所看到的,我发现一个类只使用PHP调整每个帧的大小:因此这是可能的,但该类没有很好的文档记录。如果没有人有更简单的解决方案,我会检查并理解所有这些行:sHow你会使用unpack来分解动画gif的帧吗?我的回答提到“除其他外”,比如常规编程结构、循环和条件。这里的关键字不是“unpack()”,而是parse。我同意这里的关键是解析。它看起来不像是一种获取动画gif帧的可行方法,至少从我通过查看它支持的格式可以看出这一点。我试过你的解决方案,但没有成功:(无论如何,谢谢^^