当我尝试使用ImageMagick软件调整像30,000px x 20,000px的非常大的图像时,我遇到了问题。但我没有使用RAM。我有8GB,但软件需要大约10GB~。我需要使用RAM中的所有数据。我尝试了两种选择:
1使用转换,写入不同的图像文件:
convert -resize 90% source.jpg destination.jpg
使用 mogrify 覆盖原始图像文件
mogrify -resize 90%source.jpg
也许有人知道如何使用更少的记忆或其他技巧。
有关Imagemagick的更多信息:http://www.imagemagick.org/script/mogrify.php
答案 0 :(得分:3)
如果您尝试在缓存到磁盘之前配置ImageMagick的内存策略以使用更多RAM,请通过修改policy.xml或设置环境变量来定义AREA限制。
这可能是一次性流程的最快捷方式。
MAGICK_AREA_LIMIT=8GB convert -resize 90% source.jpg destination.jpg
还尝试调整其他环境变量
MAGICK_MAP_LIMIT
- 为像素缓存分配的最大内存映射量(以兆字节为单位)。MAGICK_MEMORY_LIMIT
- 从堆中为像素缓存分配的最大内存量(兆字节)。修改policy.xml
目录下的{$PREFIX}/lib/ImageMagic-X.X.X/config
。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE policymap [
<!ELEMENT policymap (policy)+>
<!ELEMENT policy (#PCDATA)>
<!ATTLIST policy domain (delegate|coder|filter|path|resource) #IMPLIED>
<!ATTLIST policy name CDATA #IMPLIED>
<!ATTLIST policy rights CDATA #IMPLIED>
<!ATTLIST policy pattern CDATA #IMPLIED>
<!ATTLIST policy value CDATA #IMPLIED>
]>
<policymap>
<policy domain="resource" name="memory" value="8GB"/>
<policy domain="resource" name="map" value="8GB"/>
<policy domain="resource" name="area" value="8GB"/>
</policymap>
无论您选择哪种方法,都可以通过运行identify
实用程序进行验证。
$ identify -list resource
File Area Memory Map Disk Thread Throttle Time
--------------------------------------------------------------------------------
1920 8GB 8GB 8GB unlimited 1 0 unlimited
答案 1 :(得分:1)
目前还不清楚你想要实现的整体目标,但你可以在阅读的同时调整这样的图像并且它应该占用更少的内存:
convert source.jpg'[15000x10000]' destination.jpg
答案 2 :(得分:0)
编辑policy.xml
下的/etc/ImageMagick/policy.xml
就我而言,它使用的内存超过2GiB,但是您可以在此处进行限制,以便脚本应在提供的限制下运行。我将其设置为map
和memory
的512MiB。