| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- #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); \
- }
- MagickBooleanType
- status;
- MagickPixelPacket
- pixel;
- MagickWand
- *contrast_wand,
- *image_wand;
- PixelIterator
- *contrast_iterator,
- *iterator;
- PixelWand
- **contrast_pixels,
- **pixels;
- register ssize_t
- x;
- size_t
- width;
- ssize_t
- y;
- 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 < (ssize_t) 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 < (ssize_t) 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 < (ssize_t) 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);
- }
|