我搜索了很久如何使用PHP从动态GIF中提取帧...
不幸的是,我只找到了如何获取它们的持续时间...
我真的需要提取GIF帧及其持续时间以对每个帧进行调整大小、旋转等操作,然后重新生成编辑过的GIF!
我不想使用任何软件、外部库(如ImageMagick),只想用PHP:实际上我需要让我的类 http://phpimageworkshop.com/ 能够处理动态GIF。
如果你有任何想法,我在听着你 ^^!
我搜索了很久如何使用PHP从动态GIF中提取帧...
不幸的是,我只找到了如何获取它们的持续时间...
我真的需要提取GIF帧及其持续时间以对每个帧进行调整大小、旋转等操作,然后重新生成编辑过的GIF!
我不想使用任何软件、外部库(如ImageMagick),只想用PHP:实际上我需要让我的类 http://phpimageworkshop.com/ 能够处理动态GIF。
如果你有任何想法,我在听着你 ^^!
嗯,我不太建议这样做,但这是一个选项。动画gif实际上只是由分隔符"\x00\x21\xF9\x04"连接在一起的一系列gif图像。因此,您只需将图像作为字符串导入PHP,运行explode,并循环遍历数组运行转换即可。代码可能如下所示。
$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);
我不完全确定重新连接图像的具体方法,但是这里有关于动画GIF文件格式的维基百科页面(点击跳转)。
substr_count($image_string, "\x00\x21\xF9\x04")
,这比使用类似Imagick这样的工具将整个图像读入内存更快,内存占用也更小。谢谢! - SebSybio/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"
);
});
unpack()
似乎不是获取动画 GIF 帧的可行方法。http://php.net/manual/en/function.pack.php - Chris Henry