php处理gif,拆帧,倒放神器-gif-endec
【摘要】 今天,朋友在群里发了张这样的图片:而正常情况是这样的:在很多情况下,倒放gif能给我们更多的乐趣,例如下面的图:看起来是不是很有趣那么,用php怎么实现呢?gif-endec接下来就介绍下这个开源项目:gif-endec地址:https://github.com/stil/gif-endec可通过composer安装composer require stil/gif-endec复制实现gif...
今天,朋友在群里发了张这样的图片:
而正常情况是这样的:
在很多情况下,倒放gif能给我们更多的乐趣,例如下面的图:
看起来是不是很有趣
那么,用php怎么实现呢?
gif-endec
接下来就介绍下这个开源项目:gif-endec
地址:https://github.com/stil/gif-endec
可通过composer安装
composer require stil/gif-endec
复制
实现gif倒放很简单,以第一张图举例:
<?php
/**
* Created by PhpStorm.
* User: Tioncico
* Date: 2019/3/1 0001
* Time: 10:04
*/
include "./vendor/autoload.php";
use GIFEndec\Color;
use GIFEndec\Encoder;
use GIFEndec\Frame;
use GIFEndec\IO\FileStream;
use GIFEndec\Events\FrameDecodedEvent;
use GIFEndec\Decoder;
//解析gif图片
//打开gif图片文件流
$gifStream = new FileStream("./Temp/1.gif");
//创建解析对象
$gifDecoder = new Decoder($gifStream);
$gifDecoder->decode(function (FrameDecodedEvent $event) {
$paddedIndex = str_pad($event->frameIndex, 3, '0', STR_PAD_LEFT);
//将每一帧存入指定文件夹
$event->decodedFrame->getStream()->copyContentsToFile(
__DIR__ . "/frames/frame{$paddedIndex}.gif"
);
});
//创建gif生成对象
$gif = new Encoder();
$gifFilesArr = glob(__DIR__ . '/frames/frame*.gif');
//由于一开始生成的时候,是通过分析图片帧来的,而且是顺序读出,如果需要倒序,必须要先倒序下数组
$gifFilesArr = array_reverse($gifFilesArr);
foreach ($gifFilesArr as $file) {
$stream = new FileStream($file);
$frame = new Frame();
$frame->setDisposalMethod(1);
$frame->setStream($stream);
$frame->setDuration(1); //每个图片的停留时间,1为0.01秒
$frame->setTransparentColor(new Color(255, 255, 255));
$gif->addFrame($frame);
}
$gif->addFooter();
// Copy result animation to file
$gif->getStream()->copyContentsToFile('skateboarder/test.gif');
复制
就这样,我们就得到了一张倒放的图:
同时,我们可以倒放之后再顺放一遍,例如上面的吃棉花糖图:
<?php
/**
* Created by PhpStorm.
* User: Tioncico
* Date: 2019/3/1 0001
* Time: 10:04
*/
include "./vendor/autoload.php";
use GIFEndec\Color;
use GIFEndec\Encoder;
use GIFEndec\Frame;
use GIFEndec\IO\FileStream;
use GIFEndec\Events\FrameDecodedEvent;
use GIFEndec\Decoder;
//解析gif图片
//打开gif图片文件流
$gifStream = new FileStream("./Temp/2.gif");
//创建解析对象
$gifDecoder = new Decoder($gifStream);
$gifDecoder->decode(function (FrameDecodedEvent $event) {
$paddedIndex = str_pad($event->frameIndex, 3, '0', STR_PAD_LEFT);
//将每一帧存入指定文件夹
$event->decodedFrame->getStream()->copyContentsToFile(
__DIR__ . "/frames/frame{$paddedIndex}.gif"
);
});
//创建gif生成对象
$gif = new Encoder();
$gifFilesArr = glob(__DIR__ . '/frames/frame*.gif');
//先倒放,后顺放
$gifFilesArr = array_merge( array_reverse($gifFilesArr),$gifFilesArr);
foreach ($gifFilesArr as $file) {
$stream = new FileStream($file);
$frame = new Frame();
$frame->setDisposalMethod(1);
$frame->setStream($stream);
$frame->setDuration(1); //每个图片的停留时间,1为0.01秒
$frame->setTransparentColor(new Color(255, 255, 255));
$gif->addFrame($frame);
}
$gif->addFooter();
// Copy result animation to file
$gif->getStream()->copyContentsToFile('skateboarder/test3.gif');
复制
哈哈哈哈哈
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)