我有几千张图片需要处理,因此每毫秒都很重要。每张图片的大小约为2-3Mb。
提供给转换器的源文件: image.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
单个命令转换,包含ImageMagick的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"
-define jpeg:size=2048x1536
添加为第一个参数,这应该可以让您轻松加速两倍,假设您的原始图像大于4096x3072。 - jcupitt