]> granicus.if.org Git - imagemagick/commitdiff
Fixed bug in -auto-level for one value in channel situation.
authoranthony <anthony@git.imagemagick.org>
Tue, 6 Apr 2010 03:19:20 +0000 (03:19 +0000)
committeranthony <anthony@git.imagemagick.org>
Tue, 6 Apr 2010 03:19:20 +0000 (03:19 +0000)
ChangeLog
magick/enhance.c
magick/histogram.c

index ddb5aaa2bfef188ed3e072437c609fdb1c4e5fca..914cd659316ca74046c7f8e4778564d4c20d9f33 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
+2010-04-06  6.6.1-1 Anthony Thyssen <A.Thyssen@griffith...>
+  * Fixed bug in -auto-level for special case when only one value is present
+    in some channel of the image. In this case no 'stretch is performed, just
+    as -normalize does.
+
 2010-04-05  6.6.1-1 Cristy  <quetzlzacatenango@image...>
-  * WMF support under Windows does not produce the same results as under Linux.
+  * WMF support under Windows does not produce the same results as under
+  Linux.
 
 2010-03-31  6.6.1-0 Anthony Thyssen <A.Thyssen@griffith...>
   * Fixed bug in equal-size tile cropping, when image has a page offset.
index 629286a49e7a9dc32bad02a6d250272c50d3b318..0b3d3ba0fd6d8f30a3457e26e4c4c856ca953307 100644 (file)
@@ -2545,7 +2545,7 @@ MagickExport MagickBooleanType LevelImageChannel(Image *image,
 {
 #define LevelImageTag  "Level/Image"
 #define LevelValue(x) (ClampToQuantum((MagickRealType) QuantumRange* \
-  pow(((double) (x)-black_point)/(white_point-black_point),1.0/gamma)))
+  pow(scale*((double)(x)-black_point),1.0/gamma)))
 
   CacheView
     *image_view;
@@ -2563,6 +2563,9 @@ MagickExport MagickBooleanType LevelImageChannel(Image *image,
   register long
     i;
 
+  register double
+    scale;
+
   /*
     Allocate and initialize levels map.
   */
@@ -2570,6 +2573,7 @@ MagickExport MagickBooleanType LevelImageChannel(Image *image,
   assert(image->signature == MagickSignature);
   if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+  scale = (white_point != black_point) ? 1.0/(white_point-black_point) : 1.0;
   if (image->storage_class == PseudoClass)
 #if defined(MAGICKCORE_OPENMP_SUPPORT)
   #pragma omp parallel for schedule(dynamic,4) shared(progress,status)
@@ -2628,7 +2632,7 @@ MagickExport MagickBooleanType LevelImageChannel(Image *image,
         q->blue=LevelValue(q->blue);
       if (((channel & OpacityChannel) != 0) &&
           (image->matte == MagickTrue))
-        q->opacity=LevelValue(q->opacity);
+        q->opacity=QuantumRange-LevelValue(QuantumRange-q->opacity);
       if (((channel & IndexChannel) != 0) &&
           (image->colorspace == CMYKColorspace))
         indexes[x]=LevelValue(indexes[x]);
index 99bae916e41f5a17940b5eaf06a6e7eb89ac2590..4de60176057eb731c41769831833a0d3f84d2f9f 100644 (file)
@@ -959,6 +959,9 @@ MagickExport MagickBooleanType IsPaletteImage(const Image *image,
 %  will be extracted from all the given channels, and those channels will be
 %  stretched by exactly the same amount (preventing color distortion).
 %
+%  In the special case that only ONE value is found in a channel of the image
+%  that value is not stretched, that value is left as is.
+%
 %  The 'SyncChannels' is turned on in the 'DefaultChannels' setting by
 %  default.
 %
@@ -979,6 +982,7 @@ MagickExport MagickBooleanType IsPaletteImage(const Image *image,
 %      from the minimum and maximum points by this color value.
 %
 */
+
 MagickExport MagickBooleanType MinMaxStretchImage(Image *image,
   const ChannelType channel,const double black_value,const double white_value)
 {
@@ -988,6 +992,7 @@ MagickExport MagickBooleanType MinMaxStretchImage(Image *image,
   MagickStatusType
     status;
 
+  status=MagickTrue;
   if ((channel & SyncChannels) != 0)
     {
       /*
@@ -996,18 +1001,20 @@ MagickExport MagickBooleanType MinMaxStretchImage(Image *image,
       (void) GetImageChannelRange(image,channel,&min,&max,&image->exception);
       min+=black_value;
       max-=white_value;
-      return(LevelImageChannel(image,channel,min,max,1.0));
+      if ( fabs(min-max) >= MagickEpsilon )
+        status = LevelImageChannel(image,channel,min,max,1.0);
+      return(status);
     }
   /*
     Auto-level each channel separately.
   */
-  status=MagickTrue;
   if ((channel & RedChannel) != 0)
     {
       (void) GetImageChannelRange(image,RedChannel,&min,&max,&image->exception);
       min+=black_value;
       max-=white_value;
-      status&=LevelImageChannel(image,RedChannel,min,max,1.0);
+      if ( fabs(min-max) >= MagickEpsilon )
+        status&=LevelImageChannel(image,RedChannel,min,max,1.0);
     }
   if ((channel & GreenChannel) != 0)
     {
@@ -1015,7 +1022,8 @@ MagickExport MagickBooleanType MinMaxStretchImage(Image *image,
         &image->exception);
       min+=black_value;
       max-=white_value;
-      status&=LevelImageChannel(image,GreenChannel,min,max,1.0);
+      if ( fabs(min-max) >= MagickEpsilon )
+        status&=LevelImageChannel(image,GreenChannel,min,max,1.0);
     }
   if ((channel & BlueChannel) != 0)
     {
@@ -1023,7 +1031,8 @@ MagickExport MagickBooleanType MinMaxStretchImage(Image *image,
         &image->exception);
       min+=black_value;
       max-=white_value;
-      status&=LevelImageChannel(image,BlueChannel,min,max,1.0);
+      if ( fabs(min-max) >= MagickEpsilon )
+        status&=LevelImageChannel(image,BlueChannel,min,max,1.0);
     }
   if (((channel & OpacityChannel) != 0) &&
        (image->matte == MagickTrue))
@@ -1032,7 +1041,8 @@ MagickExport MagickBooleanType MinMaxStretchImage(Image *image,
         &image->exception);
       min+=black_value;
       max-=white_value;
-      status&=LevelImageChannel(image,OpacityChannel,min,max,1.0);
+      if ( fabs(min-max) >= MagickEpsilon )
+        status&=LevelImageChannel(image,OpacityChannel,min,max,1.0);
     }
   if (((channel & IndexChannel) != 0) &&
        (image->colorspace == CMYKColorspace))
@@ -1041,9 +1051,10 @@ MagickExport MagickBooleanType MinMaxStretchImage(Image *image,
         &image->exception);
       min+=black_value;
       max-=white_value;
-      status&=LevelImageChannel(image,IndexChannel,min,max,1.0);
+      if ( fabs(min-max) >= MagickEpsilon )
+        status&=LevelImageChannel(image,IndexChannel,min,max,1.0);
     }
-  return(status != 0 ? MagickTrue : MagickFalse);
+  return(status);
 }
 \f
 /*