Cristy is the principal architect of ImageMagick and still maintains the
ImageMagick distribution.

We acknowledge the substantial contributions to the ImageMagick project by
these gifted individuals (listed in alphabetical order):

Kelly Bergougnoux
     Authored the Cineon image coder (based on the existing DPX source).

Rod Bogart and John W. Peterson, University of Utah
     Image compositing is loosely based on rlecomp of the Utah Raster Toolkit.

Nathan Brown
     Original author of the JP2 coder.

Mike Chiarappa
     Created a Borland C++ Builder 6.0 build environment for ImageMagick.

Thomas R Crimmins
     Inventor of the eight hull algorithm used for speckle reduction.

Troy Edwards
     Authored the source RPM spec file for ImageMagick.

Jaroslav Fojtik
     Authored the CUT, ART, and MATLAB coder modules.

Francis J. Franklin
     Ported the WMF coder to the libwmf 0.2 API.

Markus Friedl
     Original author of Base64 encode/decode sources.

Bob Friesenhahn
     Author of Magick++ (C++ API to ImageMagick).  Author of module loader
     facility, automatic file identification (magic) support, Unix/Cygwin/MinGW
     configure/make facility, Windows setup.exe style installer, WMF renderer,
     C API documentation formatter, and the C, C++, and Perl test suites
     used by ImageMagick.

Michael Halle, Spatial Imaging Group at MIT
     Contributed the initial implementation of Alan Paeth's image rotation
     algorithm.

David Harr
     Contributed (with Leonard Rosenthol) dash pattern, linecap stroking
     algorithm, and minor rendering improvements.

Christopher R. Hawks
     Authored the PALM coder.

Paul Heckbert, Carnegie Mellon University
     Image resizing is loosely based on Paul Heckbert's Zoom program.

Peder Langlo, Hewlett Packard
     Made hundreds of suggestions and bug reports. Without Peder, this software
     would not be nearly as useful as it is today.

Dirk Lemstra
     Contributed to Magick++ and the Windows distribution.

Rick Mabry
     Contributed code to support filling drawn objects using a pattern image
     and major improvements to the web page (both content and appearance).

Catalin Mihaila
     Contributed a ZX-Spectrum SCREEN$ reader.

David Pensak, E. I. du Pont de Nemours and Company
     For providing the computing environment that made developing ImageMagick
     possible.

Chantal Racette, Laurentian University
     Sped up Sinc and Blackman filter kernels. EWA resampling code
     verification.

William Radcliffe
     Author of the VisualMagick project configure facility for Visual C++.
     Author of FlashPix module. Author of the EMF, XTRN, and META coders.
     Significant contributions to the MSL, JPEG, TIFF, SVG, and URL coders.
     Authored "process" module support. Wrote the micro-timer facility used by
     'identify'. Ported module loader support to Windows. Significantly
     improved polygon rendering performance.

Glenn Randers-Pehrson
     Contributed significantly to the utilities.  Authored support for JNG,
     MNG, and PNG formats. Provided significant support for the BMP format.
     Significant improvements to the documentation, including creating a
     documentation authoring environment based on the <imdoc> format.

Paul Raveling, USC Information Sciences Institute
     The spatial subdivision color reduction algorithm is based on his Img
     software.

Nicolas Robidoux, Laurentian University
     New ellipse clamping method and vertical/horizontal line preserving
     filters for EWA resampling. Sped up resampling filter kernels.

Leonard Rosenthol
     Authored the 'conjure' utility and associated MSL execution environment.
     Provided MacOS support. Authored the CLIPBOARD, XCF, and PSD coders.
     Postscript and PDF expertise. Significant drawing enhancements including
     support for dash patterns, linecap stroking, clipping masks and a mask
     image.

Bastien ROUCARIÈS
    Various patches from Debian downstream.

Kyle Shorter
     Original author of PerlMagick.  Author of the LOCALE coder.

Lars Ruben Skyum
     Contributed the -clippath functionality, improved color profile support,
     and re-wrote the PS3 coder.

Alvy Ray Smith and Eric Ray Lyons
     HWB color transform and algorithm.

Michael Still and IBM developer Works
     For the excellant article, "Graphics from the command line".  First
     published by IBM DeveloperWorks.

Anthony Thyssen
     Designed the ImageMagick 6.0 command line processing with parenthesis,
     image sequence operators, and GIF animation processing.  Wrote the
     image perspective distortions (-distort) and resampling methods.
     Maintains a comprehensive set of examples of using ImageMagick at
     http://www.imagemagick.org/Usage/. 

Milan Votava
     Contributed support for Wireless BitMap, used in WAP - Wireless Access
     Protocol.

Fred Weinhaus
     Contributed support and documentation for the discrete Fourier transform.
     Also provides scripts that perform some out-of-the ordinary image
     processing operations @ http://www.fmwconcepts.com/imagemagick/.

Alexander Zimmermann
     Responsible for the ImageMagick Linux binary distributions for many years.
     His efforts are very much appreciated.