php - ImageMagick 单个转换命令性能

标签 php imagemagick imagemagick-convert

我有几千张图片需要处理,所以每一毫秒都很重要。每张图片的大小约为 2-3Mb。

提供给转换器的源文件: 图片.jpg

要从源中生成的文件:

orig_image.jpg      // original image
1024x768_image.jpg  // large image
250x250_image.jpg   // thumbnail 1
174x174_image.jpg   // thumbnail 2

在浏览有关 imagemagick 转换性能的不同主题时,我感觉对于每个图像大小,单个命令应该比单独转换快得多。还提到了内存利用率作为性能提升。 ( ImageMagick batch resizing performance )

多命令转换(每个命令通过 php 的 exec() 循环运行):

convert "image.jpg" \
    -coalesce -resize "1024x768>" +repage "1024x768_image.jpg"

convert "1024x768_image.jpg" \
    -coalesce \
    -resize "250x250>" \
    +repage \
    -gravity center \
    -extent "250x250" "250x250_image.jpg"

convert "1024x768_image.jpg" \
    -coalesce \
    -resize "174x174>" \
    +repage \
    -gravity center \
    -extent "174x174" "174x174_image.jpg"

mv image.jpg orig_image.jpg

包含 ImageMagicks mpr 的单个命令转换:

convert "image.jpg" -quality 85 -colorspace rgb -coalesce \
    -resize "1024x768>" \'
    -write "1024x768_image.jpg" \
    -write mpr:myoriginal +delete \
    mpr:myoriginal -coalesce \
    -resize "250x250>" \
    -gravity center \
    -extent "250x250" \
    -write "250x250_image.jpg" +delete \
    mpr:myoriginal -coalesce \'
    -resize "174x174>" \
    -gravity center \
    -extent "174x174" \
    -write "174x174_image.jpg"

性能测试后的结果有些出乎意料。循环中的单个命令转换在 62 秒内完成,而多个命令转换仅在 16 秒内执行?

# convert -version
Version: ImageMagick 7.0.2-1 Q8 i686 2017-02-03 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2016 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: Cipher DPC HDRI OpenMP
Delegates (built-in): bzlib freetype jng jpeg lzma png tiff wmf xml zlib

还安装了 libjpeg-turbo jpg 处理库,但我无法判断(不知道如何检查)ImageMagic 正在使用它还是旧的 libjpeg。

关于如何加快图像转换过程的任何想法?

编辑: 不知道如何在 stackoverflow 上正确格式化它,但我只是注意到单行命令有一个参数“-colorspace rgb”,而多行命令没有,这实际上会导致如此奇怪的结果,其中多个命令的处理速度更快。

删除了“-colorspace rgb”参数,此后 MPR 转换版本效果最佳,并进一步提升了性能。

总而言之,我最终使用了这个命令:

// MPR
convert "orig_image.jpg" -quality 80 -coalesce \
    -resize "1024x768>" \
    -write 1024x768_image.jpg \
    -write mpr:myoriginal +delete \
    mpr:myoriginal -resize "250x250>" \
    +repage -gravity center -extent "250x250" \
    -write "250x250_image.jpg" \
    -write mpr:myoriginal +delete \
    mpr:myoriginal -coalesce -resize "174x174>" \
    +repage -gravity center -extent "174x174" \
    -write "174x174_image.jpg"

最佳答案

您没有使用 jpeg 加载时收缩,这将提供一个简单的加速。

jpeg 库有一个巧妙的功能,它可以让您以 1/2、1/4 或 1/8 的全分辨率解压缩。由于 jpg 的内部工作方式,1/8 分辨率特别快。

要在 convert 中利用这一点,您需要向 jpeg 加载器提示您需要特定尺寸的图像。为避免锯齿,您应该要求图像至少比您的目标尺寸大 200%。

在这台机器上,我看到:

$ vipsheader image.jpg 
image.jpg: 5112x3470 uchar, 3 bands, srgb, jpegload
$ time convert image.jpg -resize 1024x768 1024x768_image.jpg
real    0m0.405s
user    0m1.896s
sys 0m0.068s

如果我设置加载时收缩提示,它会快 2 倍:

$ time convert -define jpeg:size=2048x1536 image.jpg -resize 1024x768 1024x768_image.jpg
real    0m0.195s
user    0m0.604s
sys 0m0.016s

对于非常大的 jpg 文件,您会看到显着的加速。

您还可以考虑使用另一个缩略图。 vipsthumbnail ,例如,又快了一点:

$ time vipsthumbnail image.jpg -s 1024x768 -o 1024x768_image.jpg
real    0m0.111s
user    0m0.132s
sys 0m0.024s

尽管实时时间仅下降了 2 倍,但用户时间却下降了 5 倍左右。这使得使用 gnu parallel 运行很有用。例如:

parallel vipsthumbnail image.jpg -s {} -o {}_image.jpg ::: \
    1024x768 250x250 174x174

关于php - ImageMagick 单个转换命令性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42022982/

相关文章:

php - 跟踪页面刷新时正在查看哪个选项卡

PHP 如何检查是否需要关闭 MySQLi 查询?

linux - ImageMagick 没有解码委托(delegate)

imagemagick - 如何检查 libpng 版本

imagemagick - 如何将没有颜色的图像批量转换为灰度?

php - 查找并替换服务器上的文件夹名称

ruby-on-rails-3 - 由于某种原因未创建 Rails CarrierWave 版本

imagemagick - 如何使用 ImageMagick 转换工具水平合并两个半图像,创建 Split View?

bash - 需要裁剪+调整 ~300000 个文件。运行时间 = 4 天以上。我怎样才能加快我的 bash 脚本?

php - PHP错误.htaccess限制文件夹深度