如何使用PHP提取动画GIF的帧
我搜索了很长一段时间如何提取帧从动画GIF与PHP。。。不幸的是,我刚刚发现如何获得他们的持续时间 我真的需要提取GIF帧及其持续时间,以便对每个帧应用一些调整大小、旋转等,然后使用编辑的帧重新生成GIF 我不想使用任何软件、外部库(比如ImageMagick),只想使用PHP:事实上,我需要允许我的类使用动画GIF 如果你有任何想法,我在听你说^^ 我不想使用任何软件、外部库(如ImageMagick) 好吧,祝你好运,因为Zend引擎导出到PHP运行时的90%的功能都来自库 如果你有任何想法,我在听你说^^如何使用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格式解析二进制数据。您可以使用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帧的可行方法,至少从我通过查看它支持的格式可以看出这一点。我试过你的解决方案,但没有成功:(无论如何,谢谢^^