#include <stdio.h> #include <MagickWand/MagickWand.h> /* set this to true to test loops methods with a empty wand */ #define TEST_EMPTY_WAND 0 /* Simplify the exception handling * technically we should abort the program if * severity >= ErrorException */ void ThrowWandException(MagickWand *wand) { char *description; ExceptionType severity; description=MagickGetException(wand,&severity); (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); description=(char *) MagickRelinquishMemory(description); } /* useful function especially after appending two wands together */ #define SwapWands(a,b) { MagickWand *tmp=a; a=b; b=tmp; } int main(int argc, char *argv[]) { MagickWand *wand, *output; MagickBooleanType status; MagickWandGenesis(); printf("Read in a list of 6 images...\n"); wand = NewMagickWand(); #if !TEST_EMPTY_WAND status = MagickReadImage(wand, "font_0.gif" ) && MagickReadImage(wand, "font_1.gif" ) && MagickReadImage(wand, "font_2.gif" ) && MagickReadImage(wand, "font_3.gif" ) && MagickReadImage(wand, "font_4.gif" ) && MagickReadImage(wand, "font_5.gif" ); if (status == MagickFalse) ThrowWandException(wand); #endif printf("I actually read in %u images\n", (unsigned) MagickGetNumberImages(wand) ); printf("\n"); printf("After reading current image is #%d \"%s\"\n", (unsigned) MagickGetIteratorIndex(wand), MagickGetImageFilename(wand) ); printf("\n"); // Note that using MagickGetIteratorIndex() is slower than just // keeping track of the current image index yourself! But not a great cost. printf("Standard 'Reset while Next' loop through images\n"); // keeping track of it to start with! MagickResetIterator(wand); while (MagickNextImage(wand) != MagickFalse) printf("image #%u \"%s\"\n", (unsigned) MagickGetIteratorIndex(wand), MagickGetImageFilename(wand) ); printf("\n"); printf("At this point, any image 'added' to wand will be appended!\n"); printf("This special condition can be set by using either\n"); printf("just MagickSetLastIterator(w)\n"); printf("or MagickSetIteratorIndex(w,-1)\n"); printf("\n"); printf("Now that we are at the end, lets loop backward using 'Previous'\n"); while (MagickPreviousImage(wand) != MagickFalse) printf("image #%u \"%s\"\n", (unsigned) MagickGetIteratorIndex(wand), MagickGetImageFilename(wand) ); printf("\n"); printf("Note at this point, any image 'added' to wand will be prepended!\n"); printf("This special condition can be set by using either\n"); printf("just MagickSetFirstIterator(w)\n"); printf("Or MagickResetIterator(w); MagickPreviousImage(w);\n"); printf("The latter method being the cause of the current condition\n"); printf("\n"); printf("Directly loop though images backward using 'Last, while Previous'\n"); MagickSetLastIterator(wand); while ( MagickPreviousImage(wand) != MagickFalse ) printf("image #%u \"%s\"\n", (unsigned) MagickGetIteratorIndex(wand), MagickGetImageFilename(wand) ); printf("\n"); printf("Loop through images using Indexes, in a weird flip-flop way!\n"); printf("Note that indexing using a negative number, indexes from end \n"); { ssize_t i; ssize_t n = (ssize_t) MagickGetNumberImages(wand); for ( i=0; i!=n; i= (i>=0) ? -(i+1):-i ) { (void) MagickSetIteratorIndex(wand,i); /* Note that a return of MagickFalse by the above is not actually an * error (no exception will be generated). It just means that the * index value used (positive or negative) is too large for the * size of the current image list (EG: range error: -n <= i < n ) * When it does happen, no change is made to the current image */ printf("index %2d -> #%u \"%s\"\n", (int) i, (unsigned) MagickGetIteratorIndex(wand), MagickGetImageFilename(wand) ); } } printf("\n"); wand=DestroyMagickWand(wand); MagickWandTerminus(); }