但是常规加水印的方法对GIF动画图片就会产生问题,加上水印后,GIF 图片就不动了。

那么有没有办法给GIF动画图片加上水印后,保持原有的动画效果呢(效果图在末了)?

下面就给大家详细的说说:

phpgif动画用PHP代码给GIF动绘图片加水印坚持原有的动画后果 Vue.js

一、首先分别下载3个开源的php类库

imageworkshop

composer 地址:https://packagist.org/packages/sybio/image-workshop

GifFrameExtractor

composer 地址:https://packagist.org/packages/sybio/gif-frame-extractor

gifcreator

composer 地址:https://packagist.org/packages/sybio/gif-creator

二、准备好gif图片

三、紧张代码

1.你的GIF地址

$gifPath = '123.gif';

2.获取gif宽和高(后面有用)

$imginfo=getimagesize($gifPath);

3.判断图片是否是GIF动画图

if (GifFrameExtractor::isAnimatedGif($gifPath))

4.将GIF图片开释成一帧一帧的图

$gfe = new GifFrameExtractor();

$frames = $gfe->extract($gifPath,true);

5.初始化水印

$watermarkLayer = ImageWorkshop::initTextLayer('代码庸医', 'simkai.ttf', 15);

我这里是直接用字作为水印,也可以用图片作为水印,方法如下:

$watermarkLayer = ImageWorkshop::initFromPath('你的水印图片地址');

6.给每一个图片帧加上水印

foreach ($frames as $frame)

{

$frameLayer = ImageWorkshop::initFromResourceVar($frame['image']);

$frameLayer->resizeInPixel($imginfo[0], $imginfo[1], true); // 设置图片高度宽度

$frameLayer->addLayerOnTop($watermarkLayer, 20, 20, 'LB'); // 水印位置

$retouchedFrames[] = $frameLayer->getResult();

}

7.合并每一帧天生加上水印的GIF图片

$gc = new GifCreator();

$gc->create($retouchedFrames, $gfe->getFrameDurations(), 0);

file_put_contents('pic/newgif.gif', $gc->getGif());

下面是整体代码:

末了的效果图:

天生前

天生后