<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" 
  "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html version="-//W3C//DTD XHTML 1.1//EN"
      xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.w3.org/1999/xhtml
                          http://www.w3.org/MarkUp/SCHEMA/xhtml11.xsd">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
  <meta name="verify-v1" content="g222frIIxcQTrvDR3NBRUSKP3AnMNoqxOkIniCEkV7U="/>
  <title>ImageMagick: MagickCore, C API for ImageMagick: Working with Image Lists</title>
  <meta http-equiv="Content-Language" content="en-US"/>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  <meta http-equiv="Reply-to" content="magick-users@imagemagick.org"/>
  <meta name="Application-name" content="ImageMagick"/>
  <meta name="Description" content="Use ImageMagick to convert, edit, or compose bitmap images in a variety of formats.  In addition resize, rotate, shear, distort and transform images."/>
  <meta name="Application-url" content="http://www.imagemagick.org"/>
  <meta name="Generator" content="PHP"/>
  <meta name="Keywords" content="magickcore, c, api, for, imagemagick:, working, with, image, lists, ImageMagick, ImageMagic, MagickCore, MagickWand, PerlMagick, Magick++, RMagick, PythonMagick, JMagick, TclMagick, Image, Magick, Magic, Wand, ImageMagickObject, Swiss, Army, Knife, Image, Processing"/>
  <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-2011 ImageMagick Studio LLC"/>
  <meta name="Distribution" content="Global"/>
  <link rel="icon" href="../../images/wand.png"/>
  <link rel="shortcut icon" href="../../images/wand.ico"  type="images/x-icon"/>
  <link rel="meta" type="application/rdf+xml" title="ICI" href="http://imagemagick.org/ici.rdf"/>
  <link rel="stylesheet" href="http://www.google.com/cse/style/look/default.css" type="text/css" />
  <style type="text/css" media="all">
    @import url("../../www/magick.css");
  </style>
  <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
  <script type="text/javascript" src="../fancybox/jquery.fancybox-1.3.4.pack.js"></script>
  <link rel="stylesheet" type="text/css" href="../fancybox/jquery.fancybox-1.3.4.css" media="screen" />
  <script type="text/javascript">
    $(document).ready(function() {
      $("a[href$=.jpg],a[href$=.png],a[href$=.gif]").fancybox({
        'transitionIn'  : 'elastic',
        'transitionOut' : 'elastic',
        'overlayShow'   : false,
        'opacity'       : true
      });
    });
  </script>
</head>

<body id="www-imagemagick-org">
<div class="titlebar">
<div style="margin: 17px auto; float: left;">
  <script type="text/javascript">
  <!--
    google_ad_client = "pub-3129977114552745";
    google_ad_slot = "5439289906";
    google_ad_width = 728;
    google_ad_height = 90;
  //-->
  </script>
  <script type="text/javascript"
    src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
  </script>
</div>
<a href="http://www.imagemagick.org/discourse-server/">
  <img src="../../images/logo.jpg"
  alt="ImageMagick Logo"
  style="width: 123px; height: 118px; border: 0px; float: right;" /></a>
<a href="../../index.html">
  <img src="../../images/sprite.jpg"
  alt="ImageMagick Sprite"
  style="width: 114px; height: 118px; border: 0px; float: right;" /></a>
</div>

<div class="westbar">

<div class="menu">
  <a title="About ImageMagick" href="../../index.html">About ImageMagick</a>
</div>
<div class="sep"></div>
<div class="menu">
  <a title="Binary Releases" href="../../www/binary-releases.html">Binary Releases</a>
</div>
<div class="sub">
    <a title="Binary Release: Unix" href="../../www/binary-releases.html#unix">Unix</a>
</div>
<div class="sub">
    <a title="Binary Release: MacOS X" href="../../www/binary-releases.html#macosx">Mac OS X</a>
</div>
<div class="sub">
    <a title="Binary Release: iPhone" href="../../www/binary-releases.html#iPhone">iPhone</a>
</div>
<div class="sub">
    <a title="Binary Release: Windows" href="../../www/binary-releases.html#windows">Windows</a>
</div>
<div class="sep"></div>
<div class="menu">
  <a title="Command-line Tools" href="../../www/command-line-tools.html">Command-line Tools</a>
</div>
<div class="sub">
    <a title="Command-line Tools: Processing" href="../../www/command-line-processing.html">Processing</a>
</div>
<div class="sub">
    <a title="Command-line Tools: Options" href="../../www/command-line-options.html">Options</a>
</div>
<div class="sub">
    <a title="Command-line Tools: Usage" href="http://www.imagemagick.org/Usage/">Usage</a>
