【问题标题】:cache resources exhausted Imagemagick缓存资源耗尽Imagemagick
【发布时间】:2015-10-03 02:42:39
【问题描述】:

我在带有 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 中生成这个角色的所有预览。

【问题讨论】:

    标签: ruby-on-rails linux memory imagemagick minimagick


    【解决方案1】:

    使用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

    【讨论】:

    【解决方案2】:

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

    转换-列表资源

    输出会有点像这样:

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

    【讨论】:

      【解决方案3】:
      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
      

      【讨论】:

        【解决方案4】:

        不确定到底是哪一项导致了问题,但可能是其中之一:

        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
        

        【讨论】:

        • 我认为 Mark 的 1) 没有任何优势。如果路径正确并且字体没有以某种方式损坏或格式不正确,我应该没有理由知道字体文件的路径会失败。
        猜你喜欢
        • 2021-10-06
        • 2017-12-03
        • 2016-06-29
        • 1970-01-01
        • 2018-04-05
        • 1970-01-01
        • 2021-09-19
        • 2017-08-11
        • 1970-01-01
        相关资源
        最近更新 更多