Home | History | Annotate | Download | only in source
      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <math.h>
      4 #include <wand/MagickWand.h>
      5 
      6 int main(int argc,char **argv)
      7 {
      8 #define QuantumScale  ((MagickRealType) 1.0/(MagickRealType) QuantumRange)
      9 #define SigmoidalContrast(x) \
     10   (QuantumRange*(1.0/(1+exp(10.0*(0.5-QuantumScale*x)))-0.0066928509)*1.0092503)
     11 #define ThrowWandException(wand) \
     12 { \
     13   char \
     14     *description; \
     15  \
     16   ExceptionType \
     17     severity; \
     18  \
     19   description=MagickGetException(wand,&severity); \
     20   (void) fprintf(stderr,"%s %s %lu %s\n",GetMagickModule(),description); \
     21   description=(char *) MagickRelinquishMemory(description); \
     22   exit(-1); \
     23 }
     24 
     25   MagickBooleanType
     26     status;
     27 
     28   MagickPixelPacket
     29     pixel;
     30 
     31   MagickWand
     32     *contrast_wand,
     33     *image_wand;
     34 
     35   PixelIterator
     36     *contrast_iterator,
     37     *iterator;
     38 
     39   PixelWand
     40     **contrast_pixels,
     41     **pixels;
     42 
     43   register ssize_t
     44     x;
     45 
     46   size_t
     47     width;
     48 
     49   ssize_t
     50     y;
     51 
     52   if (argc != 3)
     53     {
     54       (void) fprintf(stdout,"Usage: %s image sigmoidal-image\n",argv[0]);
     55       exit(0);
     56     }
     57   /*
     58     Read an image.
     59   */
     60   MagickWandGenesis();
     61   image_wand=NewMagickWand();
     62   status=MagickReadImage(image_wand,argv[1]);
     63   if (status == MagickFalse)
     64     ThrowWandException(image_wand);
     65   contrast_wand=CloneMagickWand(image_wand);
     66   /*
     67     Sigmoidal non-linearity contrast control.
     68   */
     69   iterator=NewPixelIterator(image_wand);
     70   contrast_iterator=NewPixelIterator(contrast_wand);
     71   if ((iterator == (PixelIterator *) NULL) ||
     72       (contrast_iterator == (PixelIterator *) NULL))
     73     ThrowWandException(image_wand);
     74   for (y=0; y < (ssize_t) MagickGetImageHeight(image_wand); y++)
     75   {
     76     pixels=PixelGetNextIteratorRow(iterator,&width);
     77     contrast_pixels=PixelGetNextIteratorRow(contrast_iterator,&width);
     78     if ((pixels == (PixelWand **) NULL) ||
     79         (contrast_pixels == (PixelWand **) NULL))
     80       break;
     81     for (x=0; x < (ssize_t) width; x++)
     82     {
     83       PixelGetMagickColor(pixels[x],&pixel);
     84       pixel.red=SigmoidalContrast(pixel.red);
     85       pixel.green=SigmoidalContrast(pixel.green);
     86       pixel.blue=SigmoidalContrast(pixel.blue);
     87       pixel.index=SigmoidalContrast(pixel.index);
     88       PixelSetMagickColor(contrast_pixels[x],&pixel);
     89     }
     90     (void) PixelSyncIterator(contrast_iterator);
     91   }
     92   if (y < (ssize_t) MagickGetImageHeight(image_wand))
     93     ThrowWandException(image_wand);
     94   contrast_iterator=DestroyPixelIterator(contrast_iterator);
     95   iterator=DestroyPixelIterator(iterator);
     96   image_wand=DestroyMagickWand(image_wand);
     97   /*
     98     Write the image then destroy it.
     99   */
    100   status=MagickWriteImages(contrast_wand,argv[2],MagickTrue);
    101   if (status == MagickFalse)
    102     ThrowWandException(image_wand);
    103   contrast_wand=DestroyMagickWand(contrast_wand);
    104   MagickWandTerminus();
    105   return(0);
    106 }
    107