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.).

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:

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.

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
     https://legacy.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.
