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