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 http://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:
