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吗?
更新
答案 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次,然后打印性能结果:
Performance[1]:
)。10i
)。0.689ips
)。您应该使用以下命令了解有关资源限制的系统设置方式:
identify -list resource File Area Memory Map Disk Thread Time -------------------------------------------------------------------- 192 4.295GB 2GiB 4GiB unlimited 1 unlimited
您可以看到我当前系统的设置(默认值 - 我没有调整它们)。列标题中的每个关键字都可以使用pimp系统。
files
定义了ImageMagick将使用的最大并发打开文件数。memory
,map
,area
和disk
资源限制在字节中定义。要将设置它们设置为不同的值,您可以使用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
(或甚至Q32
或Q64
)(意思是,其内部流程会将所有图片视为具有16位通道深度,这需要与Q8
相比,内存是双倍的 - 这是现在的默认值 - 你可以测试切换到Q8-build所能达到的性能优势。 (你将以质量损失支付你的表现胜利,你必须检查你是否可以忍受......)
答案 1 :(得分:11)
你的CPU时间是3个任务:
(裁剪本身可能需要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个图像。