使用exec调整图像大小并在PHP中进行转换


Resizing image with exec and convert in PHP

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

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

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

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

在命令行上调用此代码可以很好地工作,但在Web服务器上执行它会给我以下错误消息:

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

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

PHP版本为5.2.17。ImageMagick版本为:6.6.0-4 2012-04-26

有人遇到过类似的问题,可以帮我解决吗?

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

libgomp: Thread creation failed: Resource temporarily unavailable

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

putenv('MAGICK_THREAD_LIMIT=1');

我把这段代码放进了我的init脚本中,现在它运行得很好!

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

然而,对于PNG输出,-quality设置与JPEG的质量设置(只是从0100的整数)非常不同。

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

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

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

    • 0为零
    • 1是"sub"
    • 2为"向上"
    • 3为"平均"
    • 4是"Paeth",并且
    • 5表示"自适应"

实际上,这意味着:

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

也许你想根据这些信息重新访问你的-quality 90设置。

也许你已经意识到了。在这种情况下:我为"向唱诗班说教"道歉。:-)