我有几千个图像要处理,所以每毫秒计数.每张图片的大小约为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
包含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库有一个简洁的功能,它可以让你以全分辨率,1 / 2,1 / 4或1/8进行解压缩.由于jpg在内部工作的方式,1/8分辨率特别快.
要在转换中利用它,您需要提示您需要特定大小的图像的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
$time convert -define jpeg:size=2048x1536 image.jpg -resize 1024x768 1024x768_image.jpg
real 0m0.195s
user 0m0.604s
sys 0m0.016s
你也可以考虑另一个缩略图.例如,vipsthumbnail
再次快一点:
$time vipsthumbnail image.jpg -s 1024x768 -o 1024x768_image.jpg
real 0m0.111s
user 0m0.132s
sys 0m0.024s
虽然实时时间仅下降了2倍,但用户时间却下降了5倍左右.这使得与gnu并行运行很有用.例如:
parallel vipsthumbnail image.jpg -s {} -o {}_image.jpg ::: \
1024x768 250x250 174x174
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。