</div>
<div class="menu">
  <a title="Program Interfaces" href="../../www/api.html">Program Interfaces</a>
</div>
<div class="sub">
    <a title="Program Interface: MagickWand" href="../../www/magick-wand.html">MagickWand</a>
</div>
<div class="sub">
    <a title="Program Interface: MagickCore" href="../../www/magick-core.html">MagickCore</a>
</div>
<div class="sub">
    <a title="Program Interface: PerlMagick" href="../../www/perl-magick.html">PerlMagick</a>
</div>
<div class="sub">
    <a title="Program Interface: Magick++" href="../../www/magick++.html">Magick++</a>
</div>
<div class="sep"></div>
<div  class="menu">
   <a title="Install from Source" href="../../www/install-source.html">Install from Source</a>
</div>
<div class="sub">
    <a title="Install from Source: Unix" href="../../www/install-source.html#unix">Unix</a>
</div>
<div class="sub">
    <a title="Install from Source: Windows" href="../../www/install-source.html#windows">Windows</a>
 </div>
<div class="menu">
  <a title="Resources" href="../../www/resources.html">Resources</a>
</div>
<div class="menu">
  <a title="Architecture" href="../../www/architecture.html">Architecture</a>
</div>
<div class="menu">
  <a title="Download" href="../../www/download.html">Download</a>
</div>
<div class="sep"></div>
<div class="menu">
  <a title="Search" href="../../www/search.html">Search</a>
</div>
<div class="sep"></div>
<div class="menu">
  <a title="Site Map" href="../../www/sitemap.html">Site Map</a>
</div>
<div  class="sub">
  <a title="Site Map: Links" href="../../www/links.html">Links</a>
</div>
<div class="sep"></div>
<div  class="menu">
  <a rel="follow" title="Sponsors" href="../../www/sponsors.html">Sponsors:</a>

<a href="http://www.networkredux.com">
  <img src="../../images/networkredux.png" alt="[sponsor]"
  style="margin-top: 4px; margin-left: 4px; border: 0px; float: left;" /></a>
<div class="sponsbox">
<div  class="sponsor">
  <a rel="follow" title="Sponsor: Website Hosting" href="http://www.hostreviewgeeks.com">Website Hosting</a><!-- 201109010090 alexanian media -->
</div>
<div  class="sponsor">
  <a rel="follow" title="Sponsor: Druckerei" href="http://www.allesdruck.de">Druckerei</a><!-- 201303011500 r.leo -->
</div>
<div  class="sponsor">
  <a rel="follow" title="Sponsor: Hotel München" href="http://www.messehotel-erb-muenchen.de">Hotel München</a><!-- 201111010450 cerb -->
</div>
<div  class="sponsor">
  <a rel="follow" title="Sponsor: Best Web Hosting" href="http://webhostinggeeks.com">Best Web Hosting</a><!-- 201110010720 -->
</div>
<div  class="sponsor">
  <a rel="follow" title="Sponsor: Flyer drucken" href="http://www.online-druck.biz">Flyer drucken</a><!-- 201109010900 Floeter-->
</div>
<div  class="sponsor">
  <a rel="follow" title="Sponsor: Web Hosting Reviews" href="http://www.webhostingmasters.com">Web Hosting Reviews</a><!-- 201107011500 affliatelabel -->
</div>
<div  class="sponsor">
  <a rel="follow" title="Sponsor: Druckerei" href="http://print24.com/de/">Druckerei</a><!-- 201110010720 -->
</div>
<div  class="sponsor">
  <a rel="follow" title="Sponsor: Web Hosting Ratings" href="http://webhostingrating.com">Web Hosting Ratings</a><!-- 201110010720 -->
</div>
<div  class="sponsor">
   <a rel="follow" title="Sponsor: Free Catalogs" href="http://www.who-sells-it.com/">Free Catalogs</a><!-- 20120801000600 -->
</div>
</div>
</div>
</div>

<div class="eastbar">

</div>

<div class="main">

