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