ImageMagick批量调整性能

时间:2012-07-30 18:58:53

标签: imagemagick

convert \
   original.jpg \
  -quality 85 \
  -colorspace rgb \
  -profile /var/tmp/sRGB.icm \
  -strip \
  -profile /var/tmp/sRGB.icm \
  -filter Lanczos \
  -write mpr:17JPCONV1-original \
  +delete \
mpr:17JPCONV1-original -crop '3000x2001+0+491' -resize '190x126!>' -write thumbWide.jpg +delete \
mpr:17JPCONV1-original -crop '2981x2983+8+0' -resize '75x75!>' -write thumbStandard.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '163x163!>' -write hpSmall.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '1024x1019!>' -write jumbo.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '190x189!>' -write articleInline.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '2048x2037!>' -write superJumbo.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '592x589!>' -write tmagArticle.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '3000x2983!>' -write popup.jpg +delete \
mpr:17JPCONV1-original -crop '2981x2983+8+0' -resize '640x640!>' -write square640.jpg +delete \
mpr:17JPCONV1-original -crop '3000x1689+0+647' -resize '3000x1688!>' -write videoSmall.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '503x500!>' -write slide.jpg +delete \
mpr:17JPCONV1-original -crop '2981x2983+8+0' -resize '151x151!>' -write moth.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2001+0+491' -resize '337x225!>' -write hpMedium.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2001+0+491' -resize '395x264!>' -write sfSpan.jpg +delete \
mpr:17JPCONV1-original -crop '3000x1689+0+647' -resize '3000x1688!>' -write videoLarge.jpg +delete \
mpr:17JPCONV1-original -crop '3000x1689+0+647' -resize '511x288!>' -write hpLarge.jpg +delete \
mpr:17JPCONV1-original -crop '2981x2983+8+0' -resize '320x320!>' -write square320.jpg +delete \
mpr:17JPCONV1-original -crop '3000x1689+0+647' -resize '600x338!>' -write articleLarge.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2001+0+491' -resize '3000x2000!>' -write videoThumb.jpg +delete \
mpr:17JPCONV1-original -crop '2981x2983+8+0' -resize '150x150!>' -write thumbLarge.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '533x530!>' -write blog533.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '151x151!>' -write blogSmallInline.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '362x360!>' -write tmagSF.jpg +delete \
mpr:17JPCONV1-original -crop '2981x2983+8+0' -resize '190x190!>' -write filmstrip.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '480x478!>' -write blog480.jpg +delete \
mpr:17JPCONV1-original -crop '3000x2983+0+0' -resize '427x425!>' -write blog427.jpg +delete \
mpr:17JPCONV1-original -crop '2981x2983+8+0' -resize '50x50!>' -write blogSmallThumb.jpg +delete \
mpr:17JPCONV1-original -crop '3000x1401+0+791' -resize '151x70!>' miniMoth.jpg;

我正在尝试使用一个命令从原始文件中生成~30个作物(使用一个命令比使用每个作物的单个命令要快得多)。但是,这需要花费很长时间(约30秒)才能完成。有什么建议加快这个吗? resize命令可以通过OpenCL利用GPU吗?

更新

  • 使用-thumbnail代替-resize改进了一些东西
  • (感谢@A R提示)使用libjpeg-turbo编译ImageMagick也可以将时间缩短20%

3 个答案:

答案 0 :(得分:34)

您应该检查您的ImageMagick安装是否附带OpenCL支持:

convert -list configure | grep FEATURES

如果它(如我的话),你应该看到这样的东西:

FEATURES      HDRI OpenCL

此命令

convert -version 

还应提供有关支持功能的信息。

如果没有,你应该考虑获得编译了OpenCL支持的最新版本的ImageMagick。或者如果你自己从源代码构建软件包,请确保使用OpenCL。


<强>更新

等等哦。还有一个可以帮助您的功能,称为 OpenMP (用于多处理)。

启用OpenMP后,ImageMagick命令可以在系统的所有核心上并行执行。因此,如果你有一个四核系统,并调整图像大小,调整大小发生在4个核心(如果你有超线程,甚至8个核心)。

现在,您还可以使用内置-bench选项使ImageMagick为您的命令运行基准。例如:

convert logo: -resize 500% -bench 10 logo.png
  Performance[1]: 10i 0.689ips 1.000e 14.420u 0:14.510

此命令-resize 500%告诉ImageMagick运行convert命令,将每个方向的内置IM logo:图像缩放500%。 -bench 10部分告诉它在循环中运行相同的命令10次,然后打印性能结果:

  • 由于我没有启用OpenMP,因此我只有一个帖子(Performance[1]:)。
  • 它报告它运行了10次迭代(10i)。
  • 速度接近每秒0.7次迭代(0.689ips)。
  • 用户总计时间为14.420秒。

