Download & Unpack
  
  Building ImageMagick source for Windows requires a modern version of Microsoft
  Visual Studio IDE. Users have reported success with the Borland C++ compiler
  as well. If you don't have a compiler you can still install a self-installing
  binary release.
  
  Download ImageMagick-windows.zip from ftp.imagemagick.org or its mirrors
  and verify the distribution against its message digest.
  
  You can unpack the distribution with WinZip or type the following from any
  MS-DOS Command Prompt window:
  
    $magick> unzip ImageMagick-windows.zip
  
  Now that you have the ImageMagick Windows source distribution unpacked,
  let's configure it.
  
Configure
  
  These instructions are specific to building ImageMagick with the Visual
  Studio under Windows XP, Win2K, or Windows 98. ImageMagick does not include
  any workspace (DSW) or project files (DSP) except for those included with
  third party libraries. Instead, there is a configure program that must be
  built and run which creates the Visual Studio workspaces for ImageMagick. The
  Visual Studio system provides four different types of runtime environments
  that must match across all application, library, and dynamic-library (DLL)
  code that is built. The configure program creates a set of build files that
  are consistent for a specific runtime selection listed here:
  
     1. Dynamic Multi-threaded DLL runtimes (VisualDynamicMT).
     2. Static Single-threaded runtimes (VisualStaticST).
     3. Static Multi-threaded runtimes (VisualStaticMT).
     4. Static Multi-threaded DLL runtimes (VisualStaticMTDLL).
  
  In addition to these runtimes, the VisualMagick build environment allows
  you to select whether to include the X11 libraries in the build or not. X11
  DLLs and headers are provided with the VisualMagick build environment. Most
  Windows users are probably not interested in using X11, so you might prefer
  to build without X11 support. Since the animate, display, and import program
  depends on the X11 delegate libraries, these programs will no work if you
  choose not to include X11 support.
  
  This leads to five different possible build options. The default binary
  distribution is built using the Dynamic Multi-threaded DLL (VisualDynamicMT)
  option with the X11 libraries included. This results in an X11 compatible
  build using all DLL's for everything and multi-threaded support (the only
  option for DLL's).
  
  To create a workspace for your requirements, simply go to the
  VisualMagick\configure folder and open the configure.dsw workspace (for
  Visual Studio 6) or configure.sln (for Visual Studio 7 or 8). Set the build
  configuration to Release.
  
  Build and execute the configure program and follow the on-screen
  instructions. You should not change any of the defaults unless you have a
  specific reason to do so.
  
  The configure program has a button entitled:
  
    Edit "magick_config.h"
  
  Click on this button to bring up magick-config.h in Windows Notepad. Review and
  optionally change any preprocessor defines in ImageMagick's magick_config.h
  file to suit your needs. This file is copied to magick\magick_config.h. You
  may safely open magick\magick_config.h, modify it, and recompile without
  re-running the configure program. In fact, using Notepad to edit the copied
  file may be preferable since it preserves the original magick_config.h file.
  
  Key user defines in magick_config.h include:
  
    MAGICKCORE_QUANTUM_DEPTH (default 16)
      Specify the depth of the pixel component depth (8, 16, or 32). A value of 8
      uses half the memory than 16 and may run 30% faster, but provides 256 times
      less color resolution than a value of 16. We recommend a quantum depth
      of 16 because 16-bit images are becoming more prevalent on the Internet.
  
    MAGICKCORE_INSTALLED_SUPPORT (default undefined)
      Define to build a ImageMagick which uses registry settings or embedded
      paths to locate installed components (coder modules and configuration
      files). The default is to look for all files in the same directory as
      the executable. You will wand to define this value if you intend on
      installing ImageMagick on your system.
  
    ProvideDllMain (default defined)
      Define to include a DllMain() function ensures that the ImageMagick
      DLL is properly initialized without participation from dependent
      applications. This avoids the requirement to invoke IntializeMagick()
      from dependent applications is only useful for DLL builds.
  
  ImageMagick is now configured and ready to build.
  
  The default build is WIN32. For 64-bit, open a newly created static solution
  and enter Configuration Manager. Add a x64 configuration, copying the
  configuration from WIn32. Be sure that it adds the configuration to all the
  projects. Now compile.
  
