【问题标题】:PHP Imagick: set a gif animation loop to none?PHP Imagick:将 gif 动画循环设置为无?
【发布时间】:2012-10-09 07:24:57
【问题描述】:

我已经成功地从一个图像目录生成了一个动画 gif。不过,我不知道如何防止它循环播放,它只是继续前进。我想我在 ImageMagick 中找到了设置,但在 Imagick PHP 库中没有看到相应的设置方法。有谁知道它是什么?

【问题讨论】:

  • 嗯,命令行选项是-loop #,其中# 是运行整个操作的次数。在 IMagick 中找不到它,可以尝试使用 setOption() 设置它,看看它是否有效。有一些命令可以设置延迟滴答声和每秒滴答声,但我认为它只是被忽略了。我认为可以很容易地添加到 IMagick 扩展代码中。
  • 其实,它就在那里!查看答案...

标签: php animation gif imagick


【解决方案1】:

我花了一段时间才找到它,因为在 IMagick 文档中错过了它。但是您可以使用 IMagick 设置动画 gif 的循环。

当我查看在正确的 ImageMagick 代码中写出 Netscape Loop 扩展的代码时,它使用了一个名为 iterations 的图像内部变量,尽管在命令行上使用了 -loop。它始终在内部使用迭代,然后一直到 IMagick 代码中。


来自 ImageMagick 代码:coders/gif.c

1689        if ((GetPreviousImageInList(image) == (Image *) NULL) &&
1690                (GetNextImageInList(image) != (Image *) NULL) &&
1691                (image->iterations != 1))
1692              {
1693                /*
1694                  Write Netscape Loop extension.
1695                */
1696                (void) LogMagickEvent(CoderEvent,GetMagickModule(),
1697                   "  Writing GIF Extension %s","NETSCAPE2.0");
1698                (void) WriteBlobByte(image,(unsigned char) 0x21);
1699                (void) WriteBlobByte(image,(unsigned char) 0xff);
1700                (void) WriteBlobByte(image,(unsigned char) 0x0b);
1701                (void) WriteBlob(image,11,(unsigned char *) "NETSCAPE2.0");
1702                (void) WriteBlobByte(image,(unsigned char) 0x03);
1703                (void) WriteBlobByte(image,(unsigned char) 0x01);
1704                (void) WriteBlobLSBShort(image,(unsigned short) image->iterations);
1705                (void) WriteBlobByte(image,(unsigned char) 0x00);
1706              }

查看文档:IMagick::setImageIterations( int $iterations )

设置$iterations = 0 使其无限循环。

帧之间的延迟是使用我相信的刻度格式设置的,使用:

【讨论】:

  • 非常感谢您的帮助!事实证明,在我添加帧之后使用 IMagick::setImageIterations( int $iterations ) 并不能阻止它循环,但是在我运行 Imagick::newImage ( int $cols , int $rows , mixed $background [, string $format ] ) 之后使用它就可以了。
  • @trismi:请记住,除了使用Imagick::writeImages() 或等效的多图像输出命令时,IM 将所有图像都单独存储。当它去写标题时,它可能使用第一张图像上的设置,所以调用必须在第 1 帧上预先进行,就像你说的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2015-06-18
  • 2017-08-23
  • 1970-01-01
相关资源
最近更新 更多