【发布时间】:2017-06-20 18:00:16
【问题描述】:
我有几千张图像要处理,所以每一毫秒都很重要。每张图片的大小约为 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"
【问题讨论】:
-
你能分享一张原图给我们玩吗?
-
使用 libjpeg-turbo 重建 Imagemagick。
-
strace convert... 表明它实际上是从 jpeg-turbo 获取库文件。在这种情况下,图像不相关,大小约为 2mb 且大于 1024x768
-
我会添加
-define jpeg:size=2048x1536作为第一个参数,假设您的原件大于 4096x3072,它应该会给您一个简单的 x2 加速。
标签: php imagemagick imagemagick-convert