Build
  
  After creating your build environment, proceed to open the DSW (or SLN)
  workspace in the VisualMagick folder. In the DSW file choose the All project
  to make it the active project. Set the build configuration to the desired one
  (Debug, or Release) and clean and build:
  
     1. Right click on the All project and select Set As Active Project
     2. Select "Build=>Clean Solution"
     3. Select "Build=>Build Solution"
  
  The clean step is necessary in order to make sure that all of the target
  support libraries are updated with any patches needed to get them to compile
  properly under Visual Studio.
  
  After a successful build, all of the required files that are needed to run
  any of the command line tools are located in the VisualMagick\bin folder. This
  includes EXE, DLL libraries, and ImageMagick configuration files. You should
  be able to test the build directly from this directory without having to
  move anything to any of the global SYSTEM or SYSTEM32 areas in the operating
  system installation.
  
  The Visual Studio distribution of ImageMagick comes with the Magick++
  C++ wrapper by default. This add-on layer has a large number of demo
  and test files that can be found in ImageMagick\Magick++\demo, and
  ImageMagick\Magick++\tests. There are also a variety of tests that use the
  straight C API as well in ImageMagick\tests.
  
  All of these programs are not configured to be built in the default workspace
  created by the configure program. You can cause all of these demos and test
  programs to be built by checking the box in configure that says:
  
    Include all demo and test programs
  
  In addition, there is another related checkbox (checked by default) that
  causes all generated project files to be created standalone so that they
  can be copied to other areas of you system.
  
    This the checkbox:
  
  Generate all utility projects with full paths rather then relative paths.
  
  Visual Studio uses a concept of dependencies that tell it what other
  components need to be build when a particular project is being build. This
  mechanism is also used to ensure that components link properly. In my normal
  development environment, I want to be able to make changes and debug the
  system as a whole, so I like and NEED to use dependencies. However, most end
  users don't want to work this way.
  
  Instead they really just want to build the package and then get down to
  business working on their application. The solution is to make all the utility
  projects (UTIL_xxxx_yy_exe.dsp) use full absolute paths to all the things they
  need. This way the projects stand on their own and can actually be copied
  and used as templates to get a particular custom application compiling with
  little effort.
  
  With this feature enabled, you should be able to nab a copy of
  
    VisualMagick\utilities\UTIL_convert_xxx_exe.dsp (for C) or
    VisualMagick\Magick++\demo\UTIL_demo_xxx_exe.dsp (for C++)
  
  and pop it into Notepad, modify it (carefully) to your needs and be on your
  way to happy compiling and linking.
  
  You can feel free to pick any of the standard utilities, tests, or demo
  programs as the basis for a new program by copying the project and the source
  and hacking away.
  
  The choice of what to use as a starting point is very easy.
  
  For straight C API command line applications use something from:
  
    ImageMagick\tests or
    ImageMagick\utilities (source code) or
    ImageMagick\VisualMagick\tests or
    ImageMagick\Visualmagick\utilities (project - DSP)
  
  For C++ and Magick++ command line applications use something from:
  
    ImageMagick\Magick++\tests or ImageMagick\Magick++\demo (source code) or
    ImageMagick\VisualMagick\Magick++\tests or
    ImageMagick\VisualMagick\Magick++\demo (project - DSP)
  
  For C++ and Magick++ and MFC windows applications use:
  
    ImageMagick\contrib\win32\MFC\NtMagick (source code) or
   ImageMagick\VisualMagick\contrib\win32\MFC\NtMagick (project - DSP)
  
  The ImageMagick distribution is very modular. The default configuration is
  there to get you rolling, but you need to make some serious choices when
  you wish to change things around.
  
  The default options are all targeted at having all the components in one place
  (e.g. the bin directory of the VisualMagick build tree). These components
  may be copied to another folder (such as to another computer).
  
  The folder containing the executables and DLLs should contain the following
  files:
  
     1. magic.xml
     2. delegates.xml
     3. modules.xml
     4. colors.xml
  
  among others.
  
  The bin folder should contains all EXE's and DLL's as well as the very
  important modules.xml file.
  
  With this default setup, you can use any of the command line tools and run
  scripts as normal. You can actually get by quite nicely this way by doing
  something like pushd e:\xxx\yyy\bin in any scripts you write to execute out
  of this directory.
  
  By default the core of ImageMagick on Win32 always looks in the place were
  the exe program is run from in order to find all of the files as well as
  the DLL's it needs.
  
  ENVIRONMENT VARIABLES
  
  You can use the System control panel to allow you to add and delete what
  is in any of the environment variables. You can even have user specific
  environment variables if you wish.
  
  PATH
  
  This environmental variable sets the default list of places were Windows
  looks for EXE's and DLL's. Windows CMD shell seems to look in the current
  directory first no matter what, which may make it unnecessary to update the
  PATH. If you wish to run any of utilities from another location then you
  must add the path to your bin directory in. For instance, to do this for
  the default build environment like I do, you might add:
  
    C:\ImageMagick\VisualMagick\bin
    MAGICK_HOME
  
  If all you do is modify the PATH variable, the first problem you will run into
  is that ImageMagick may not be able to find any of its modules. Modules are
  all the IM_MOD*.DLL files you see in the distribution. There is one of these
  for each and every file format that ImageMagick supports. This environment
  variable tells the system were to look for these DLL's. The compiled in
  default is execution path - which says - look in the same place that the
  application is running in. If you are running from somewhere other then bin
  - this will no longer work and you must use this variable. If you elect to
  leave the modules in the same place as the EXE's (a good idea) then you can
  simply set this to the same place as you did the PATH variable. In my case:
  
    C:\ImageMagick\coders
  
  This also the place were ImageMagick expects to find the colors.xml,
  delegates.xml, magic.xml, modules.xml, and type.xml files.
  
  One cool thing about the modules build of ImageMagick is that you can now
  leave out file formats and lighten you load. If all you ever need is GIF and
  JPEG, then simply drop all the other DLL's into the local trash can and get
  on with your life.
  
  Always keep the XC format, since ImageMagick uses it internally.
  
  You can elect to changes these things the good old hard-coded way. This
  define is applicable in magick-config.h:
  
    #define MagickConfigurePath "C:\\ImageMagick\\"
  
  To view any image in a Microsoft window, type
  
    $magick> convert image.ext win:
  
  Make sure Ghostscript is installed, otherwise, you will be unable to convert
  or view a Postscript document, and Postscript standard fonts will not be
  available.
  
  You may use any standard web browser (e.g. Internet Explorer) to browse the
  ImageMagick documentation.
  
  The Win2K executables will work under Windows 98.
  
  ImageMagick is now configured and built. You can optionally install it on
  your system as discussed below.
  
  If you are looking to install the ImageMagick COM+ object, see Installing
  the ImageMagickObject COM+ Component.