<h1>Module list Methods</h1>
<p class="navigation-index">[<a href="#AppendImageToList">AppendImageToList</a> &bull; <a href="#CloneImageList">CloneImageList</a> &bull; <a href="#CloneImages">CloneImages</a> &bull; <a href="#DeleteImageFromList">DeleteImageFromList</a> &bull; <a href="#DeleteImages">DeleteImages</a> &bull; <a href="#DestroyImageList">DestroyImageList</a> &bull; <a href="#DuplicateImages">DuplicateImages</a> &bull; <a href="#GetFirstImageInList">GetFirstImageInList</a> &bull; <a href="#GetImageFromList">GetImageFromList</a> &bull; <a href="#GetImageIndexInList">GetImageIndexInList</a> &bull; <a href="#GetImageListLength">GetImageListLength</a> &bull; <a href="#GetLastImageInList">GetLastImageInList</a> &bull; <a href="#GetNextImageInList">GetNextImageInList</a> &bull; <a href="#GetPreviousImageInList">GetPreviousImageInList</a> &bull; <a href="#ImageListToArray">ImageListToArray</a> &bull; <a href="#InsertImageInList">InsertImageInList</a> &bull; <a href="#NewImageList">NewImageList</a> &bull; <a href="#PrependImageToList">PrependImageToList</a> &bull; <a href="#RemoveImageFromList">RemoveImageFromList</a> &bull; <a href="#RemoveFirstImageFromList">RemoveFirstImageFromList</a> &bull; <a href="#RemoveLastImageFromList">RemoveLastImageFromList</a> &bull; <a href="#ReplaceImageInList">ReplaceImageInList</a> &bull; <a href="#ReplaceImageInListReturnLast">ReplaceImageInListReturnLast</a> &bull; <a href="#ReverseImageList">ReverseImageList</a> &bull; <a href="#SpliceImageIntoList">SpliceImageIntoList</a> &bull; <a href="#SplitImageList">SplitImageList</a>]</p>

<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="AppendImageToList">AppendImageToList</a></h2>
<div class="doc-section">

<p>AppendImageToList() appends the second image list to the end of the first list.  The given image list pointer is left unchanged, unless it was empty.</p>

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

<pre class="code">
  AppendImageToList(Image *images,const Image *image)
</pre>

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

<h5>images</h5>
<p>the image list to be appended to.</p>

<h5>image</h5>
<p>the appended image or image list.</p>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="CloneImageList">CloneImageList</a></h2>
<div class="doc-section">

<p>CloneImageList() returns a duplicate of the image list.</p>

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

<pre class="code">
  Image *CloneImageList(const Image *images,ExceptionInfo *exception)
</pre>

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

<h5>images</h5>
<p>the image list.</p>

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

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="CloneImages">CloneImages</a></h2>
<div class="doc-section">

<p>CloneImages() clones one or more images from an image sequence, using a comma separated list of image numbers or ranges.</p>

<p>The numbers start at 0 for the first image in the list, while negative numbers refer to images starting counting from the end of the range. Images may be refered to multiple times to clone them multiple times. Images refered beyond the available number of images in list are ignored.</p>

<p>Images referenced may be reversed, and results in a clone of those images also being made with a reversed order.</p>

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

<pre class="code">
  Image *CloneImages(const Image *images,const char *scenes,
    ExceptionInfo *exception)
</pre>

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

<h5>images</h5>
<p>the image sequence.</p>

<h5>scenes</h5>
<p>This character string specifies which scenes to clone (e.g. 1,3-5,7-3,2).</p>

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

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="DeleteImageFromList">DeleteImageFromList</a></h2>
<div class="doc-section">

<p>DeleteImageFromList() deletes an image from the list. List pointer is moved to the next image, if one is present. See RemoveImageFromList().</p>

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

<pre class="code">
  DeleteImageFromList(Image **images)
</pre>

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

<h5>images</h5>
<p>the image list.</p>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="DeleteImages">DeleteImages</a></h2>
<div class="doc-section">

<p>DeleteImages() deletes one or more images from an image sequence, using a comma separated list of image numbers or ranges.</p>

<p>The numbers start at 0 for the first image, while negative numbers refer to images starting counting from the end of the range. Images may be refered to multiple times without problems. Image refered beyond the available number of images in list are ignored.</p>

<p>If the referenced images are in the reverse order, that range will be completely ignored, unlike CloneImages().</p>

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

<pre class="code">
  DeleteImages(Image **images,const char *scenes,ExceptionInfo *exception)
</pre>

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

<h5>images</h5>
<p>the image sequence.</p>

<h5>scenes</h5>
<p>This character string specifies which scenes to delete (e.g. 1,3-5,-2-6,2).</p>

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

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="DestroyImageList">DestroyImageList</a></h2>
<div class="doc-section">

<p>DestroyImageList() destroys an image list.</p>

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

<pre class="code">
  Image *DestroyImageList(Image *image)
</pre>

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

<h5>image</h5>
<p>the image sequence.</p>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="DuplicateImages">DuplicateImages</a></h2>
<div class="doc-section">

<p>DuplicateImages() duplicates one or more images from an image sequence, using a count and a comma separated list of image numbers or ranges.</p>

<p>The numbers start at 0 for the first image, while negative numbers refer to images starting counting from the end of the range. Images may be refered to multiple times without problems. Image refered beyond the available number of images in list are ignored.</p>

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

<pre class="code">
  Image *DuplicateImages(Image *images,const size_t number_duplicates,
    const char *scenes,ExceptionInfo *exception)
</pre>

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

<h5>images</h5>
<p>the image sequence.</p>

<h5>number_duplicates</h5>
<p>duplicate the image sequence this number of times.</p>

<h5>scenes</h5>
<p>This character string specifies which scenes to duplicate (e.g. 1,3-5,-2-6,2).</p>

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

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="GetFirstImageInList">GetFirstImageInList</a></h2>
<div class="doc-section">

<p>GetFirstImageInList() returns a pointer to the first image in the list.</p>

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

<pre class="code">
  Image *GetFirstImageInList(const Image *images)
</pre>

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

<h5>images</h5>
<p>the image list.</p>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="GetImageFromList">GetImageFromList</a></h2>
<div class="doc-section">

<p>GetImageFromList() returns an image at the specified offset from the list.</p>

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

<pre class="code">
  Image *GetImageFromList(const Image *images,const ssize_t index)
</pre>

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

<h5>images</h5>
<p>the image list.</p>

<h5>index</h5>
<p>the position within the list.</p>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="GetImageIndexInList">GetImageIndexInList</a></h2>
<div class="doc-section">

<p>GetImageIndexInList() returns the offset in the list of the specified image.</p>

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

<pre class="code">
  ssize_t GetImageIndexInList(const Image *images)
</pre>

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

<h5>images</h5>
<p>the image list.</p>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="GetImageListLength">GetImageListLength</a></h2>
<div class="doc-section">

<p>GetImageListLength() returns the length of the list (the number of images in the list).</p>

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

<pre class="code">
  size_t GetImageListLength(const Image *images)
</pre>

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

<h5>images</h5>
<p>the image list.</p>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="GetLastImageInList">GetLastImageInList</a></h2>
<div class="doc-section">

<p>GetLastImageInList() returns a pointer to the last image in the list.</p>

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

<pre class="code">
  Image *GetLastImageInList(const Image *images)
</pre>

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

<h5>images</h5>
<p>the image list.</p>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="GetNextImageInList">GetNextImageInList</a></h2>
<div class="doc-section">

<p>GetNextImageInList() returns the next image in the list.</p>

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

<pre class="code">
  Image *GetNextImageInList(const Image *images)
</pre>

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

<h5>images</h5>
<p>the image list.</p>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="GetPreviousImageInList">GetPreviousImageInList</a></h2>
<div class="doc-section">

<p>GetPreviousImageInList() returns the previous image in the list.</p>

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

<pre class="code">
  Image *GetPreviousImageInList(const Image *images)
</pre>

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

<h5>images</h5>
<p>the image list.</p>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="ImageListToArray">ImageListToArray</a></h2>
<div class="doc-section">

<p>ImageListToArray() is a convenience method that converts an image list to a sequential array.  For example,</p>

<p>group = ImageListToArray(images, exception); while (i = 0; group[i] != (Image *) NULL; i++) printf("s\n", group[i]->filename); printf("d images\n", i); group = RelinquishMagickMemory(group);</p>

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

<pre class="code">
  Image **ImageListToArray(const Image *images,ExceptionInfo *exception)
</pre>

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

<h5>image</h5>
<p>the image list.</p>

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

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="InsertImageInList">InsertImageInList</a></h2>
<div class="doc-section">

<p>InsertImageInList() inserts the second image or image list into the first image list immediately after the image pointed to.  The given image list pointer is unchanged unless previously empty.</p>

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

<pre class="code">
  InsertImageInList(Image **images,Image *image)
</pre>

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

<h5>images</h5>
<p>the image list to insert into.</p>

<h5>image</h5>
<p>the image list to insert.</p>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="NewImageList">NewImageList</a></h2>
<div class="doc-section">

<p>NewImageList() creates an empty image list.</p>

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

<pre class="code">
  Image *NewImageList(void)
</pre>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="PrependImageToList">PrependImageToList</a></h2>
<div class="doc-section">

<p>PrependImageToList() prepends the image to the beginning of the list.</p>

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

<pre class="code">
  PrependImageToList(Image *images,Image *image)
</pre>

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

<h5>images</h5>
<p>the image list.</p>

<h5>image</h5>
<p>the image.</p>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="RemoveImageFromList">RemoveImageFromList</a></h2>
<div class="doc-section">

<p>RemoveImageFromList() removes and returns the image pointed to.</p>

