首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >php处理gif,拆帧,倒放神器-gif-endec

php处理gif,拆帧,倒放神器-gif-endec

作者头像
仙士可
发布2019-12-19 14:33:17
发布2019-12-19 14:33:17
1.9K0
举报
文章被收录于专栏:仙士可博客仙士可博客

今天,朋友在群里发了张这样的图片:

而正常情况是这样的:

在很多情况下,倒放gif能给我们更多的乐趣,例如下面的图:

看起来是不是很有趣

那么,用php怎么实现呢?

gif-endec

接下来就介绍下这个开源项目:gif-endec

地址:https://github.com/stil/gif-endec

可通过composer安装

代码语言:javascript
复制
composer require stil/gif-endec

实现gif倒放很简单,以第一张图举例:

代码语言:javascript
复制
<?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');

就这样,我们就得到了一张倒放的图:

同时,我们可以倒放之后再顺放一遍,例如上面的吃棉花糖图:

代码语言:javascript
复制
<?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');

哈哈哈哈哈

本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/03/01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • gif-endec
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档