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 the file README.txt in the ImageMagick source package
or http://www.imagemagick.org/script/install-source.php on the web.

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-6.6.4"

  On Linux and Solaris machines set the LD_LIBRARY_PATH environment variable:

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

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

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

  Now, test ImageMagick to see if it is working

     convert logo: logo.gif
     display logo.gif

  To install PerlMagick type

      cd ImageMagick-6.6.4/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/lib/ImageMagick-6.6.4/config
          $MAGICK_HOME/share/ImageMagick-6.6.4/config
          $HOME/.magick/
          <client path>/lib/ImageMagick-6.6.4/
          <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/lib/ImageMagick-6.6.4/config
          $MAGICK_HOME/share/ImageMagick-6.6.4/config
          $HOME/.magick/
          <client path>/lib/ImageMagick-6.6.4/
          <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/lib/ImageMagick-6.6.4/modules-Q16/coders/
          $HOME/.magick/
          <client path>/../lib/ImageMagick-6.6.4/modules-Q16/coders/
          $MAGICK_HOME/lib/ImageMagick-6.6.4/modules-Q16/coders
          $MAGICK_HOME/share/ImageMagick-6.6.4/modules-Q16/coders
          $HOME/.magick/
          <client path>/lib/ImageMagick-6.6.4/modules-Q16/coders
          <current directory>/

Windows Vista, XP, and NT Install:

  Download one of

      ftp://ftp.imagemagick.org/pub/ImageMagick/binaries/ImageMagick-6.6.4-0-Q16-windows-dll.exe
      ftp://ftp.imagemagick.org/pub/ImageMagick/binaries/ImageMagick-6.6.4-0-Q16-windows-static.exe
      ftp://ftp.imagemagick.org/pub/ImageMagick/binaries/ImageMagick-6.6.4-0-Q8-windows-dll.exe
      ftp://ftp.imagemagick.org/pub/ImageMagick/binaries/ImageMagick-6.6.4-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:
