charshep
charshep

Reputation: 416

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.

Upvotes: 0

Views: 1164

Answers (2)

Sami Varjo
Sami Varjo

Reputation: 128

Uh... old but...

Double check validity of the file name. I had erroneous line ending at file name as in string "myimg.jpg\n".

Maybe here the first . is taken as suffix separator leading to suffix "myimg.jpg" not the expected "jpg"...

Upvotes: 0

carandraug
carandraug

Reputation: 13091

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

Upvotes: 3

Related Questions