| #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(); |
| } |
| |