This file documents how to use the binary distribution packages built by
ImageMagick Studio LLC, and found in the ImageMagick 'binaries' subdirectory
of ImageMagick ftp sites.  Those who want to build ImageMagick from source
code should refer to https://www.imagemagick.org/script/install-source.php.

Unix/Linux/Darwin/Mac OS X/Cygwin/MinGW Install:

  Download the appropriate binary from

     ftp://ftp.imagemagick.org/pub/ImageMagick/binaries

  Create (or choose) a directory to install the package into and change to that
  directory, for example:

     cd $HOME

  Extract the contents of the package using the command

     gzip -dc /path/to/package.tar.gz | tar -xf -

  If the 'bin' subdirectory of the extracted package is not already in your
  executable search path, add it to your PATH environment variable.  For
  example

     export PATH; PATH="$HOME/ImageMagick/bin:$PATH"

  Set the MAGICK_HOME environment variable to the path where you extracted the
  ImageMagick files. For example

     export MAGICK_HOME="$HOME/ImageMagick-7.0.2"

  On Linux and Solaris machines set the LD_LIBRARY_PATH environment variable:

     export LD_LIBRARY_PATH="$HOME/ImageMagick-7.0.2/lib"

  On Mac OS X (Darwin) machines set the DYLD_LIBRARY_PATH environment variable:

     export DYLD_LIBRARY_PATH="$HOME/ImageMagick-7.0.2/lib"

  Now, test ImageMagick to see if it is working

     convert logo: logo.gif
     display logo.gif

  To install PerlMagick type

      cd ImageMagick-7.0.2/PerlMagick
      perl Makefile.PL
      make
      make install

  Additional Information

    Environment Variables:

      In addition to the MAGICK_HOME environment variable defined above, you may
      find these variables useful:

        MAGICK_TMPDIR           path to store temporary files
        LD_LIBRARY_PATH         path to libMagick.so and other libraries

    Configuration Files

      ImageMagick depends on a number of external configuration files which
      include colors.xml, delegates.xml, magic.xml, coder.xml, and others.
      ImageMagick searches for configuration files in the following order, and
      loads them if found:

          $MAGICK_CONFIGURE_PATH
          $MAGICK_HOME/etc/ImageMagick
          $MAGICK_HOME/share/ImageMagick-7.0.2/config
          $HOME/.config/ImageMagick/
          <client path>/etc/ImageMagick/
          <current directory>/

    Font Files

      ImageMagick is able to load raw TrueType and Postscript font files.  It
      searches for the font configuration file, type.xml, in the following
      order, and loads them if found:

          $MAGICK_CONFIGURE_PATH
          $MAGICK_HOME/etc/ImageMagick
          $MAGICK_HOME/share/ImageMagick-7.0.2/config
          $HOME/.config/ImageMagick/
          <client path>/etc/ImageMagick/
          <current directory>/
          $MAGICK_FONT_PATH

    Module Files

      ImageMagick's file format support is usually provided in the form of
      loadable modules. It searches for loadable modules in the following order
      and it uses the first match found:

          <current directory>/
          $MAGICK_HOME/etc/ImageMagick/modules-Q16/coders/
          $HOME/.config/ImageMagick/
          <client path>/../etc/ImageMagick/modules-Q16/coders/
          $MAGICK_HOME/etc/ImageMagick/modules-Q16/coders
          $MAGICK_HOME/share/ImageMagick-7.0.2/modules-Q16/coders
          $HOME/.config/ImageMagick/
          <client path>/etc/ImageMagick/modules-Q16/coders
          <current directory>/

Windows Vista, XP, and NT Install:

  Download one of

      ftp://ftp.imagemagick.org/pub/ImageMagick/binaries/ImageMagick-7.0.2-0-Q16-windows-dll.exe
      ftp://ftp.imagemagick.org/pub/ImageMagick/binaries/ImageMagick-7.0.2-0-Q16-windows-static.exe
      ftp://ftp.imagemagick.org/pub/ImageMagick/binaries/ImageMagick-7.0.2-0-Q8-windows-dll.exe
      ftp://ftp.imagemagick.org/pub/ImageMagick/binaries/ImageMagick-7.0.2-0-Q8-windows-static.exe

  and execute it (or "open" it from your browser) to start the installation
  program.

  Once ImageMagick is installed, Select Start->Programs->Command Prompt.  In
  the Command Prompt window type

      convert logo: logo.gif
      imdisplay logo.gif

  If you have an X11 server, from the Command Prompt window type

      set DISPLAY=:0
      display

VMS Install:

  Type

      unzip ImageMagick.zip
      set default [.imagemagick]
      @make
      identify -verbose logo:
