gif图片倒放php_php处理gif,拆帧,倒放神器-gif-endec

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

fd8d7859ef2e98464afeb37cfdecd7dd.gif

而正常情况是这样的:

0ad77569c9be2dbb85b08e8e5c27e7e9.gif

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

a5a1975a61f0716e936a7ee96fe399e8.png

ec7217a32039997f154f5dfee9de0e1c.gif

ea17e74d9e1567a2d2e873272eaae7f6.gif

e8ff8bfda7432265d6250c669f6000ff.gif

d0a884b234507164bfdf4202ff778180.png看起来是不是很有趣

那么,用php怎么实现呢?

gif-endec

接下来就介绍下这个开源项目: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');

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

ed6612bee8d07ae792ff4fce42f86b22.png

同时,我们可以倒放之后再顺放一遍,例如上面的吃棉花糖图:<?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');

bbb447583e11196a182bc0b11848f750.gif

哈哈哈哈哈

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值