



<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8"  />
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"  />
  <title>ImageMagick - MagickCore, C API: Image Methods</title>
  <meta name="application-name" content="ImageMagick" />
  <meta name="description" content="Use ImageMagick® to create, edit, compose, and convert bitmap images. Resize an image, crop it, change its shades and colors, add captions, and more." />
  <meta name="application-url" content="https://imagemagick.org" />
  <meta name="generator" content="PHP" />
  <meta name="keywords" content="magickcore, c, api:, image, methods, image converter, image resizer, image editor, photo editor, jpg converter, png converter, tiff converter, vector images, online, free, swiss army" />
  <meta name="rating" content="GENERAL" />
  <meta name="robots" content="INDEX, FOLLOW" />
  <meta name="generator" content="ImageMagick Studio LLC" />
  <meta name="author" content="ImageMagick Studio LLC" />
  <meta name="revisit-after" content="2 DAYS" />
  <meta name="resource-type" content="document" />
  <meta name="copyright" content="Copyright (c) 1999-2020 ImageMagick Studio LLC" />
  <meta name="distribution" content="Global" />
  <meta name="magick-serial" content="P131-S030410-R485315270133-P82224-A6668-G1245-1" />
  <meta property='og:url' content='../../' />
  <meta property='og:title' content='ImageMagick' />
  <meta property='og:image' content='../../../images/logo.png' />
  <meta property='og:type' content='website' />
  <meta property='og:site_name' content='ImageMagick' />
  <meta property='og:description' content="Create, Edit, Compose, or Convert Bitmap Images" />
  <meta name="google-site-verification" content="_bMOCDpkx9ZAzBwb2kF3PRHbfUUdFj2uO8Jd1AXArz4" />
  <link href="image.html" rel="canonical" />
  <link href="../../images/wand.png" rel="icon" />
  <link href="../../images/wand.ico" rel="shortcut icon" />
  <link href="../assets/magick.css" rel="stylesheet" />
</head>
<body>
  <nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
    <a class="navbar-brand" href="../index.html"><img class="d-block" id="icon" alt="ImageMagick" width="32" height="32" src="../../images/wand.ico"/></a>
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarsMagick" aria-controls="navbarsMagick" aria-expanded="false" aria-label="Toggle navigation">
      <span class="navbar-toggler-icon"></span>
    </button>

    <div class="navbar-collapse collapse" id="navbarsMagick" style="">
    <ul class="navbar-nav mr-auto">
      <li class="nav-item ">
        <a class="nav-link" href="../index.html">Home <span class="sr-only">(current)</span></a>
      </li>
      <li class="nav-item ">
        <a class="nav-link" href="../www/download.html">Download</a>
      </li>
      <li class="nav-item ">
        <a class="nav-link" href="../www/command-line-tools.html">Tools</a>
      </li>
      <li class="nav-item ">
        <a class="nav-link" href="../www/command-line-processing.html">Command-line</a>
      </li>
      <li class="nav-item ">
        <a class="nav-link" href="../www/develop.html">Develop</a>
      </li>
      <li class="nav-item">
        <a class="nav-link" target="_blank" href="https://github.com/ImageMagick/ImageMagick/discussions">Community</a>
      </li>
      <li class="nav-item">
          
      </li>
      <li class="nav-item">
        <iframe src="https://github.com/sponsors/ImageMagick/button" title="Sponsor ImageMagick" height="35" width="107" style="border: 0;"></iframe>
      </li>
    </ul>
    </div>
    <form class="form-inline my-2 my-md-0" action="https://imagemagick.org/script/search.php">
      <input class="form-control mr-sm-2" type="text" name="q" placeholder="Search" aria-label="Search">
      <button class="btn btn-outline-success my-2 my-sm-0" type="submit" name="sa">Search</button>
    </form>
  </nav>
  <div class="container">
   <script async="async" src="https://localhost/pagead/js/adsbygoogle.js"></script>    <ins class="adsbygoogle"
         style="display:block"
         data-ad-client="ca-pub-3129977114552745"
         data-ad-slot="6345125851"
         data-full-width-responsive="true"
         data-ad-format="horizontal"></ins>
    <script>
      (adsbygoogle = window.adsbygoogle || []).push({});
    </script>

  </div>

  <main role="main" class="container">
    <div class="magick-template">