<p>The given image list pointer is set to point to the next image in list if it exists, otherwise it is set to the previous image, or NULL if list was emptied.</p>

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

<pre class="code">
  Image *RemoveImageFromList(Image **images)
</pre>

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

<h5>images</h5>
<p>the image list.</p>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="RemoveFirstImageFromList">RemoveFirstImageFromList</a></h2>
<div class="doc-section">

<p>RemoveFirstImageFromList() removes and returns the first image in the list.</p>

<p>If the given image list pointer pointed to the removed first image, it is set to the new first image of list, or NULL if list was emptied, otherwise it is left as is.</p>

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

<pre class="code">
  Image *RemoveFirstImageFromList(Image **images)
</pre>

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

<h5>images</h5>
<p>the image list.</p>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="RemoveLastImageFromList">RemoveLastImageFromList</a></h2>
<div class="doc-section">

<p>RemoveLastImageFromList() removes and returns the last image from the list.</p>

<p>If the given image list pointer pointed to the removed last image, it is set to the new last image of list, or NULL if list was emptied, otherwise it is left as is.</p>

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

<pre class="code">
  Image *RemoveLastImageFromList(Image **images)
</pre>

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

<h5>images</h5>
<p>the image list.</p>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="ReplaceImageInList">ReplaceImageInList</a></h2>
<div class="doc-section">

<p>ReplaceImageInList() replaces an image in the list with the given image, or list of images.  Old image is destroyed.  The image list pointer is set to point to the first image of the inserted list of images.</p>

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

<pre class="code">
  ReplaceImageInList(Image **images,Image *image)
</pre>

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

<h5>images</h5>
<p>the list and pointer to image to replace</p>

<h5>image</h5>
<p>the image or image list replacing the original</p>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="ReplaceImageInListReturnLast">ReplaceImageInListReturnLast</a></h2>
<div class="doc-section">

<p>ReplaceImageInListReturnLast() is exactly as ReplaceImageInList() except the image pointer is set to the last image in the list.</p>

<p>This allows you to simply use 'next' to go to the image that follows the just replaced image.</p>

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

<pre class="code">
  ReplaceImageInListReturnLast(Image **images,Image *image)
</pre>

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

<h5>images</h5>
<p>the list and pointer to image to replace</p>

<h5>image</h5>
<p>the image or image list replacing the original</p>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="ReverseImageList">ReverseImageList</a></h2>
<div class="doc-section">

<p>ReverseImageList() reverses the order of an image list. The list pointer is reset to that start of the re-ordered list.</p>

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

<pre class="code">
  void ReverseImageList(Image **images)
</pre>

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

<h5>images</h5>
<p>the image list.</p>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="SpliceImageIntoList">SpliceImageIntoList</a></h2>
<div class="doc-section">

<p>SpliceImageIntoList() removes 'length' images from the list and replaces them with the specified splice. Removed images are returned.</p>

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

<pre class="code">
  SpliceImageIntoList(Image **images,const size_t,
    const Image *splice)
</pre>

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

<h5>images</h5>
<p>the image list.</p>

<h5>length</h5>
<p>the length of the image list to remove.</p>

<h5>splice</h5>
<p>Replace the removed image list with this list.</p>

 </div>
<h2><a href="http://www.imagemagick.org/api/MagickCore/list_8c.html" id="SplitImageList">SplitImageList</a></h2>
<div class="doc-section">

<p>SplitImageList() splits an image into two lists, after given image The list that was split off is returned, which may be empty.</p>

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

<pre class="code">
  Image *SplitImageList(Image *images)
</pre>

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

<h5>images</h5>
<p>the image list.</p>

 </div>

</div>

<div id="linkbar">
    <span id="linkbar-west">&nbsp;</span>
    <span id="linkbar-center">
      <a href="http://www.imagemagick.org/discourse-server/">Discourse Server</a> &bull;
      <a href="http://www.imagemagick.org/MagickStudio/scripts/MagickStudio.cgi">Studio</a>
    </span>
    <span id="linkbar-east">&nbsp;</span>
  </div>
  <div class="footer">
    <span id="footer-west">&copy; 1999-2011 ImageMagick Studio LLC</span>
    <span id="footer-east"> <a href="../http://www.imagemagick.org/script/contact.php">Contact the Wizards</a></span>
  </div>
  <div style="clear: both; margin: 0; width: 100%; "></div>
  <script type="text/javascript">
    var _gaq = _gaq || [];
    _gaq.push(['_setAccount', 'UA-17690367-1']);
    _gaq.push(['_trackPageview']);

    (function() {
      var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
      ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
      var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
    })();
  </script>
</body>
</html>
