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

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

  Download the appropriate binary from

     https://download.imagemagick.org/ImageMagick/download/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.11"

  On Linux and Solaris machines set the LD_LIBRARY_PATH environment variable:

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

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

     export DYLD_LIBRARY_PATH="$HOME/ImageMagick-7.0.11/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.11/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, 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.11/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.11/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.11/modules-Q16/coders
          $HOME/.config/ImageMagick/
          <client path>/etc/ImageMagick/modules-Q16/coders
          <current directory>/

Windows Vista, XP, and NT Install:

  Download one of

      https://download.imagemagick.org/download/ImageMagick/binaries/ImageMagick-7.0.11-15-Q16-windows-dll.exe
      https://download.imagemagick.org/download/ImageMagick/binaries/ImageMagick-7.0.11-15-Q16-windows-static.exe
      https://download.imagemagick.org/download/ImageMagick/binaries/ImageMagick-7.0.11-15-Q8-windows-dll.exe
      https://download.imagemagick.org/download/ImageMagick/binaries/ImageMagick-7.0.11-15-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:
