octavegraphicsmagick

Octave can't read file using GraphicsMagick


I'm trying to load an image in Octave 4.2.1 with GraphicsMagick 1.3.27 (via brew) on OS X. Here's the error:

>> img = imread('./myimg.jpg')
error: Magick++ exception: octave-cli-4.2: No decode delegate for this 
image format (<path to myimg.jpg>) reported by magick/constitute.c:1535 (ReadImage)
 error: called from
    __imread__ at line 80 column 10
    imageIO at line 117 column 26
    imread at line 106 column 30

GraphicsMagick looks to be configured correctly:

 gm -version
 GraphicsMagick 1.3.27  Q16 http://www.GraphicsMagick.org/
 Copyright (C) 2002-2017 GraphicsMagick Group.
 Additional copyrights and licenses apply to this software.
 See http://www.GraphicsMagick.org/www/Copyright.html for details.

 Feature Support:
   Native Thread Safe       yes
   Large Files (> 32 bit)   yes
   Large Memory (> 32 bit)  yes
   BZIP                     yes
   DPS                      no
   FlashPix                 no
   FreeType                 yes
   Ghostscript (Library)    no
   JBIG                     no
   JPEG-2000                no
   JPEG                     yes
   Little CMS               no
   Loadable Modules         yes
   OpenMP                   no
   PNG                      yes
   TIFF                     yes
   TRIO                     no
   UMEM                     no
   WebP                     no
   WMF                      no
   X11                      no
   XML                      no
   ZLIB                     yes

 Host type: x86_64-apple-darwin16.7.0

 Configured using the command:
   ./configure  '--prefix=/usr/local/Cellar/graphicsmagick/1.3.27' '-- 
disable-dependency-tracking' '--enable-shared' '--disable-static' '--with-modules' '--without-lzma' '--disable-openmp' '--with-quantum-depth=16' '--disable-installed' '--without-gslib' '--with-gs-font-dir=/usr/local/share/ghostscript/fonts' '--without-x' '--without-lcms2' 'CC=clang' 'CXX=clang++'

 Final Build Parameters:
   CC       = clang
   CFLAGS   = -g -O2 -Wall -D_THREAD_SAFE
   CPPFLAGS = -I/usr/local/opt/freetype/include/freetype2
   CXX      = clang++
   CXXFLAGS = -D_THREAD_SAFE
   LDFLAGS  = -L/usr/local/opt/freetype/lib
   LIBS     = -lfreetype -lbz2 -lz -lltdl -lm -lpthread

Trying to load a png file results in the same error. Using gm directly from the command line works fine.


Solution

  • Your octave and gm installation may be linked against different GraphicsMagick libraries so the output of gm -version might not be accurate. You probably should be checking this from inside Octave itself, like so:

    octave:1> imformats 
    Extension | isa | Info | Read | Write | Alpha | Description
    ----------+-----+------+------+-------+-------+------------
    bmp       | yes | yes  | yes  | yes   | yes   | Microsoft Windows bitmap image
    cur       | yes | yes  | yes  | no    | yes   | Microsoft Cursor Icon
    gif       | yes | yes  | yes  | yes   | yes   | CompuServe graphics interchange format
    ico       | yes | yes  | yes  | no    | yes   | Microsoft Icon
    jbg       | yes | yes  | yes  | yes   | yes   | Joint Bi-level Image experts Group interchange format
    jbig      | yes | yes  | yes  | yes   | yes   | Joint Bi-level Image experts Group interchange format
    jpg, jpeg | yes | yes  | yes  | yes   | yes   | Joint Photographic Experts Group JFIF format
    pbm       | yes | yes  | yes  | yes   | yes   | Portable bitmap format (black/white)
    pcx       | yes | yes  | yes  | yes   | yes   | ZSoft IBM PC Paintbrush
    pgm       | yes | yes  | yes  | yes   | yes   | Portable graymap format (gray scale)
    png       | yes | yes  | yes  | yes   | yes   | Portable Network Graphics
    pnm       | yes | yes  | yes  | yes   | yes   | Portable anymap
    ppm       | yes | yes  | yes  | yes   | yes   | Portable pixmap format (color)
    ras       | yes | yes  | yes  | yes   | yes   | SUN Rasterfile
    tga, tpic | yes | yes  | yes  | yes   | yes   | Truevision Targa image
    tif, tiff | yes | yes  | yes  | yes   | yes   | Tagged Image File Format
    xbm       | yes | yes  | yes  | yes   | yes   | X Windows system bitmap (black/white)
    xpm       | yes | yes  | yes  | yes   | yes   | X Windows system pixmap (color)
    xwd       | yes | yes  | yes  | yes   | yes   | X Windows system window dump (color)
    

    You can also check what library is Octave actually using with ldd (since your are using Mac, you might not have ldd but google tells me otool -L is the Mac solution). In my case I know they are the same:

    $ ldd /usr/local/lib/octave/5.0.0/liboctinterp.so | grep Magick
        libGraphicsMagick++-Q16.so.12 => /lib/libGraphicsMagick++-Q16.so.12 (0x00007f858a896000)
        libGraphicsMagick-Q16.so.3 => /lib/libGraphicsMagick-Q16.so.3 (0x00007f858a52e000)
    $ ldd /usr/bin/gm | grep Magick
        libGraphicsMagick-Q16.so.3 => /lib/libGraphicsMagick-Q16.so.3 (0x00007f5041f66000)
    

    And once you know the actual library that Octave is using for GraphicsMagick, you can check if that one is linked against libjpeg:

    $ ldd /lib/libGraphicsMagick++-Q16.so.12 | grep jpeg
        libjpeg.so.62 => /lib/x86_64-linux-gnu/libjpeg.so.62 (0x00007f63e910c000)
    

    You may also be able to get some hints from octave config:

    octave:1> __octave_config_info__.build_environment.MAGICK_CPPFLAGS
    ans = -I/usr/include/GraphicsMagick
    octave:2> __octave_config_info__.build_environment.MAGICK_LDFLAGS
    ans = 
    octave:3> __octave_config_info__.build_environment.MAGICK_LIBS
    ans = -lGraphicsMagick++ -lGraphicsMagick