linux 缓存资源耗尽Imagemagick

wecizke3  于 2023-02-18  发布在  Linux
关注(0)|答案(4)|浏览(181)

我在一个带有Minimagick的rails应用程序上使用Imagemagick,我用它生成了一些象形图。
当我启动我的流程时,我遇到了这个错误,但我没有找到解决方案:

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的所有预览。

jum4pzuy

jum4pzuy1#

使用find / -name "policy.xml"查找policy.xml
类似于/etc/ImageMagick-6/policy.xml
并改变

<policy domain="resource" name="disk" value="1GiB"/>

<policy domain="resource" name="disk" value="8GiB"/>

参见convert fails due to resource limits
Memory issues

5jdjgkvh

5jdjgkvh2#

发生此错误的原因可能是内存不足。您可以使用以下命令检查资源:

转换-列出资源

输出将类似于以下内容:

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"/>

eoxn13cs

eoxn13cs3#

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
wlzqhblo

wlzqhblo4#

不确定是哪一项导致您出现此问题,但可能是以下各项之一:
1)您需要将字体放入ImageMagick基于XML的字体文件中,而不是在convert命令中指定file.ttf

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文件。如果你有很多字体要添加,你可能想自动化这个过程-见我的另一篇文章here
2)如果您的MiniMagick通过shell调用,您可能需要在-fill选项中转义#,或者至少用单引号或双引号将其括起来,以便在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

相关问题