These active developers and have made source code contributions to the
ImageMagick project in the last few years:

Cristy
     Principal architect of ImageMagick and still maintains the ImageMagick
     distribution.

Dirk Lemstra
     Contributor to and maintainer of Magick++, OpenCL acceleration, and
     the Windows build (configure, ImageMagickObject, etc.).

Glenn Randers-Pehrson
     Contributed significantly to the utilities.  Authored support for JNG,
     MNG, and PNG formats. Provided significant support for the BMP format.
     Made significant improvements to the documentation.

Bastien ROUCARIÈS
     Various patches from Debian downstream.

Fred Weinhaus
     Contributed support and documentation for the discrete Fourier transform,
     connected component labeling, perceptual hash, kuwahara filter and others.
     Also provides scripts that perform some out-of-the ordinary image
     processing operations @ http://www.fmwconcepts.com/imagemagick/.  He
     utilized his scripts as unit tests for ImageMagick version 7 to ensure
     version 6 compatibility before its release.


These individuals have made source code contributions to the ImageMagick
project in the past but are no longer active developers:

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

Nathan Brown
     Original author of the JP2 coder.

Siu Chi Chan
     Accelerate numerous image filters with OpenCL under AMD, Intel,
     and NVidia.  Adapted from MulticoreWare OpenCL contribution.

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

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.

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

Christopher R. Hawks
     Authored the PALM coder.

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.

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.

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.

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.

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.


We acknowledge these non-developer contributors to the ImageMagick project:

Hanno Böck
     Contributed numerous fuzzed-images that revealed program flaws in
     ImageMagick.  Additional checks were added to guard against nefarious
     image files.

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

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

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

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.

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

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

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

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