2

我正在尝试通过以下方式在 PHP 中转换 png 图像:

exec($cmd, $output, $return_code);

其中 $cmd 包含以下代码行:

/usr/bin/convert 'images/original/Id1741.png' -thumbnail x200 -quality '90' './cache/a3b84c5931d9619d12a9e244a310cb17_h200.png'

在命令行上调用此代码可以正常工作,但在网络服务器上执行它会给我以下错误消息:

Tried to execute : convert 'images/original/Id1741.png' -thumbnail x200 -quality '90' './cache/a3b84c5931d9619d12a9e244a310cb17_h200.png', return code: 1, output: Array()

如果我删除缩略图选项,该命令在网络服务器上执行得很好,但显然它不会调整任何东西的大小。所以我猜这不是权限或设置的问题。

PHP 版本是5.2.17. ImageMagick 版本是:6.6.0-4 2012-04-26

任何人都遇到过类似的问题,可以帮助我解决这个问题吗?

4

2 回答 2

2

好的,我终于把它修好了。将 stderr 重定向到文件后,我发现以下错误:

libgomp: Thread creation failed: Resource temporarily unavailable

似乎我的主机 1&1 最近升级了 ImageMagick 版本,它显然比旧版本使用了更多的内存(至少主机是这么说的)。他们建议限制 ImageMagick 创建的线程数量:

putenv('MAGICK_THREAD_LIMIT=1');

我将此代码放入我的初始化脚本中,现在它工作得很好!

于 2012-08-23T22:31:35.727 回答
1

您正在转换为 PNG,但您正在设置-quality 90(似乎只是类似于JPEG质量设置)。

但是,对于 PNG 输出,该-quality设置与 JPEG 的质量设置非常不同(它只是一个从0到的整数100)。

对于 PNG,它由两个个位数组成:

  • 第一个数字(十位)(很大程度上)是 zlib 压缩级别,它可能从09
    (但是 的设置0有一个特殊的含义:当你使用它时,你会得到 Huffman 压缩,而不是 zlib 压缩级别 0。这通常更好......奇怪但真实。)

  • 第二位是PNG数据编码过滤器类型(压缩前):

    • 0 是无,
    • 1 是“子”,
    • 2是“向上”,
    • 3 是“平均”,
    • 4 是“Paeth”,并且
    • 5是“自适应”。

实际上,这意味着:

  • 对于具有纯色序列的插图,“无”过滤器 ( -quality 00) 通常是最合适的。
  • 对于自然景观的照片,“自适应”过滤 ( -quality 05) 通常是最好的。

也许您想-quality 90根据此信息重新访问您的设置。

也许你已经意识到了。在这种情况下:我为“向合唱团讲道”道歉。:-)

于 2012-08-23T13:49:13.020 回答