]> granicus.if.org Git - imagemagick/commitdiff
Added support for channel traits to LocalContrastImage.
authorDirk Lemstra <dirk@git.imagemagick.org>
Thu, 26 Apr 2018 11:17:28 +0000 (11:17 +0000)
committerDirk Lemstra <dirk@git.imagemagick.org>
Thu, 26 Apr 2018 11:19:12 +0000 (11:19 +0000)
Magick++/lib/Image.cpp
Magick++/lib/Magick++/Image.h
MagickCore/effect.c

index af953aedc06daf89e278665fecf68bf465718222..ec1688490409d30e14313bf1abe94bc37fb289a1 100644 (file)
@@ -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
index e16c1755b663335a1e389ce5d6a238372c68d325..33df63f3efad7f5a6803fa2ec56c44d7c086b3ac 100644 (file)
@@ -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);
index 7fb5172f347be2c6c51f4d05528469e4e7c6546f..ca20e6d8b208e8adaec4f80b22343f9928ff7bc5 100644 (file)
@@ -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;
       }