Install
  
  You can run ImageMagick command line utilities directly from the
  VisualMagick\bin folder, however, in most cases you may want the convenience
  of an installer script. ImageMagick provides Inno Setup scripts for this
  purpose. Note, you must define MAGICKCORE_INSTALLED_SUPPORT at configure
  time to utilize the installer scripts.
  
  To get started building a self-installing ImageMagick executable, go to
  VisualMagick\installer folder and click on a script that matches your build
  environment. Press F9 to build and install ImageMagick. The default location
  is C:Program Files\ImageMagick-6.?.?\Q?. The exact folder name depends
  on the ImageMagick version and quantum depth. Once installed, ImageMagick
  command line utilities and libraries are available to the MS Command Prompt,
  web scripts, or to meet your development needs.
  
Create a Self-Installing Binary Distribution
  
  Prerequisites
  
     1. Download and install Inno Setup 5.
     2. Download and install ActiveState ActivePerl @
        http://www.activestate.com/activeperl/downloads/.
  
  Run the Configure Wizard
  
     1. Double-click on VisualMagick/configure/configure.sln to build the
        configure wizard.
     2. Select Rebuild All and launch the configure wizard.
     3. Uncheck Use X11 Stubs and check Build demo and test programs.
     4. Click on Edit magick_config.h and define MAGICKCORE_INSTALLED_SUPPORT.
     5. Complete the configure wizard screens to create the ImageMagick Visual
        C++ workspace.
  
  Build ImageMagick
  
     1. Double-click on VisualMagick/VisualDynamicMT.sln to launch the
        ImageMagick Visual workspace.
     2. Set the active configuration to Win32 Release.
     3. Select Rebuild All to build the ImageMagick binary distribution.
  
  Build ImageMagickObject
  
     1. Launch the MS-DOS Command Prompt application and move to the
        contrib\win32\ATL7\ImageMagickObject folder.
     2. Build ImageMagickObject with these commands:
  
          $magick> BuildImageMagickObject clean
          $magick> BuildImageMagickObject release
  
  Build PerlMagick
  
     1. Launch the MS-DOS Command Prompt application and move to the PerlMagick
        folder.
     2. Build PerlMagick with these commands:
  
          $magick> perl Makefile.nt
          $magick> nmake release
  
  Create the Self-installing ImageMagick Binary Distribution
  
     1. Double-click on VisualMagick/installer/im-dll-16.iss to launch the
        Inno Setup 5 wizard.
     2. Select File->Compile.
  
  Install the Binary Distribution
  
     1. Double-click on VisualMagick/bin/ImageMagick-7.0.0-0-Q16-windows-dll.exe
        to launch the ImageMagick binary distribution.
     2. Complete the installer screens to install ImageMagick on your system.
  
  Test the Binary Distribution
  
     1. Launch the MS-DOS Command Prompt application and move to the PerlMagick
        folder and type
  
          $magick> nmake test
  
     2. Move to the VisualMagick/tests folder and type
  
          $magick> validate
  
     3. Move to the VisualMagick/Magick++/tests folder and type
  
          $magick> run_tests.bat
  
     4. Move to the VisualMagick/Magick++/demo folder and type
  
          $magick> run_demos.bat
  
  If all the tests pass without complaint, the ImageMagick self-install binary
  distribution is ready for use.
  
Dealing with Unexpected Problems
  
  Chances are the download, configure, build, and install of ImageMagick went
  flawlessly as it is intended, however, certain systems and environments may
  cause one or more steps to fail. We discuss a few problems we've run across
  and how to take corrective action to ensure you have a working release
  of ImageMagick.
  
  If the compiler generates an error or if it quits unexpectedly, go to the
  Visual Studio web site and look for Visual Studio service packs. Chances
  are, after you download and install all the Visual Studio service packs,
  ImageMagick will compile and build as expected.
  
Building Your Custom Project
  
  The Windows binary distribution includes a number of demo projects that
  you can use as a template for your own custom project. For example,
  start with the Button project, generally located in the c:/Program
  Files/ImageMagick-6.5.5-0/Magick++_demos folder. If not, be sure to select
  Configuration Properties->C/C++->Preprocessor and set these definitions:
  
    NDEBUG
    WIN32
    _CONSOLE
    _VISUALC_
    NeedFunctionPrototypes
    _DLL
    _MAGICKMOD_
  
  
