From 14ef67ad835cab0e86751dcd03dd61d740b8550f Mon Sep 17 00:00:00 2001 From: Dirk Lemstra Date: Thu, 26 Apr 2018 11:17:28 +0000 Subject: [PATCH] Added support for channel traits to LocalContrastImage. --- Magick++/lib/Image.cpp | 14 ++++++++++++++ Magick++/lib/Magick++/Image.h | 2 ++ MagickCore/effect.c | 21 +++++++++++++++------ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/Magick++/lib/Image.cpp b/Magick++/lib/Image.cpp index af953aedc..ec1688490 100644 --- a/Magick++/lib/Image.cpp +++ b/Magick++/lib/Image.cpp @@ -3527,6 +3527,20 @@ void Magick::Image::localContrast(const double radius_,const double strength_) ThrowImageException; } +void Magick::Image::localContrastChannel(const ChannelType channel_, + const double radius_,const double strength_) +{ + MagickCore::Image + *newImage; + + GetPPException; + GetAndSetPPChannelMask(channel_); + newImage=LocalContrastImage(constImage(),radius_,strength_,exceptionInfo); + RestorePPChannelMask; + replaceImage(newImage); + ThrowImageException; +} + void Magick::Image::magnify(void) { MagickCore::Image diff --git a/Magick++/lib/Magick++/Image.h b/Magick++/lib/Magick++/Image.h index e16c1755b..33df63f3e 100644 --- a/Magick++/lib/Magick++/Image.h +++ b/Magick++/lib/Magick++/Image.h @@ -1065,6 +1065,8 @@ namespace Magick // Local contrast enhancement void localContrast(const double radius_,const double strength_); + void localContrastChannel(const ChannelType channel_,const double radius_, + const double strength_); // Magnify image by integral size void magnify(void); diff --git a/MagickCore/effect.c b/MagickCore/effect.c index 7fb5172f3..ca20e6d8b 100644 --- a/MagickCore/effect.c +++ b/MagickCore/effect.c @@ -1889,6 +1889,9 @@ MagickExport Image *LocalContrastImage(const Image *image,const double radius, sum, weight; + PixelTrait + traits; + weight=1.0f; sum=0; pix=pixels+x; @@ -1906,12 +1909,18 @@ MagickExport Image *LocalContrastImage(const Image *image,const double radius, srcVal=(float) GetPixelLuma(image,p); mult=(srcVal-(sum/totalWeight))*(strength/100.0f); mult=(srcVal+mult)/srcVal; - SetPixelRed(contrast_image,ClampToQuantum(GetPixelRed(image,p)*mult), - q); - SetPixelGreen(contrast_image,ClampToQuantum(GetPixelGreen(image,p)* - mult),q); - SetPixelBlue(contrast_image,ClampToQuantum(GetPixelBlue(image,p)*mult), - q); + traits=GetPixelChannelTraits(image,RedPixelChannel); + if ((traits & UpdatePixelTrait) != 0) + SetPixelRed(contrast_image,ClampToQuantum(GetPixelRed(image,p)*mult), + q); + traits=GetPixelChannelTraits(image,GreenPixelChannel); + if ((traits & UpdatePixelTrait) != 0) + SetPixelGreen(contrast_image,ClampToQuantum(GetPixelGreen(image,p)* + mult),q); + traits=GetPixelChannelTraits(image,BluePixelChannel); + if ((traits & UpdatePixelTrait) != 0) + SetPixelBlue(contrast_image,ClampToQuantum(GetPixelBlue(image,p)* + mult),q); p+=image->number_channels; q+=contrast_image->number_channels; } -- 2.40.0