Introduction to ImageMagick

  ImageMagick® is a software suite to create, edit, compose, or convert
  bitmap images. It can read and write images in a variety of formats (over
  200) including PNG, JPEG, GIF, HEIC, TIFF, DPX, EXR, WebP, Postscript,
  PDF, and SVG. Use ImageMagick to resize, flip, mirror, rotate, distort,
  shear and transform images, adjust image colors, apply various special
  effects, or draw text, lines, polygons, ellipses and Bézier curves.
  
  The functionality of ImageMagick is typically utilized from the command
  line or you can use the features from programs written in your favorite
  language. Choose from these interfaces: G2F (Ada), MagickCore (C),
  MagickWand (C), ChMagick (Ch), ImageMagickObject (COM+), Magick++ (C++),
  JMagick (Java), L-Magick (Lisp), Lua, NMagick (Neko/haXe), Magick.NET
  (.NET), PascalMagick (Pascal), PerlMagick (Perl), MagickWand for PHP
  (PHP), IMagick (PHP), PythonMagick (Python), RMagick (Ruby), or TclMagick
  (Tcl/TK). With a language interface, use ImageMagick to modify or create
  images dynamically and automagically.

  ImageMagick utilizes multiple computational threads to increase performance
  and can read, process, or write mega-, giga-, or tera-pixel image sizes.
  
  ImageMagick is free software delivered as a ready-to-run binary distribution
  or as source code that you may use, copy, modify, and distribute in both open
  and proprietary applications. It is distributed under the Apache 2.0 license.
  
  The ImageMagick development process ensures a stable API and ABI. Before
  each ImageMagick release, we perform a comprehensive security assessment
  that includes memory error and thread data race detection to prevent
  security vulnerabilities.

  ImageMagick is available from
  https://www.imagemagick.org/script/download.php.  It runs on Linux, Windows,
  Mac Os X, iOS, Android OS, and others.

  The authoritative ImageMagick web site is https://www.imagemagick.org. The
  authoritative source code repository is https://github.com/ImageMagick. We
  maintain a source code mirror at https://gitlab.com/ImageMagick.


Features and Capabilities
  
  Here are just a few examples of what ImageMagick can do:
  
      * Format conversion: convert an image from one format to another (e.g.
        PNG to JPEG).
      * Transform: resize, rotate, deskew, crop, flip or trim an image.
      * Transparency: render portions of an image invisible.
      * Draw: add shapes or text to an image.
      * Decorate: add a border or frame to an image.
      * Special effects: blur, sharpen, threshold, or tint an image.
      * Animation: create a GIF animation sequence from a group of images.
      * Text & comments: insert descriptive or artistic text in an image.
      * Image gradients: create a gradual blend of one color whose shape is 
        horizontal, vertical, circular, or ellipical.
      * Image identification: describe the format and attributes of an image.
      * Composite: overlap one image over another.
      * Montage: juxtapose image thumbnails on an image canvas.
      * Generalized pixel distortion: correct for, or induce image distortions
        including perspective.
      * Computer vision: Canny edge detection.
      * Morphology of shapes: extract features, describe shapes and recognize
        patterns in images.
      * Motion picture support: read and write the common image formats used in
        digital film work.
      * Image calculator: apply a mathematical expression to an image or image
        channels.
      * Connected component labeling: uniquely label connected regions in an
        image.
      * Discrete Fourier transform: implements the forward and inverse DFT.
      * Perceptual hash: maps visually identical images to the same or similar
        hash-- useful in image retrieval, authentication, indexing, or copy
        detection as well as digital watermarking.
      * Complex text layout: bidirectional text support and shaping.
      * Color management: accurate color management with color profiles or in
        lieu of-- built-in gamma compression or expansion as demanded by the
        colorspace.
      * High dynamic-range images: accurately represent the wide range of
        intensity levels found in real scenes ranging from the brightest direct
        sunlight to the deepest darkest shadows.
      * Encipher or decipher an image: convert ordinary images into
        unintelligible gibberish and back again.
      * Virtual pixel support: convenient access to pixels outside the image
        region.
      * Large image support: read, process, or write mega-, giga-, or
        tera-pixel image sizes.
      * Threads of execution support: ImageMagick is thread safe and most
        internal algorithms are OpenMP-enabled to take advantage of speed-ups
        offered by multicore processor chips.
      * Distributed pixel cache: offload intermediate pixel storage to one or
        more remote servers.
      * Heterogeneous distributed processing: certain algorithms are
        OpenCL-enabled to take advantage of speed-ups offered by executing in
        concert across heterogeneous platforms consisting of CPUs, GPUs, and
        other processors.
      * ImageMagick on the iPhone: convert, edit, or compose images on your
        iPhone or iPad.
  
  Examples of ImageMagick Usage shows how to use ImageMagick from the
  command-line to accomplish any of these tasks and much more. Also,
  see Fred's ImageMagick Scripts: a plethora of command-line scripts that
  perform geometric transforms, blurs, sharpens, edging, noise removal,
  and color manipulations. With Magick.NET, use ImageMagick without having
  to install ImageMagick on your server or desktop.