您应该使用以下命令了解有关资源限制的系统设置方式:

identify -list resource
  File       Area     Memory     Map       Disk    Thread         Time
  --------------------------------------------------------------------
   192    4.295GB       2GiB    4GiB  unlimited         1    unlimited

您可以看到我当前系统的设置(默认值 - 我没有调整它们)。列标题中的每个关键字都可以使用pimp系统。

  • files定义了ImageMagick将使用的最大并发打开文件数。
  • memorymapareadisk资源限制在字节中定义。要将设置它们设置为不同的值,您可以使用SI前缀,.e.g 500MB)。

如果我 在此系统上使用 OpenMP for ImageMagick,我可以运行

convert -limit thread 2

为了启用2个并行线程,重新运行基准测试并查看它是否真的有所作为,如果是,那么多少。我可以将限制设置为4或甚至8并重复练习......


最后,您可以尝试使用ImageMagick像素缓存的内部格式,称为MPC(Magick像素缓存)。有人说,对于大型操作,这里的性能有所改善,但我没有个人经验。

首先将基本图片转换为MPC:

convert input.jpeg input.mpc

然后才开始运行:

convert input.mpc [...your long-long-long list of crops...]

并查看这是否能够为您节省大量时间。

很可能你甚至可以使用这种MPC格式“内联”(使用特殊的mpr:表示法),类似于你应用使用mpr:格式的技巧(内存程序寄存器) )将图像读入指定的内存寄存器。但我从来没有尝试过这种技术来解决现实问题,所以我不能说它在现实生活中是如何运作的。


更新2:

还有一个想法:

首先检查您的确切ImageMagick版本:运行convert -version

如果您的ImageMagick在其版本字符串中有Q16(或甚至Q32Q64)(意思是,其内部流程会将所有图片视为具有16位通道深度,这需要与Q8相比,内存是双倍的 - 这是现在的默认值 - 你可以测试切换到Q8-build所能达到的性能优势。 (你将以质量损失支付你的表现胜利,你必须检查你是否可以忍受......)

答案 1 :(得分:11)

你的CPU时间是3个任务:

  • JPEG解压缩;
  • 调整大小;
  • JPEG重新压缩

(裁剪本身可能需要1%的时间。)

要解码JPEG,只需执行一次,将结果保存在RAM中,然后重复使用每个输出。 (详情如下。)这样,成本将是微不足道的。

要编码JPEG,请使用libjpeg-turbo;相同的API,但如果使用x86- {32,64}或ARM硬件,则速度提高2-4倍。

要调整大小,ImageMagick以使用~100倍的CPU而闻名,除了PhotoShop和GIMP之外的任何其他软件。这包括所有照片浏览者。它每个像素执行多个三角函数,而其他人只做一次乘法运算。 有时,如果您查看图像边缘附近的像素,您可以看到ImageMagick选择比竞争对手更好的颜色。 但是如果您认为HTML5,Flash,Silverlight,Java,GD(受Perl,PHP和Python Web应用程序很受欢迎)等看起来很好,那么您就不需要这样的伪AI(人工智能)。 您可以将GPU(OpenCL)马力或更多CPU(OpenMP)投入ImageMagick,但为什么要这么麻烦呢?

对于高效率,相当于ImageMagick(事实上的标准)是Imlib2。 它可以在几乎与ImageMagick一样多的OS /语言环境中使用。

你的“convert”shell命令相当于调用Imlib2的10-20行高级语言: 解压缩JPEG,然后重复裁剪,调整大小和压缩JPEG。

没有裁剪(或多输出)的示例是: Stretch, resize, or thumbnail an image using Perl

如果您想要其他示例,请与我们联系。

答案 2 :(得分:0)

迟到了,但如果有人遇到同样的问题,这是我目前的方法。 如果您批量处理基本转换但数量超过数千张图片,根据我的经验,您无法从openMP中获得很多好处,因为这些接缝有利于多元化&#39;大型复杂变换。 我的解决方案是一个bash脚本,用于并行生成各个进程。

#!/bin/bash
counter=0
for i in tif/*.TIF;
do
    y=${i%.TIF}
    ((counter++))
    if [ -s gif$y.gif ];then
        :
    else
        gm convert $i gif$y.gif &
    fi
    if [ $counter -eq 30 ];then 
        ((counter =0))
        wait
    fi
done
wait  

这会转换&#39; tif&#39;中的所有TIF文件。将目录转换为“giftif”中的GIF目录。如果你必须停止这个脚本,它将在下次停止的地方继续。这使我的MBP中的所有16个内核都被剔除,比单核方法快12-14倍,而我目前正在转换150,000个图像。