<div class="magick-header">
<p class="text-center"><a href="image.html#AcquireImage">AcquireImage</a> &#8226; <a href="image.html#AcquireImageInfo">AcquireImageInfo</a> &#8226; <a href="image.html#AcquireNextImage">AcquireNextImage</a> &#8226; <a href="image.html#AppendImages">AppendImages</a> &#8226; <a href="image.html#CatchImageException">CatchImageException</a> &#8226; <a href="image.html#ClipImagePath">ClipImagePath</a> &#8226; <a href="image.html#CloneImage">CloneImage</a> &#8226; <a href="image.html#CloneImageInfo">CloneImageInfo</a> &#8226; <a href="image.html#CopyImagePixels">CopyImagePixels</a> &#8226; <a href="image.html#DestroyImage">DestroyImage</a> &#8226; <a href="image.html#DestroyImageInfo">DestroyImageInfo</a> &#8226; <a href="image.html#GetImageInfo">GetImageInfo</a> &#8226; <a href="image.html#GetImageInfoFile">GetImageInfoFile</a> &#8226; <a href="image.html#GetImageMask">GetImageMask</a> &#8226; <a href="image.html#GetImageVirtualPixelMethod">GetImageVirtualPixelMethod</a> &#8226; <a href="image.html#InterpretImageFilename">InterpretImageFilename</a> &#8226; <a href="image.html#IsHighDynamicRangeImage">IsHighDynamicRangeImage</a> &#8226; <a href="image.html#IsImageObject">IsImageObject</a> &#8226; <a href="image.html#IsTaintImage">IsTaintImage</a> &#8226; <a href="image.html#ModifyImage">ModifyImage</a> &#8226; <a href="image.html#NewMagickImage">NewMagickImage</a> &#8226; <a href="image.html#ReferenceImage">ReferenceImage</a> &#8226; <a href="image.html#ResetImagePage">ResetImagePage</a> &#8226; <a href="image.html#ResetImagePixels">ResetImagePixels</a> &#8226; <a href="image.html#SetImageAlpha">SetImageAlpha</a> &#8226; <a href="image.html#SetImageBackgroundColor">SetImageBackgroundColor</a> &#8226; <a href="image.html#SetImageChannelMask">SetImageChannelMask</a> &#8226; <a href="image.html#SetImageColor">SetImageColor</a> &#8226; <a href="image.html#SetImageStorageClass">SetImageStorageClass</a> &#8226; <a href="image.html#SetImageExtent">SetImageExtent</a> &#8226; <a href="image.html#SetImageInfoBlob">SetImageInfoBlob</a> &#8226; <a href="image.html#SetImageInfoCustomStream">SetImageInfoCustomStream</a> &#8226; <a href="image.html#SetImageInfoFile">SetImageInfoFile</a> &#8226; <a href="image.html#SetImageMask">SetImageMask</a> &#8226; <a href="image.html#SetImageRegionMask">SetImageRegionMask</a> &#8226; <a href="image.html#SetImageVirtualPixelMethod">SetImageVirtualPixelMethod</a> &#8226; <a href="image.html#SmushImages">SmushImages</a> &#8226; <a href="image.html#StripImage">StripImage</a> &#8226; <a href="image.html#SyncImageSettings">SyncImageSettings</a></p>

<h2><a href="../../api/MagickCore/image_8c.html" id="AcquireImage">AcquireImage</a></h2>

<p>AcquireImage() returns a pointer to an image structure initialized to default values.</p>

<p>The format of the AcquireImage method is:</p>

