我搜索了很长时间如何用PHP从动画GIF中提取帧...不幸的是我刚刚找到了如何获得它们的持续时间......
我真的需要提取GIF帧及其持续时间以在每个帧上应用一些调整大小,旋转等,然后使用已编辑的帧重新生成GIF!
我不想使用任何软件,外部库(如ImageMagick),只需PHP:事实上我需要允许我的班级http://phpimageworkshop.com/使用动画GIF。
如果您有任何想法,我正在听你^^!
答案 0 :(得分:22)
答案 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()等等。