ImageMagick批量调整性能

man*_*cal 14 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可以改善事物
  • (感谢@AR提示)使用libjpeg-turbo编译ImageMagick也可以将时间缩短20%

Kur*_*fle 34

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

convert -list configure | grep FEATURES
Run Code Online (Sandbox Code Playgroud)

如果它(像我的),你应该看到这样的事情:

FEATURES      HDRI OpenCL
Run Code Online (Sandbox Code Playgroud)

这个命令

convert -version 
Run Code Online (Sandbox Code Playgroud)

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

如果没有,你应该考虑获得编译了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
Run Code Online (Sandbox Code Playgroud)

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

  • 由于我没有启用OpenMP,因此我只有1个线程(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的将使用的文件.
  • memory,map,areadisk资源限制以字节为单位定义.对于设置他们不同的值,你可以使用SI前缀,.eg 500MB).

如果我 OpenMP的ImageMagick的为这个系统上,我可以运行

convert -limit thread 2
Run Code Online (Sandbox Code Playgroud)

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


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

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

convert input.jpeg input.mpc
Run Code Online (Sandbox Code Playgroud)

然后才运行:

convert input.mpc [...your long-long-long list of crops...]
Run Code Online (Sandbox Code Playgroud)

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

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


更新2:

还有一个想法:

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

如果您的ImageMagick 在其版本字符串中有一个Q16(或偶数Q32Q64)(意思是,其内部进程认为所有图像都具有16位通道深度,这需要双倍内存Q8) - 这是现在的默认值 - 您可以测试通过切换到Q8-build,您将获得什么样的性能优势.(你将以质量损失支付你的表现胜利,你必须检查你是否可以忍受......)


小智 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.

没有裁剪(或多输出)的示例是: 使用Perl拉伸,调整大小或缩放图像

如果您想要其他示例,请告诉我们.