我在 Rails 应用程序上使用 Imagemagick 和 Minimagick,并用它生成一些象形图。
当我启动进程时,出现此错误,但找不到解决方案:
MiniMagick::Error (`convert -limit memory 2GiB -limit map 2GiB -limit disk 4GiB -background none -fill #000000 -font ttf/SELIS006N.ttf -pointsize 300 label: S public/pictogram_images/RECINTAN-EL-064-layer-1.png` failed with error:
convert.im6: cache resources exhausted ` S' @ error/cache.c/OpenPixelCache/4078.
convert.im6: no images defined `public/pictogram_images/RECINTAN-EL-064-layer-1.png' @ error/convert.c/ConvertImageCommand/3044.
):
我的过程很简单,我有一些 .tff 文件,每个字符都是一个象形图。我只想以 png 格式生成该角色的所有预览。
用
policy.xml
找到
find / -name "policy.xml"
类似
/etc/ImageMagick-6/policy.xml
并改变
<policy domain="resource" name="disk" value="1GiB"/>
到
<policy domain="resource" name="disk" value="8GiB"/>
出现该错误可能是因为内存不足。您可以使用以下命令检查资源:
转换-列表资源
输出会有点像这样:
Resource limits:
Width: 16KP
Height: 16KP
Area: 128MP
Memory: 256MiB
Map: 512MiB
Disk: 1GiB
File: 768
Thread: 8
Throttle: 0
Time: unlimited
在这里,您可以看到分配的磁盘空间和内存量非常小。因此,为了修改它,您需要更改位于 /etc/ImageMagick-6 目录中某处的policy.xml 文件。
在policy.xml文件中将
<policy domain="resource" name="disk" value="1GiB"/>
更改为<policy domain="resource" name="disk" value="4GiB"/>
。
sed -i '/disable ghostscript format types/,+6d' /etc/ImageMagick-6/policy.xml #this one is just to solve convertion from .tiff to pdf, you may need it some day
sed -i -E 's/name="memory" value=".+"/name="memory" value="8GiB"/g' /etc/ImageMagick-6/policy.xml
sed -i -E 's/name="map" value=".+"/name="map" value="8GiB"/g' /etc/ImageMagick-6/policy.xml
sed -i -E 's/name="area" value=".+"/name="area" value="8GiB"/g' /etc/ImageMagick-6/policy.xml
sed -i -E 's/name="disk" value=".+"/name="disk" value="8GiB"/g' /etc/ImageMagick-6/policy.xml
不确定到底是哪个项目导致了您的问题,但可能是其中之一:
1) 您需要将字体放入 ImageMagick 基于 XML 的字体文件中,而不是在
file.ttf
命令中指定 convert
。要获取可用字体列表,请使用
identify -list font | more
Path: /Users/mark/.magick/type.xml <--- Edit your font into here
Font: ACaslonPro
family: unknown
style: Undefined
stretch: Undefined
weight: 0
glyphs: /Library/Fonts/ACaslonPro-Regular.otf
Font: ACaslonPro-Semibold
family: unknown
style: Undefined
stretch: Undefined
weight: 0
glyphs: /Library/Fonts/ACaslonPro-Semibold.otf
...
...
一开始,您将看到字体配置文件的路径,您需要编辑该路径以包含您提到的 TTF 文件。如果您要添加大量字体,您可能希望自动化该过程 - 请参阅我的另一篇文章此处。
2)如果您的
#
通过 shell 调用,您可能需要在 -fill
选项中转义 MiniMagick
,或者至少用单引号或双引号将其括起来,以将其隐藏在 shell 中 - 我不这样做了解MiniMagick
的来龙去脉。
3) 您可能需要在单引号或双引号内引用您希望输出的字母
S
。
4) 您可能需要删除
label
后面的冒号后面的空格。
我的意思是你的命令可能应该更像这样:
convert -limit memory 2GiB -limit map 2GiB -limit disk 4GiB -background none -fill "#000000" -font "TimesNewRoman" -pointsize 300 label:"S" output.png