您应该检查您的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
命令来将内置的IMlogo:
图像在每个方向上放大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
您可以看到我当前系统的默认设置(我没有进行调整)。您可以使用列标题中的每个关键字来优化您的系统。
files
定义ImageMagick将使用的最大并发打开文件数。
memory
、map
、area
和disk
资源限制以字节为单位。要将它们设置为不同的值,您可以使用SI前缀,例如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构建来获得的性能优势。 (您将用质量损失来换取性能的胜利,并且必须检查您是否能接受它....)