diff --git a/Magick++/lib/Image.cpp b/Magick++/lib/Image.cpp
index 7e64bf0..86d0122 100644
--- a/Magick++/lib/Image.cpp
+++ b/Magick++/lib/Image.cpp
@@ -330,7 +330,7 @@
GetExceptionInfo( &exceptionInfo );
MagickCore::Image* newImage =
AddNoiseImage ( image(),
- noiseType_,
+ noiseType_, 1.0,
&exceptionInfo );
replaceImage( newImage );
throwException( exceptionInfo );
@@ -345,7 +345,7 @@
ChannelType channel_mask = SetPixelChannelMask( image(), channel_);
MagickCore::Image* newImage =
AddNoiseImage ( image(),
- noiseType_,
+ noiseType_, 1.0,
&exceptionInfo );
(void) SetPixelChannelMap( image(), channel_mask );
replaceImage( newImage );
diff --git a/MagickCore/display.c b/MagickCore/display.c
index 8b24ee6..aa73468 100644
--- a/MagickCore/display.c
+++ b/MagickCore/display.c
@@ -8199,7 +8199,7 @@
XSetCursorState(display,windows,MagickTrue);
XCheckRefreshWindows(display,windows);
noise_image=AddNoiseImage(*image,(NoiseType) ParseCommandOption(
- MagickNoiseOptions,MagickFalse,noise_type),exception);
+ MagickNoiseOptions,MagickFalse,noise_type),1.0,exception);
if (noise_image != (Image *) NULL)
{
*image=DestroyImage(*image);
diff --git a/MagickCore/fx.c b/MagickCore/fx.c
index 183d2d1..bdb23a6 100644
--- a/MagickCore/fx.c
+++ b/MagickCore/fx.c
@@ -289,7 +289,7 @@
% The format of the AddNoiseImage method is:
%
% Image *AddNoiseImage(const Image *image,const NoiseType noise_type,
-% ExceptionInfo *exception)
+% const double attenuate,ExceptionInfo *exception)
%
% A description of each parameter follows:
%
@@ -300,10 +300,13 @@
% o noise_type: The type of noise: Uniform, Gaussian, Multiplicative,
% Impulse, Laplacian, or Poisson.
%
+% o attenuate: attenuate the random distribution.
+%
% o exception: return any errors or warnings in this structure.
%
*/
-MagickExport Image *AddNoiseImage(const Image *image,const NoiseType noise_type, ExceptionInfo *exception)
+MagickExport Image *AddNoiseImage(const Image *image,const NoiseType noise_type,
+ const double attenuate,ExceptionInfo *exception)
{
#define AddNoiseImageTag "AddNoise/Image"
@@ -311,9 +314,6 @@
*image_view,
*noise_view;
- const char
- *option;
-
Image
*noise_image;
@@ -323,9 +323,6 @@
MagickOffsetType
progress;
- MagickRealType
- attenuate;
-
RandomInfo
**restrict random_info;
@@ -352,10 +349,6 @@
/*
Add noise in each row.
*/
- attenuate=1.0;
- option=GetImageArtifact(image,"attenuate");
- if (option != (char *) NULL)
- attenuate=InterpretLocaleValue(option,(char **) NULL);
status=MagickTrue;
progress=0;
random_info=AcquireRandomInfoThreadSet();
diff --git a/MagickCore/fx.h b/MagickCore/fx.h
index c36bd8f..c96aa7c 100644
--- a/MagickCore/fx.h
+++ b/MagickCore/fx.h
@@ -37,7 +37,7 @@
} NoiseType;
extern MagickExport Image
- *AddNoiseImage(const Image *,const NoiseType,ExceptionInfo *),
+ *AddNoiseImage(const Image *,const NoiseType,const double,ExceptionInfo *),
*BlueShiftImage(const Image *,const double,ExceptionInfo *),
*CharcoalImage(const Image *,const double,const double,const double,
ExceptionInfo *),
diff --git a/MagickCore/gem-private.h b/MagickCore/gem-private.h
index 3125024..707720b 100644
--- a/MagickCore/gem-private.h
+++ b/MagickCore/gem-private.h
@@ -24,7 +24,7 @@
extern MagickPrivate double
GenerateDifferentialNoise(RandomInfo *,const Quantum,const NoiseType,
- const MagickRealType);
+ const double);
extern MagickPrivate size_t
GetOptimalKernelWidth(const double,const double),
diff --git a/MagickCore/gem.c b/MagickCore/gem.c
index dd7a0b0..f8cc395 100644
--- a/MagickCore/gem.c
+++ b/MagickCore/gem.c
@@ -591,8 +591,7 @@
% The format of the GenerateDifferentialNoise method is:
%
% double GenerateDifferentialNoise(RandomInfo *random_info,
-% const Quantum pixel,const NoiseType noise_type,
-% const MagickRealType attenuate)
+% const Quantum pixel,const NoiseType noise_type,const double attenuate)
%
% A description of each parameter follows:
%
@@ -606,7 +605,7 @@
%
*/
MagickPrivate double GenerateDifferentialNoise(RandomInfo *random_info,
- const Quantum pixel,const NoiseType noise_type,const MagickRealType attenuate)
+ const Quantum pixel,const NoiseType noise_type,const double attenuate)
{
#define NoiseEpsilon (attenuate*1.0e-5)
#define SigmaUniform (attenuate*4.0)
@@ -624,6 +623,7 @@
sigma;
alpha=GetPseudoRandomValue(random_info);
+ alpha=1.0;
switch (noise_type)
{
case UniformNoise:
diff --git a/MagickWand/magick-image.c b/MagickWand/magick-image.c
index bac02f6..85fc280 100644
--- a/MagickWand/magick-image.c
+++ b/MagickWand/magick-image.c
@@ -492,7 +492,7 @@
% The format of the MagickAddNoiseImage method is:
%
% MagickBooleanType MagickAddNoiseImage(MagickWand *wand,
-% const NoiseType noise_type)
+% const NoiseType noise_type,const double attenuate)
%
% A description of each parameter follows:
%
@@ -501,9 +501,11 @@
% o noise_type: The type of noise: Uniform, Gaussian, Multiplicative,
% Impulse, Laplacian, or Poisson.
%
+% o attenuate: attenuate the random distribution.
+%
*/
WandExport MagickBooleanType MagickAddNoiseImage(MagickWand *wand,
- const NoiseType noise_type)
+ const NoiseType noise_type,const double attenuate)
{
Image
*noise_image;
@@ -514,7 +516,7 @@
(void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
if (wand->images == (Image *) NULL)
ThrowWandException(WandError,"ContainsNoImages",wand->name);
- noise_image=AddNoiseImage(wand->images,noise_type,wand->exception);
+ noise_image=AddNoiseImage(wand->images,noise_type,attenuate,wand->exception);
if (noise_image == (Image *) NULL)
return(MagickFalse);
ReplaceImageInList(&wand->images,noise_image);
diff --git a/MagickWand/magick-image.h b/MagickWand/magick-image.h
index 06fb6c4..60a42f8 100644
--- a/MagickWand/magick-image.h
+++ b/MagickWand/magick-image.h
@@ -79,7 +79,7 @@
MagickAdaptiveThresholdImage(MagickWand *,const size_t,const size_t,
const double),
MagickAddImage(MagickWand *,const MagickWand *),
- MagickAddNoiseImage(MagickWand *,const NoiseType),
+ MagickAddNoiseImage(MagickWand *,const NoiseType,const double),
MagickAffineTransformImage(MagickWand *,const DrawingWand *),
MagickAnnotateImage(MagickWand *,const DrawingWand *,const double,
const double,const double,const char *),
diff --git a/MagickWand/mogrify.c b/MagickWand/mogrify.c
index 31503ef..a4d1e2f 100644
--- a/MagickWand/mogrify.c
+++ b/MagickWand/mogrify.c
@@ -625,6 +625,9 @@
*format,
*option;
+ double
+ attenuate;
+
DrawInfo
*draw_info;
@@ -676,6 +679,7 @@
SetGeometryInfo(&geometry_info);
GetPixelInfo(*image,&fill);
SetPixelInfoPacket(*image,&(*image)->background_color,&fill);
+ attenuate=1.0;
compose=(*image)->compose;
interpolate_method=UndefinedInterpolatePixel;
channel=mogrify_info->channel;
@@ -813,6 +817,16 @@
MagickFalse;
break;
}
+ if (LocaleCompare("attenuate",option+1) == 0)
+ {
+ if (*option == '+')
+ {
+ attenuate=1.0;
+ break;
+ }
+ attenuate=InterpretLocaleValue(argv[i+1],(char **) NULL);
+ break;
+ }
if (LocaleCompare("auto-gamma",option+1) == 0)
{
/*
@@ -2186,7 +2200,7 @@
noise=(NoiseType) ParseCommandOption(MagickNoiseOptions,
MagickFalse,argv[i+1]);
- mogrify_image=AddNoiseImage(*image,noise,exception);
+ mogrify_image=AddNoiseImage(*image,noise,attenuate,exception);
}
break;
}
@@ -6159,14 +6173,6 @@
image_info->antialias=(*option == '-') ? MagickTrue : MagickFalse;
break;
}
- if (LocaleCompare("attenuate",option+1) == 0)
- {
- if (*option == '+')
- (void) DeleteImageOption(image_info,option+1);
- else
- (void) SetImageOption(image_info,option+1,argv[i+1]);
- break;
- }
if (LocaleCompare("authenticate",option+1) == 0)
{
if (*option == '+')
diff --git a/MagickWand/operation.c b/MagickWand/operation.c
index dde41e6..7c45972 100644
--- a/MagickWand/operation.c
+++ b/MagickWand/operation.c
@@ -1556,6 +1556,9 @@
const char
*format;
+ double
+ attenuate;
+
DrawInfo
*draw_info;
@@ -1590,6 +1593,7 @@
SetGeometryInfo(&geometry_info);
GetPixelInfo(*image,&fill);
SetPixelInfoPacket(*image,&(*image)->background_color,&fill);
+ attenuate=1.0;
channel=image_info->channel;
format=GetImageOption(image_info,"format");
@@ -1679,6 +1683,16 @@
(void) AnnotateImage(*image,draw_info,exception);
break;
}
+ if (LocaleCompare("attenuate",option+1) == 0)
+ {
+ if (*option == '+')
+ {
+ attenuate=1.0;
+ break;
+ }
+ attenuate=InterpretLocaleValue(argv[i+1],(char **) NULL);
+ break;
+ }
if (LocaleCompare("auto-gamma",argv[0]+1) == 0)
{
/*
@@ -2989,7 +3003,7 @@
noise=(NoiseType) ParseCommandOption(MagickNoiseOptions,
MagickFalse,argv[1]);
- new_image=AddNoiseImage(*image,noise,exception);
+ new_image=AddNoiseImage(*image,noise,attenuate,exception);
}
break;
}
diff --git a/coders/msl.c b/coders/msl.c
index 6fea30e..f336015 100644
--- a/coders/msl.c
+++ b/coders/msl.c
@@ -742,7 +742,7 @@
}
}
channel_mask=SetPixelChannelMask(msl_info->image[n],channel);
- noise_image=AddNoiseImage(msl_info->image[n],noise,
+ noise_image=AddNoiseImage(msl_info->image[n],noise,1.0,
&msl_info->image[n]->exception);
(void) SetPixelChannelMap(msl_info->image[n],channel_mask);
if (noise_image == (Image *) NULL)