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