The MagickWand API is the recommended interface between the C programming language and the ImageMagick image processing libraries. Unlike the MagickCore C API, MagickWand uses only a few opaque types. Accessors are available to set or get important wand properties. A description of the MagickWand public methods are found here:

- Magick Wand Methods
- Set or Get Magick Wand Properties
- Magick Wand Image Methods
- Pixel Iterator Methods
- Pixel Wand Methods
- Image Vector Drawing
- Deprecated Methods

After you write your MagickWand program, compile it like this:

      cc `MagickWand-config --cflags --cppflags` wand.c `MagickWand-config --ldflags --libs`

Here is a example program that utilizes the MagickWand API to get you started, wand.c. It reads an image, creates a thumbnail, and writes the result to disk.

    #include <stdio.h>
    #include <stdlib.h>
    #include <wand/MagickWand.h>

    int main(int argc,char **argv)
    {
    #define ThrowWandException(wand) \
    { \
      char \
        *description; \
     \
      ExceptionType \
        severity; \
     \
      description=MagickGetException(wand,&severity); \
      (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
      description=(char *) MagickRelinquishMemory(description); \
      exit(-1); \
    }

      MagickBooleanType
        status;

      MagickWand
        *magick_wand;

      if (argc != 3)
        {
          (void) fprintf(stdout,"Usage: %s image thumbnail\n",argv[0]);
          exit(0);
        }
      /*
        Read an image.
      */
      MagickWandGenesis();
      magick_wand=NewMagickWand();
      status=MagickReadImage(magick_wand,argv[1]);
      if (status == MagickFalse)
        ThrowWandException(magick_wand);
      /*
        Turn the images into a thumbnail sequence.
      */
      MagickResetIterator(magick_wand);
      while (MagickNextImage(magick_wand) != MagickFalse)
        MagickResizeImage(magick_wand,106,80,LanczosFilter,1.0);
      /*
        Write the image then destroy it.
      */
      status=MagickWriteImages(magick_wand,argv[2],MagickTrue);
      if (status == MagickFalse)
        ThrowWandException(magick_wand);
      magick_wand=DestroyMagickWand(magick_wand);
      MagickWandTerminus();
      return(0);
    }

Here is another program that shows one way to get and set image pixels with the MagickWand API, contrast.c. It reads an image, applies sigmoidal non-linearity contrast control, and writes the result to disk.

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <wand/MagickWand.h>

    int main(int argc,char **argv)
    {
    #define QuantumScale  ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
    #define SigmoidalContrast(x) \
      (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
    #define ThrowWandException(wand) \
    { \
      char \
        *description; \
     \
      ExceptionType \
        severity; \
     \
      description=MagickGetException(wand,&severity); \
      (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
      description=(char *) MagickRelinquishMemory(description); \
      exit(-1); \
    }

      long
        y;

      MagickBooleanType
        status;

      MagickPixelPacket
        pixel;

      MagickWand
        *contrast_wand,
        *image_wand;

      PixelIterator
        *contrast_iterator,
        *iterator;

      PixelWand
        **contrast_pixels,
        **pixels;

      register long
        x;

      unsigned long
        width;

      if (argc != 3)
        {
          (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
          exit(0);
        }
      /*
        Read an image.
      */
      MagickWandGenesis();
      image_wand=NewMagickWand();
      status=MagickReadImage(image_wand,argv[1]);
      if (status == MagickFalse)
        ThrowWandException(image_wand);
      contrast_wand=CloneMagickWand(image_wand);
      /*
        Sigmoidal non-linearity contrast control.
      */
      iterator=NewPixelIterator(image_wand);
      contrast_iterator=NewPixelIterator(contrast_wand);
      if ((iterator == (PixelIterator *) NULL) ||
          (contrast_iterator == (PixelIterator *) NULL))
        ThrowWandException(image_wand);
      for (y=0; y < (long) MagickGetImageHeight(image_wand); y++)
      {
        pixels=PixelGetNextIteratorRow(iterator,&width);
        contrast_pixels=PixelGetNextIteratorRow(contrast_iterator,&width);
        if ((pixels == (PixelWand **) NULL) ||
            (contrast_pixels == (PixelWand **) NULL))
          break;
        for (x=0; x < (long) width; x++)
        {
          PixelGetMagickColor(pixels[x],&pixel);
          pixel.red=SigmoidalContrast(pixel.red);
          pixel.green=SigmoidalContrast(pixel.green);
          pixel.blue=SigmoidalContrast(pixel.blue);
          pixel.index=SigmoidalContrast(pixel.index);
          PixelSetMagickColor(contrast_pixels[x],&pixel);
        }
        (void) PixelSyncIterator(contrast_iterator);
      }
      if (y < (long) MagickGetImageHeight(image_wand))
        ThrowWandException(image_wand);
      contrast_iterator=DestroyPixelIterator(contrast_iterator);
      iterator=DestroyPixelIterator(iterator);
      image_wand=DestroyMagickWand(image_wand);
      /*
        Write the image then destroy it.
      */
      status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
      if (status == MagickFalse)
        ThrowWandException(image_wand);
      contrast_wand=DestroyMagickWand(contrast_wand);
      MagickWandTerminus();
      return(0);
    }

Discourse Server • Mailing Lists • Cafe • Studio