129 lines
4.1 KiB
C
129 lines
4.1 KiB
C
#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();
|
|
}
|
|
|