108

I'm using Imagemagick on a rails app with Minimagick and I generate some pictogram with it.

When I launch my process I have this error and I don't find a solution:

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.
):

My process is simple, I have some .tff file and each character is a pictogram. I just want to generate all preview of this character in png.

4 Answers 4

178

Find the policy.xml with find / -name "policy.xml"

something like /etc/ImageMagick-6/policy.xml

and change

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

to

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

refer to convert fails due to resource limits

Memory issues

7
  • 1
    I also had to define <policy domain="resource" name="area" value="1GiB"/> in order for my error message convert-im6.q16: cache resources exhausted 'myimage.jpg' @ error/cache.c/OpenPixelCache/3945. to disappear.
    – Anthony O.
    Commented Jan 16, 2019 at 22:10
  • For more details see the solution discussed here: github.com/ImageMagick/ImageMagick/issues/…
    – RHertel
    Commented Apr 21, 2019 at 18:26
  • 1
    this worked, created mirror note explaining this blog.eq8.eu/til/imagemagic-cache-resources-exhausted.html Commented Nov 26, 2020 at 14:11
  • 1
    @R.W.Prado It's not proposed to set unlimited resource here. But you can try it and check it with identify -list resource to see if it works. Commented Feb 14, 2022 at 5:49
  • 2
    [IMHO] It is more efficient to use locate "policy.xml" than to run find on the entire file systems...
    – Hastur
    Commented Sep 21, 2023 at 19:02
43

The error probably occurs because you run out of memory. You can check for the resources using the following command:

convert -list resource

The output will be somewhat like this:

Resource limits:
  Width: 16KP   
  Height: 16KP   
  Area: 128MP   
  Memory: 256MiB   
  Map: 512MiB   
  Disk: 1GiB   
  File: 768   
  Thread: 8   
  Throttle: 0   
  Time: unlimited

Here, you can see that the assigned amounts of disk space and memory are very small. So, in order to modify it you need to change the policy.xml file located somewhere in /etc/ImageMagick-6 directory.
Change <policy domain="resource" name="disk" value="1GiB"/> to <policy domain="resource" name="disk" value="4GiB"/> in the policy.xml file.

6
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
-2

Not sure exactly which item is causing you the problem, but it is probably one of these:

1) You need to put your font into ImageMagick's XML-based font file rather than specify a file.ttf in your convert command. To get the list of available fonts, use

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
...
...

At the beginning you will see the path to the config file for your fonts and you need to edit that to include your TTF file you mentioned. If you have lots of fonts to add, you may like to automate the process - see my other post here.

2) You may need to escape the # in your -fill option, or at least surround it by single, or double quotes to hide it from the shell, if your MiniMagick invokes via shell - I don't know the ins and outs of MiniMagick.

3) You may need to quote the letter S that you wish to output inside single or double quotes.

4) You may need to remove the space after the colon following label.

What I am getting at is that your command should maybe be more like this:

convert -limit memory 2GiB -limit map 2GiB -limit   disk 4GiB -background none -fill "#000000" -font "TimesNewRoman" -pointsize 300 label:"S" output.png
2
  • I do not see any advantage to Mark's 1). There should be no reason that I know that a path to a font file would fail, if the path is correct and the font is not corrupt in some way or malformed.
    – fmw42
    Commented Dec 10, 2018 at 18:00
  • i think what fixed it was that you specified the limits on the command line. if you edit your answer to put that as an answer i think it would be voted up. "convert -limit memory 2GiB -limit map 2GiB -limit disk 4GiB"
    – Nande
    Commented Mar 26 at 2:30

Not the answer you're looking for? Browse other questions tagged or ask your own question.