使用PHP的ImageMagick API制作动画GIF

6

我可以在我的操作系统中轻松地做到这一点。

convert -delay 1/1 -loop 0 *.gif animated.gif

但我在PHP API中找不到如何做到这一点。无需调整大小或任何其他操作,我只需使用一组帧进行动画处理。


首先,您可以使用执行运算符(反引号):\convert -delay 1/1 -loop 0 *.gif animated.gif``。 - hakre
或者使用exec(),但那样会很混乱,而我已经声明我想要使用API。 - joedborg
是的,这更像是一条评论而不是实际答案。手册上说了什么?我想它应该提供一个接口。 - hakre
我一直在浏览php.net的手册,但它并不是很有帮助,因为函数名称不同。 - joedborg
查看用户贡献的注释(函数名有误导性),这不是最好的代码,但可以作为起点。到目前为止我还没有找到delayloop。同时也请参考glob - hakre
1个回答

21

虽然我不是PHP专家,但我知道这个问题并不太难。您想要做的是创建一个Imagick对象,您可以将帧附加到该对象上。对于每个帧,您都可以更改一些参数,例如时间等。

假设您使用的是从基本Web表单上传的图像,我编写了一个基本示例,循环遍历上传名称为“image0”的图像,其中“0”逐渐增加至包含的文件数。您当然可以通过在固定文件名上使用相同的方法或其他方式添加图像。

$GIF = new Imagick();
$GIF->setFormat("gif");

for ($i = 0; $i < sizeof($_FILES); ++$i) {
    $frame = new Imagick();
    $frame->readImage($_FILES["image$i"]["tmp_name"]);
    $frame->setImageDelay(10);
    $GIF->addImage($frame);
}

header("Content-Type: image/gif");
echo $GIF->getImagesBlob();

这个示例创建了一个Imagick对象, 这将成为我们的GIF。然后遍历上传到服务器的文件, 首先读取每一个文件(请记住,这种技术依赖于我上面描述的图像命名方式), 其次获取延迟值, 然后将其附加到要生成的GIF中。这就是基本想法,它可以产生你想要的效果 (希望如此)。

但是有很多可以调整的地方,您的配置可能会有所不同。我经常发现php.net Imagick API参考文档有点糟糕,但它仍然非常有用,我偶尔用它来参考标准ImageMagick。

希望这些内容能够满足您的需求。


你的答案写得不错,但好像并没有起作用。我正在创建一个文件数组,并使用你编写的代码(以及这里最后一个示例http://www.php.net/manual/en/imagick.addimage.php)循环处理每个文件,但是我只看到了最后一个图像。即使我设置为500ms并等待,仍然如此。我想要循环处理,但是找不到方法。 - joedborg
啊,如果你使用writeImages而不是echo,这个工作就可以了。但我更喜欢echo。有什么想法吗? - joedborg
我的错,我忘记了一个重要的细节,在编辑答案 :) getImagesBlob() 方法对应于将 writeImages() 的第二个参数设置为 true。这将回显动画 GIF 作为 blob,应该可以正常工作。 - fredrikekelund
这里值得一提的是,在Imagick 3中,writeImages()似乎无法正常工作。 - joedborg
我在这个问题上花了一些时间,当我使用morphImages()函数时,只能看到最后一张图片......解决方案是在加载完所有图片后,需要调用$GIF->resetIterator();函数以回到列表中的第一张图片......希望这能帮助节省别人大量的时间。 我是从这篇文章中找到这个解决方案的https://www.geeksforgeeks.org/php-imagick-morphimages-function/ - Ryan H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接