<pre class="text">
Image *AcquireImage(const ImageInfo *image_info,ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image_info</dt>
<dd>Many of the image default values are set from this structure.  For example, filename, compression, depth, background color, and others. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="AcquireImageInfo">AcquireImageInfo</a></h2>

<p>AcquireImageInfo() allocates the ImageInfo structure.</p>

<p>The format of the AcquireImageInfo method is:</p>

<pre class="text">
ImageInfo *AcquireImageInfo(void)
</pre>

<h2><a href="../../api/MagickCore/image_8c.html" id="AcquireNextImage">AcquireNextImage</a></h2>

<p>AcquireNextImage() initializes the next image in a sequence to default values.  The next member of image points to the newly allocated image.  If there is a memory shortage, next is assigned NULL.</p>

<p>The format of the AcquireNextImage method is:</p>

<pre class="text">
void AcquireNextImage(const ImageInfo *image_info,Image *image,
  ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image_info</dt>
<dd>Many of the image default values are set from this structure.  For example, filename, compression, depth, background color, and others. </dd>

<dd> </dd>
<dt>image</dt>
<dd>the image. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="AppendImages">AppendImages</a></h2>

<p>AppendImages() takes all images from the current image pointer to the end of the image list and appends them to each other top-to-bottom if the stack parameter is true, otherwise left-to-right.</p>

<p>The current gravity setting effects how the image is justified in the final image.</p>

<p>The format of the AppendImages method is:</p>

<pre class="text">
Image *AppendImages(const Image *images,const MagickBooleanType stack,
  ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>images</dt>
<dd>the image sequence. </dd>

<dd> </dd>
<dt>stack</dt>
<dd>A value other than 0 stacks the images top-to-bottom. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="CatchImageException">CatchImageException</a></h2>

<p>CatchImageException() returns if no exceptions are found in the image sequence, otherwise it determines the most severe exception and reports it as a warning or error depending on the severity.</p>

<p>The format of the CatchImageException method is:</p>

<pre class="text">
ExceptionType CatchImageException(Image *image)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>An image sequence. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="ClipImagePath">ClipImagePath</a></h2>

<p>ClipImagePath() sets the image clip mask based any clipping path information if it exists.</p>

<p>The format of the ClipImagePath method is:</p>

<pre class="text">
MagickBooleanType ClipImagePath(Image *image,const char *pathname,
  const MagickBooleanType inside,ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd> </dd>
<dt>pathname</dt>
<dd>name of clipping path resource. If name is preceded by #, use clipping path numbered by name. </dd>

<dd> </dd>
<dt>inside</dt>
<dd>if non-zero, later operations take effect inside clipping path. Otherwise later operations take effect outside clipping path. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="CloneImage">CloneImage</a></h2>

<p>CloneImage() copies an image and returns the copy as a new image object.</p>

<p>If the specified columns and rows is 0, an exact copy of the image is returned, otherwise the pixel data is undefined and must be initialized with the QueueAuthenticPixels() and SyncAuthenticPixels() methods.  On failure, a NULL image is returned and exception describes the reason for the failure.</p>

<p>The format of the CloneImage method is:</p>

<pre class="text">
Image *CloneImage(const Image *image,const size_t columns,
  const size_t rows,const MagickBooleanType orphan,
  ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd> </dd>
<dt>columns</dt>
<dd>the number of columns in the cloned image. </dd>

<dd> </dd>
<dt>rows</dt>
<dd>the number of rows in the cloned image. </dd>

<dd> </dd>
<dt>detach</dt>
<dd> With a value other than 0, the cloned image is detached from its parent I/O stream. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="CloneImageInfo">CloneImageInfo</a></h2>

<p>CloneImageInfo() makes a copy of the given image info structure.  If NULL is specified, a new image info structure is created initialized to default values.</p>

<p>The format of the CloneImageInfo method is:</p>

<pre class="text">
ImageInfo *CloneImageInfo(const ImageInfo *image_info)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image_info</dt>
<dd>the image info. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="CopyImagePixels">CopyImagePixels</a></h2>

<p>CopyImagePixels() copies pixels from the source image as defined by the geometry the destination image at the specified offset.</p>

<p>The format of the CopyImagePixels method is:</p>

<pre class="text">
MagickBooleanType CopyImagePixels(Image *image,const Image *source_image,
  const RectangleInfo *geometry,const OffsetInfo *offset,
  ExceptionInfo *exception);
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the destination image. </dd>

<dd> </dd>
<dt>source_image</dt>
<dd>the source image. </dd>

<dd> </dd>
<dt>geometry</dt>
<dd>define the dimensions of the source pixel rectangle. </dd>

<dd> </dd>
<dt>offset</dt>
<dd>define the offset in the destination image. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="DestroyImage">DestroyImage</a></h2>

<p>DestroyImage() dereferences an image, deallocating memory associated with the image if the reference count becomes zero.</p>

<p>The format of the DestroyImage method is:</p>

<pre class="text">
Image *DestroyImage(Image *image)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="DestroyImageInfo">DestroyImageInfo</a></h2>

<p>DestroyImageInfo() deallocates memory associated with an ImageInfo structure.</p>

<p>The format of the DestroyImageInfo method is:</p>

<pre class="text">
ImageInfo *DestroyImageInfo(ImageInfo *image_info)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image_info</dt>
<dd>the image info. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="GetImageInfo">GetImageInfo</a></h2>

<p>GetImageInfo() initializes image_info to default values.</p>

<p>The format of the GetImageInfo method is:</p>

<pre class="text">
void GetImageInfo(ImageInfo *image_info)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image_info</dt>
<dd>the image info. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="GetImageInfoFile">GetImageInfoFile</a></h2>

<p>GetImageInfoFile() returns the image info file member.</p>

<p>The format of the GetImageInfoFile method is:</p>

<pre class="text">
FILE *GetImageInfoFile(const ImageInfo *image_info)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image_info</dt>
<dd>the image info. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="GetImageMask">GetImageMask</a></h2>

<p>GetImageMask() returns the mask associated with the image.</p>

<p>The format of the GetImageMask method is:</p>

<pre class="text">
Image *GetImageMask(const Image *image,const PixelMask type,
  ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd> </dd>
<dt>type</dt>
<dd>the mask type, ReadPixelMask or WritePixelMask. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="GetImageVirtualPixelMethod">GetImageVirtualPixelMethod</a></h2>

<p>GetImageVirtualPixelMethod() gets the "virtual pixels" method for the image.  A virtual pixel is any pixel access that is outside the boundaries of the image cache.</p>

<p>The format of the GetImageVirtualPixelMethod() method is:</p>

<pre class="text">
VirtualPixelMethod GetImageVirtualPixelMethod(const Image *image)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="InterpretImageFilename">InterpretImageFilename</a></h2>

<p>InterpretImageFilename() interprets embedded characters in an image filename. The filename length is returned.</p>

<p>The format of the InterpretImageFilename method is:</p>

<pre class="text">
size_t InterpretImageFilename(const ImageInfo *image_info,Image *image,
  const char *format,int value,char *filename,ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows.</p>

<dt>image_info</dt>
<p>the image info..</p>

<dt>image</dt>
<p>the image.</p>

<dt>format</dt>
<p>A filename describing the format to use to write the numeric argument. Only the first numeric format identifier is replaced.</p>

<dt>value</dt>
<p>Numeric value to substitute into format filename.</p>

<dt>filename</dt>
<p>return the formatted filename in this character buffer.</p>

<dt>exception</dt>
<p>return any errors or warnings in this structure.</p>

<h2><a href="../../api/MagickCore/image_8c.html" id="IsHighDynamicRangeImage">IsHighDynamicRangeImage</a></h2>

<p>IsHighDynamicRangeImage() returns MagickTrue if any pixel component is non-integer or exceeds the bounds of the quantum depth (e.g. for Q16 0..65535.</p>

<p>The format of the IsHighDynamicRangeImage method is:</p>

<pre class="text">
MagickBooleanType IsHighDynamicRangeImage(const Image *image,
  ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="IsImageObject">IsImageObject</a></h2>

<p>IsImageObject() returns MagickTrue if the image sequence contains a valid set of image objects.</p>

<p>The format of the IsImageObject method is:</p>

<pre class="text">
MagickBooleanType IsImageObject(const Image *image)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="IsTaintImage">IsTaintImage</a></h2>

<p>IsTaintImage() returns MagickTrue any pixel in the image has been altered since it was first constituted.</p>

<p>The format of the IsTaintImage method is:</p>

<pre class="text">
MagickBooleanType IsTaintImage(const Image *image)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="ModifyImage">ModifyImage</a></h2>

<p>ModifyImage() ensures that there is only a single reference to the image to be modified, updating the provided image pointer to point to a clone of the original image if necessary.</p>

<p>The format of the ModifyImage method is:</p>

<pre class="text">
MagickBooleanType ModifyImage(Image *image,ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="NewMagickImage">NewMagickImage</a></h2>

<p>NewMagickImage() creates a blank image canvas of the specified size and background color.</p>

<p>The format of the NewMagickImage method is:</p>

<pre class="text">
Image *NewMagickImage(const ImageInfo *image_info,const size_t width,
  const size_t height,const PixelInfo *background,
  ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd> </dd>
<dt>width</dt>
<dd>the image width. </dd>

<dd> </dd>
<dt>height</dt>
<dd>the image height. </dd>

<dd> </dd>
<dt>background</dt>
<dd>the image color. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="ReferenceImage">ReferenceImage</a></h2>

<p>ReferenceImage() increments the reference count associated with an image returning a pointer to the image.</p>

<p>The format of the ReferenceImage method is:</p>

<pre class="text">
Image *ReferenceImage(Image *image)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="ResetImagePage">ResetImagePage</a></h2>

<p>ResetImagePage() resets the image page canvas and position.</p>

<p>The format of the ResetImagePage method is:</p>

<pre class="text">
MagickBooleanType ResetImagePage(Image *image,const char *page)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd> </dd>
<dt>page</dt>
<dd>the relative page specification. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="ResetImagePixels">ResetImagePixels</a></h2>

<p>ResetImagePixels() reset the image pixels, that is, all the pixel components are zereod.</p>

<p>The format of the SetImage method is:</p>

<pre class="text">
MagickBooleanType ResetImagePixels(Image *image,
  ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="SetImageAlpha">SetImageAlpha</a></h2>

<p>SetImageAlpha() sets the alpha levels of the image.</p>

<p>The format of the SetImageAlpha method is:</p>

<pre class="text">
MagickBooleanType SetImageAlpha(Image *image,const Quantum alpha,
  ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd> </dd>
<dt>alpha</dt>
<dd>the level of transparency: 0 is fully transparent and QuantumRange is fully opaque. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="SetImageBackgroundColor">SetImageBackgroundColor</a></h2>

<p>SetImageBackgroundColor() initializes the image pixels to the image background color.  The background color is defined by the background_color member of the image structure.</p>

<p>The format of the SetImage method is:</p>

<pre class="text">
MagickBooleanType SetImageBackgroundColor(Image *image,
  ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="SetImageChannelMask">SetImageChannelMask</a></h2>

<p>SetImageChannelMask() sets the image channel mask from the specified channel mask.</p>

<p>The format of the SetImageChannelMask method is:</p>

<pre class="text">
ChannelType SetImageChannelMask(Image *image,
  const ChannelType channel_mask)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd> </dd>
<dt>channel_mask</dt>
<dd>the channel mask. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="SetImageColor">SetImageColor</a></h2>

<p>SetImageColor() set the entire image canvas to the specified color.</p>

<p>The format of the SetImageColor method is:</p>

<pre class="text">
MagickBooleanType SetImageColor(Image *image,const PixelInfo *color,
  ExeptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd> </dd>
<dt>background</dt>
<dd>the image color. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="SetImageStorageClass">SetImageStorageClass</a></h2>

<p>SetImageStorageClass() sets the image class: DirectClass for true color images or PseudoClass for colormapped images.</p>

<p>The format of the SetImageStorageClass method is:</p>

<pre class="text">
MagickBooleanType SetImageStorageClass(Image *image,
  const ClassType storage_class,ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd> </dd>
<dt>storage_class</dt>
<dd> The image class. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="SetImageExtent">SetImageExtent</a></h2>

<p>SetImageExtent() sets the image size (i.e. columns &amp; rows).</p>

<p>The format of the SetImageExtent method is:</p>

<pre class="text">
MagickBooleanType SetImageExtent(Image *image,const size_t columns,
  const size_t rows,ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd> </dd>
<dt>columns</dt>
<dd> The image width in pixels. </dd>

<dd> </dd>
<dt>rows</dt>
<dd> The image height in pixels. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="SetImageInfoBlob">SetImageInfoBlob</a></h2>

<p>SetImageInfoBlob() sets the image info blob member.</p>

<p>The format of the SetImageInfoBlob method is:</p>

<pre class="text">
void SetImageInfoBlob(ImageInfo *image_info,const void *blob,
  const size_t length)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image_info</dt>
<dd>the image info. </dd>

<dd> </dd>
<dt>blob</dt>
<dd>the blob. </dd>

<dd> </dd>
<dt>length</dt>
<dd>the blob length. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="SetImageInfoCustomStream">SetImageInfoCustomStream</a></h2>

<p>SetImageInfoCustomStream() sets the image info custom stream handlers.</p>

<p>The format of the SetImageInfoCustomStream method is:</p>

<pre class="text">
void SetImageInfoCustomStream(ImageInfo *image_info,
  CustomStreamInfo *custom_stream)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image_info</dt>
<dd>the image info. </dd>

<dd> </dd>
<dt>custom_stream</dt>
<dd>your custom stream methods. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="SetImageInfoFile">SetImageInfoFile</a></h2>

<p>SetImageInfoFile() sets the image info file member.</p>

<p>The format of the SetImageInfoFile method is:</p>

<pre class="text">
void SetImageInfoFile(ImageInfo *image_info,FILE *file)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image_info</dt>
<dd>the image info. </dd>

<dd> </dd>
<dt>file</dt>
<dd>the file. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="SetImageMask">SetImageMask</a></h2>

<p>SetImageMask() associates a mask with the image.  The mask must be the same dimensions as the image.</p>

<p>The format of the SetImageMask method is:</p>

<pre class="text">
MagickBooleanType SetImageMask(Image *image,const PixelMask type,
  const Image *mask,ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd> </dd>
<dt>type</dt>
<dd>the mask type, ReadPixelMask or WritePixelMask. </dd>

<dd> </dd>
<dt>mask</dt>
<dd>the image mask. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="SetImageRegionMask">SetImageRegionMask</a></h2>

<p>SetImageRegionMask() associates a mask with the image as defined by the specified region.</p>

<p>The format of the SetImageRegionMask method is:</p>

<pre class="text">
MagickBooleanType SetImageRegionMask(Image *image,const PixelMask type,
  const RectangleInfo *region,ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd> </dd>
<dt>type</dt>
<dd>the mask type, ReadPixelMask or WritePixelMask. </dd>

<dd> </dd>
<dt>geometry</dt>
<dd>the mask region. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="SetImageVirtualPixelMethod">SetImageVirtualPixelMethod</a></h2>

<p>SetImageVirtualPixelMethod() sets the "virtual pixels" method for the image and returns the previous setting.  A virtual pixel is any pixel access that is outside the boundaries of the image cache.</p>

<p>The format of the SetImageVirtualPixelMethod() method is:</p>

<pre class="text">
VirtualPixelMethod SetImageVirtualPixelMethod(Image *image,
  const VirtualPixelMethod virtual_pixel_method,ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd> </dd>
<dt>virtual_pixel_method</dt>
<dd>choose the type of virtual pixel. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="SmushImages">SmushImages</a></h2>

<p>SmushImages() takes all images from the current image pointer to the end of the image list and smushes them to each other top-to-bottom if the stack parameter is true, otherwise left-to-right.</p>

<p>The current gravity setting now effects how the image is justified in the final image.</p>

<p>The format of the SmushImages method is:</p>

<pre class="text">
Image *SmushImages(const Image *images,const MagickBooleanType stack,
  ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>images</dt>
<dd>the image sequence. </dd>

<dd> </dd>
<dt>stack</dt>
<dd>A value other than 0 stacks the images top-to-bottom. </dd>

<dd> </dd>
<dt>offset</dt>
<dd>minimum distance in pixels between images. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="StripImage">StripImage</a></h2>

<p>StripImage() strips an image of all profiles and comments.</p>

<p>The format of the StripImage method is:</p>

<pre class="text">
MagickBooleanType StripImage(Image *image,ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image</dt>
<dd>the image. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
<h2><a href="../../api/MagickCore/image_8c.html" id="SyncImageSettings">SyncImageSettings</a></h2>

<p>SyncImageSettings() syncs any image_info global options into per-image attributes.</p>

<p>Note: in IMv6 free form 'options' were always mapped into 'artifacts', so that operations and coders can find such settings.  In IMv7 if a desired per-image artifact is not set, then it will directly look for a global option as a fallback, as such this copy is no longer needed, only the link set up.</p>

<p>The format of the SyncImageSettings method is:</p>

<pre class="text">
MagickBooleanType SyncImageSettings(const ImageInfo *image_info,
  Image *image,ExceptionInfo *exception)
MagickBooleanType SyncImagesSettings(const ImageInfo *image_info,
  Image *image,ExceptionInfo *exception)
</pre>

<p>A description of each parameter follows:</p>

<dd>
</dd>

<dd> </dd>
<dl class="dl-horizontal">
<dt>image_info</dt>
<dd>the image info. </dd>

<dd> </dd>
<dt>image</dt>
<dd>the image. </dd>

<dd> </dd>
<dt>exception</dt>
<dd>return any errors or warnings in this structure. </dd>

<dd>  </dd>
</dl>
</div>
    </div>
  </main><!-- /.container -->
  <footer class="magick-footer">
    <div class="container">
    <p><a href="../www/security-policy.html">Security</a> •
    <a href="../www/news.html">News</a>
     
    <a href="image.html#"><img class="d-inline" id="wand" alt="And Now a Touch of Magick" width="16" height="16" src="../../images/wand.ico"/></a>
     
    <a href="../www/links.html">Related</a> •
     <a href="../www/sitemap.html">Sitemap</a>
    <br/>
    <a href="../www/support.html">Sponsor</a> •
    <a href="../www/cite.html">Cite</a> •
    <a href="http://pgp.mit.edu/pks/lookup?op=get&amp;search=0x89AB63D48277377A">Public Key</a> •
    <a href="../www/contact.html">Contact Us</a> 
    <br/>
    <a href="https://github.com/imagemagick/imagemagick" target="_blank" rel="noopener" aria-label="GitHub"><svg xmlns="http://www.w3.org/2000/svg" class="navbar-nav-svg" viewBox="0 0 512 499.36" width="2%" height="2%" role="img" focusable="false"><title>GitHub</title><path fill="currentColor" fill-rule="evenodd" d="M256 0C114.64 0 0 114.61 0 256c0 113.09 73.34 209 175.08 242.9 12.8 2.35 17.47-5.56 17.47-12.34 0-6.08-.22-22.18-.35-43.54-71.2 15.49-86.2-34.34-86.2-34.34-11.64-29.57-28.42-37.45-28.42-37.45-23.27-15.84 1.73-15.55 1.73-15.55 25.69 1.81 39.21 26.38 39.21 26.38 22.84 39.12 59.92 27.82 74.5 21.27 2.33-16.54 8.94-27.82 16.25-34.22-56.84-6.43-116.6-28.43-116.6-126.49 0-27.95 10-50.8 26.35-68.69-2.63-6.48-11.42-32.5 2.51-67.75 0 0 21.49-6.88 70.4 26.24a242.65 242.65 0 0 1 128.18 0c48.87-33.13 70.33-26.24 70.33-26.24 14 35.25 5.18 61.27 2.55 67.75 16.41 17.9 26.31 40.75 26.31 68.69 0 98.35-59.85 120-116.88 126.32 9.19 7.9 17.38 23.53 17.38 47.41 0 34.22-.31 61.83-.31 70.23 0 6.85 4.61 14.81 17.6 12.31C438.72 464.97 512 369.08 512 256.02 512 114.62 397.37 0 256 0z"/></svg></a> •
        <a href="https://twitter.com/imagemagick" target="_blank" rel="noopener" aria-label="Twitter"><svg xmlns="http://www.w3.org/2000/svg" class="navbar-nav-svg" viewBox="0 0 512 416.32" width="2%" height="2%" role="img" focusable="false"><title>Twitter</title><path fill="currentColor" d="M160.83 416.32c193.2 0 298.92-160.22 298.92-298.92 0-4.51 0-9-.2-13.52A214 214 0 0 0 512 49.38a212.93 212.93 0 0 1-60.44 16.6 105.7 105.7 0 0 0 46.3-58.19 209 209 0 0 1-66.79 25.37 105.09 105.09 0 0 0-181.73 71.91 116.12 116.12 0 0 0 2.66 24c-87.28-4.3-164.73-46.3-216.56-109.82A105.48 105.48 0 0 0 68 159.6a106.27 106.27 0 0 1-47.53-13.11v1.43a105.28 105.28 0 0 0 84.21 103.06 105.67 105.67 0 0 1-47.33 1.84 105.06 105.06 0 0 0 98.14 72.94A210.72 210.72 0 0 1 25 370.84a202.17 202.17 0 0 1-25-1.43 298.85 298.85 0 0 0 160.83 46.92"/></svg></a>
    <br/>
    <small>© 1999-2021 ImageMagick Studio LLC</small></p>
    <div>
  </footer>

  <!-- Javascript assets -->
  <script>window.jQuery || document.write('<script src="../assets/jquery.slim.min.js"><\/script>')</script><script src="../assets/bootstrap.bundle.min.js" integrity="sha384-LtrjvnR4Twt/qOuYxE721u19sVFLVSA4hf/rRt6PrZTmiPltdZcI7q7PXQBYTKyf" crossorigin="anonymous">
</body>
</html>
