【问题标题】:Make an animated GIF with PHP's ImageMagick API使用 PHP 的 ImageMagick API 制作动画 GIF
【发布时间】:2012-02-23 17:11:58
【问题描述】:

我可以在我的操作系统中轻松完成

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

但我在 PHP API 中找不到如何执行此操作。不需要调整大小或任何东西,我只有一组需要动画的帧。

【问题讨论】:

  • 对于初学者,您可以使用execution operator(反引号):`convert -delay 1/1 -loop 0 *.gif animated.gif`
  • exec() 但这很混乱,我已经说过我想使用 API
  • 是的,它更多的是评论而不是实际答案。说明书是怎么说的?我认为它应该提供一个界面。
  • 我一直在查看 php.net 手册,由于函数名称不同,它并不是很有帮助。
  • 检查user contributed note here(函数名有误导性),它不是最好的代码,但可以开始。到目前为止,我还没有找到 delayloop 。另见glob

标签: php imagemagick animated-gif


【解决方案1】:

虽然我不是 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 中的内容。

希望这与您所追求的有些相符。

【讨论】:

  • +1 写得很好,但它似乎不起作用。我正在制作一个文件数组,然后使用您完成的代码(以及此处的最后一个示例php.net/manual/en/imagick.addimage.php)遍历每个文件,但我看到的只是最后一张图片。即使我设置为 500 毫秒并等待。我想循环,也找不到。
  • 啊,如果您使用 writeImages 而不是 echo,则此工作。我宁愿回应。有什么想法吗?
  • 我的错,我忘记了一个重要的细节,编辑答案:) getImagesBlob() 方法对应于将 writeImages() 中的第二个参数设置为 true。这会将动画 GIF 作为 blob 回显,这应该可以工作。
  • 值得一提的是 writeImages() 在 Imagick 3 中似乎不起作用。
  • 在这方面发送了一些时间,当我使用 morphImages() 时,我遇到了同样的问题,即只看到最后一张图像 .... 解决方案是加载所有图像后,我需要调用 @987654325 @ 回到列表中的第一张图片...希望这有助于节省很多时间。从这篇文章中喜欢它geeksforgeeks.org/php-imagick-morphimages-function
猜你喜欢
  • 1970-01-01
  • 2013-01-25
  • 2012-08-23
  • 2014-02-28
  • 2016-12-14
  • 1970-01-01
  • 2017-11-22
  • 2017-11-17
  • 2012-12-11
相关资源
最近更新 更多