ExceptionInfo exceptionInfo;
GetExceptionInfo( &exceptionInfo );
MagickCore::Image* newImage =
- BlurImage( image(), radius_, sigma_, &exceptionInfo);
+ BlurImage( image(), radius_, sigma_, image()->bias, &exceptionInfo);
replaceImage( newImage );
throwException( exceptionInfo );
(void) DestroyExceptionInfo( &exceptionInfo );
GetExceptionInfo( &exceptionInfo );
ChannelType channel_mask = SetPixelChannelMask( image(), channel_ );
MagickCore::Image* newImage =
- BlurImage( image(), radius_, sigma_, &exceptionInfo);
+ BlurImage( image(), radius_, sigma_, image()->bias, &exceptionInfo);
(void) SetPixelChannelMap( image(), channel_mask );
replaceImage( newImage );
throwException( exceptionInfo );
ExceptionInfo exceptionInfo;
GetExceptionInfo( &exceptionInfo );
MagickCore::Image* newImage =
- CharcoalImage( image(), radius_, sigma_, &exceptionInfo );
+ CharcoalImage( image(), radius_, sigma_, image()->bias, &exceptionInfo );
replaceImage( newImage );
throwException( exceptionInfo );
(void) DestroyExceptionInfo( &exceptionInfo );
ExceptionInfo exceptionInfo;
GetExceptionInfo( &exceptionInfo );
MagickCore::Image* newImage =
- GaussianBlurImage( image(), width_, sigma_, &exceptionInfo );
+ GaussianBlurImage( image(), width_, sigma_, image()->bias, &exceptionInfo );
replaceImage( newImage );
throwException( exceptionInfo );
(void) DestroyExceptionInfo( &exceptionInfo );
GetExceptionInfo( &exceptionInfo );
ChannelType channel_mask = SetPixelChannelMask( image(), channel_ );
MagickCore::Image* newImage =
- GaussianBlurImage( image(), width_, sigma_, &exceptionInfo );
+ GaussianBlurImage( image(), width_, sigma_, image()->bias, &exceptionInfo );
(void) SetPixelChannelMap( image(), channel_mask );
replaceImage( newImage );
throwException( exceptionInfo );
SharpenImage( image(),
radius_,
sigma_,
+ image()->bias,
&exceptionInfo );
replaceImage( newImage );
throwException( exceptionInfo );
SharpenImage( image(),
radius_,
sigma_,
+ image()->bias,
&exceptionInfo );
(void) SetPixelChannelMap( image(), channel_mask );
replaceImage( newImage );
XCheckRefreshWindows(display,windows);
flags=ParseGeometry(radius,&geometry_info);
sharp_image=SharpenImage(*image,geometry_info.rho,geometry_info.sigma,
- exception);
+ geometry_info.xi,exception);
if (sharp_image != (Image *) NULL)
{
*image=DestroyImage(*image);
XCheckRefreshWindows(display,windows);
flags=ParseGeometry(radius,&geometry_info);
blur_image=BlurImage(*image,geometry_info.rho,geometry_info.sigma,
- exception);
+ geometry_info.xi,exception);
if (blur_image != (Image *) NULL)
{
*image=DestroyImage(*image);
if ((flags & SigmaValue) == 0)
geometry_info.sigma=geometry_info.rho;
charcoal_image=CharcoalImage(*image,geometry_info.rho,geometry_info.sigma,
- exception);
+ geometry_info.xi,exception);
if (charcoal_image != (Image *) NULL)
{
*image=DestroyImage(*image);
return((Image *) NULL);
}
(void) AdaptiveLevelImage(edge_image,"20%,95%",exception);
- gaussian_image=GaussianBlurImage(edge_image,radius,sigma,exception);
+ gaussian_image=GaussianBlurImage(edge_image,radius,sigma,bias,exception);
if (gaussian_image != (Image *) NULL)
{
edge_image=DestroyImage(edge_image);
return((Image *) NULL);
}
(void) AdaptiveLevelImage(edge_image,"20%,95%",exception);
- gaussian_image=GaussianBlurImage(edge_image,radius,sigma,exception);
+ gaussian_image=GaussianBlurImage(edge_image,radius,sigma,bias,exception);
if (gaussian_image != (Image *) NULL)
{
edge_image=DestroyImage(edge_image);
% The format of the BlurImage method is:
%
% Image *BlurImage(const Image *image,const double radius,
-% const double sigma,ExceptionInfo *exception)
+% const double sigma,const double bias,ExceptionInfo *exception)
%
% A description of each parameter follows:
%
%
% o sigma: the standard deviation of the Gaussian, in pixels.
%
+% o bias: the bias.
+%
% o exception: return any errors or warnings in this structure.
%
*/
}
MagickExport Image *BlurImage(const Image *image,const double radius,
- const double sigma,ExceptionInfo *exception)
+ const double sigma,const double bias,ExceptionInfo *exception)
{
#define BlurImageTag "Blur/Image"
MagickOffsetType
progress;
- PixelInfo
- bias;
-
register ssize_t
i;
width;
ssize_t
+ center,
x,
y;
*/
status=MagickTrue;
progress=0;
- GetPixelInfo(image,&bias);
- SetPixelInfoBias(image,&bias);
+ center=(ssize_t) GetPixelChannels(image)*(width/2L);
image_view=AcquireCacheView(image);
blur_view=AcquireCacheView(blur_image);
#if defined(MAGICKCORE_OPENMP_SUPPORT)
status=MagickFalse;
continue;
}
- for (x=0; x < (ssize_t) blur_image->columns; x++)
+ for (x=0; x < (ssize_t) image->columns; x++)
{
- PixelInfo
- pixel;
+ register ssize_t
+ i;
- register const double
- *restrict k;
+ for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
+ {
+ MagickRealType
+ alpha,
+ gamma,
+ pixel;
- register const Quantum
- *restrict kernel_pixels;
+ PixelChannel
+ channel;
- register ssize_t
- i;
+ PixelTrait
+ blur_traits,
+ traits;
- pixel=bias;
- k=kernel;
- kernel_pixels=p;
- if (((GetPixelAlphaTraits(image) & UpdatePixelTrait) == 0) ||
- (image->matte == MagickFalse))
- {
- for (i=0; i < (ssize_t) width; i++)
- {
- pixel.red+=(*k)*GetPixelRed(image,kernel_pixels);
- pixel.green+=(*k)*GetPixelGreen(image,kernel_pixels);
- pixel.blue+=(*k)*GetPixelBlue(image,kernel_pixels);
- if (image->colorspace == CMYKColorspace)
- pixel.black+=(*k)*GetPixelBlack(image,kernel_pixels);
- k++;
- kernel_pixels+=GetPixelChannels(image);
- }
- if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0)
- SetPixelRed(blur_image,ClampToQuantum(pixel.red),q);
- if ((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0)
- SetPixelGreen(blur_image,ClampToQuantum(pixel.green),q);
- if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0)
- SetPixelBlue(blur_image,ClampToQuantum(pixel.blue),q);
- if (((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0) &&
- (blur_image->colorspace == CMYKColorspace))
- SetPixelBlack(blur_image,ClampToQuantum(pixel.black),q);
- if ((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0)
- {
- k=kernel;
- kernel_pixels=p;
- for (i=0; i < (ssize_t) width; i++)
- {
- pixel.alpha+=(*k)*GetPixelAlpha(image,kernel_pixels);
- k++;
- kernel_pixels+=GetPixelChannels(image);
- }
- SetPixelAlpha(blur_image,ClampToQuantum(pixel.alpha),q);
- }
- }
- else
- {
- MagickRealType
- alpha,
- gamma;
+ register const double
+ *restrict k;
- gamma=0.0;
- for (i=0; i < (ssize_t) width; i++)
+ register const Quantum
+ *restrict pixels;
+
+ register ssize_t
+ u;
+
+ traits=GetPixelChannelMapTraits(image,(PixelChannel) i);
+ channel=GetPixelChannelMapChannel(image,(PixelChannel) i);
+ blur_traits=GetPixelChannelMapTraits(blur_image,channel);
+ if ((traits == UndefinedPixelTrait) ||
+ (blur_traits == UndefinedPixelTrait))
+ continue;
+ if ((blur_traits & CopyPixelTrait) != 0)
{
- alpha=(MagickRealType) (QuantumScale*
- GetPixelAlpha(image,kernel_pixels));
- pixel.red+=(*k)*alpha*GetPixelRed(image,kernel_pixels);
- pixel.green+=(*k)*alpha*GetPixelGreen(image,kernel_pixels);
- pixel.blue+=(*k)*alpha*GetPixelBlue(image,kernel_pixels);
- if (image->colorspace == CMYKColorspace)
- pixel.black+=(*k)*alpha*GetPixelBlack(image,kernel_pixels);
- gamma+=(*k)*alpha;
- k++;
- kernel_pixels+=GetPixelChannels(image);
+ q[channel]=p[center+i];
+ continue;
}
- gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
- if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0)
- SetPixelRed(blur_image,ClampToQuantum(gamma*pixel.red),q);
- if ((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0)
- SetPixelGreen(blur_image,ClampToQuantum(gamma*pixel.green),q);
- if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0)
- SetPixelBlue(blur_image,ClampToQuantum(gamma*pixel.blue),q);
- if (((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0) &&
- (blur_image->colorspace == CMYKColorspace))
- SetPixelBlack(blur_image,ClampToQuantum(gamma*pixel.black),q);
- if ((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0)
+ k=kernel;
+ pixels=p;
+ pixel=0.0;
+ if ((blur_traits & BlendPixelTrait) == 0)
+ {
+ /*
+ No alpha blending.
+ */
+ for (u=0; u < (ssize_t) width; u++)
{
- k=kernel;
- kernel_pixels=p;
- for (i=0; i < (ssize_t) width; i++)
- {
- pixel.alpha+=(*k)*GetPixelAlpha(image,kernel_pixels);
- k++;
- kernel_pixels+=GetPixelChannels(image);
- }
- SetPixelAlpha(blur_image,ClampToQuantum(pixel.alpha),q);
+ pixel+=(*k)*pixels[i];
+ k++;
+ pixels+=GetPixelChannels(image);
}
+ q[channel]=ClampToQuantum(pixel);
+ continue;
+ }
+ /*
+ Alpha blending.
+ */
+ gamma=0.0;
+ for (u=0; u < (ssize_t) width; u++)
+ {
+ alpha=(MagickRealType) (QuantumScale*GetPixelAlpha(image,pixels));
+ pixel+=(*k)*alpha*pixels[i];
+ gamma+=(*k)*alpha;
+ k++;
+ pixels+=GetPixelChannels(image);
}
+ gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
+ q[channel]=ClampToQuantum(gamma*pixel);
+ }
p+=GetPixelChannels(image);
q+=GetPixelChannels(blur_image);
}
status=MagickFalse;
continue;
}
- for (y=0; y < (ssize_t) blur_image->rows; y++)
+ for (y=0; y < (ssize_t) image->rows; y++)
{
- PixelInfo
- pixel;
+ register ssize_t
+ i;
- register const double
- *restrict k;
+ for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
+ {
+ MagickRealType
+ alpha,
+ gamma,
+ pixel;
- register const Quantum
- *restrict kernel_pixels;
+ PixelChannel
+ channel;
- register ssize_t
- i;
+ PixelTrait
+ blur_traits,
+ traits;
- pixel=bias;
- k=kernel;
- kernel_pixels=p;
- if (((GetPixelAlphaTraits(image) & UpdatePixelTrait) == 0) ||
- (blur_image->matte == MagickFalse))
- {
- for (i=0; i < (ssize_t) width; i++)
- {
- pixel.red+=(*k)*GetPixelRed(blur_image,kernel_pixels);
- pixel.green+=(*k)*GetPixelGreen(blur_image,kernel_pixels);
- pixel.blue+=(*k)*GetPixelBlue(blur_image,kernel_pixels);
- if (blur_image->colorspace == CMYKColorspace)
- pixel.black+=(*k)*GetPixelBlack(blur_image,kernel_pixels);
- k++;
- kernel_pixels+=GetPixelChannels(blur_image);
- }
- if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0)
- SetPixelRed(blur_image,ClampToQuantum(pixel.red),q);
- if ((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0)
- SetPixelGreen(blur_image,ClampToQuantum(pixel.green),q);
- if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0)
- SetPixelBlue(blur_image,ClampToQuantum(pixel.blue),q);
- if (((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0) &&
- (blur_image->colorspace == CMYKColorspace))
- SetPixelBlack(blur_image,ClampToQuantum(pixel.black),q);
- if ((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0)
- {
- k=kernel;
- kernel_pixels=p;
- for (i=0; i < (ssize_t) width; i++)
- {
- pixel.alpha+=(*k)*GetPixelAlpha(blur_image,kernel_pixels);
- k++;
- kernel_pixels+=GetPixelChannels(blur_image);
- }
- SetPixelAlpha(blur_image,ClampToQuantum(pixel.alpha),q);
- }
- }
- else
- {
- MagickRealType
- alpha,
- gamma;
+ register const double
+ *restrict k;
- gamma=0.0;
- for (i=0; i < (ssize_t) width; i++)
+ register const Quantum
+ *restrict pixels;
+
+ register ssize_t
+ u;
+
+ traits=GetPixelChannelMapTraits(image,(PixelChannel) i);
+ channel=GetPixelChannelMapChannel(image,(PixelChannel) i);
+ blur_traits=GetPixelChannelMapTraits(blur_image,channel);
+ if ((traits == UndefinedPixelTrait) ||
+ (blur_traits == UndefinedPixelTrait))
+ continue;
+ if ((blur_traits & CopyPixelTrait) != 0)
{
- alpha=(MagickRealType) (QuantumScale*
- GetPixelAlpha(blur_image,kernel_pixels));
- pixel.red+=(*k)*alpha*GetPixelRed(blur_image,kernel_pixels);
- pixel.green+=(*k)*alpha*GetPixelGreen(blur_image,kernel_pixels);
- pixel.blue+=(*k)*alpha*GetPixelBlue(blur_image,kernel_pixels);
- if (blur_image->colorspace == CMYKColorspace)
- pixel.black+=(*k)*alpha*GetPixelBlack(blur_image,kernel_pixels);
- gamma+=(*k)*alpha;
- k++;
- kernel_pixels+=GetPixelChannels(blur_image);
+ q[channel]=p[center+i];
+ continue;
}
- gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
- if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0)
- SetPixelRed(blur_image,ClampToQuantum(gamma*pixel.red),q);
- if ((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0)
- SetPixelGreen(blur_image,ClampToQuantum(gamma*pixel.green),q);
- if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0)
- SetPixelBlue(blur_image,ClampToQuantum(gamma*pixel.blue),q);
- if (((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0) &&
- (blur_image->colorspace == CMYKColorspace))
- SetPixelBlack(blur_image,ClampToQuantum(gamma*pixel.black),q);
- if ((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0)
+ k=kernel;
+ pixels=p;
+ pixel=0.0;
+ if ((blur_traits & BlendPixelTrait) == 0)
+ {
+ /*
+ No alpha blending.
+ */
+ for (u=0; u < (ssize_t) width; u++)
{
- k=kernel;
- kernel_pixels=p;
- for (i=0; i < (ssize_t) width; i++)
- {
- pixel.alpha+=(*k)*GetPixelAlpha(blur_image,kernel_pixels);
- k++;
- kernel_pixels+=GetPixelChannels(blur_image);
- }
- SetPixelAlpha(blur_image,ClampToQuantum(pixel.alpha),q);
+ pixel+=(*k)*pixels[i];
+ k++;
+ pixels+=GetPixelChannels(image);
}
+ q[channel]=ClampToQuantum(pixel);
+ continue;
+ }
+ /*
+ Alpha blending.
+ */
+ gamma=0.0;
+ for (u=0; u < (ssize_t) width; u++)
+ {
+ alpha=(MagickRealType) (QuantumScale*GetPixelAlpha(image,pixels));
+ pixel+=(*k)*alpha*pixels[i];
+ gamma+=(*k)*alpha;
+ k++;
+ pixels+=GetPixelChannels(image);
}
- p+=GetPixelChannels(blur_image);
+ gamma=1.0/(fabs((double) gamma) <= MagickEpsilon ? 1.0 : gamma);
+ q[channel]=ClampToQuantum(gamma*pixel);
+ }
+ p+=GetPixelChannels(image);
q+=GetPixelChannels(blur_image);
}
if (SyncCacheViewAuthenticPixels(blur_view,exception) == MagickFalse)
% The format of the GaussianBlurImage method is:
%
% Image *GaussianBlurImage(const Image *image,onst double radius,
-% const double sigma,ExceptionInfo *exception)
+% const double sigma,const double bias,ExceptionInfo *exception)
%
% A description of each parameter follows:
%
%
% o sigma: the standard deviation of the Gaussian, in pixels.
%
+% o bias: the bias.
+%
% o exception: return any errors or warnings in this structure.
%
*/
MagickExport Image *GaussianBlurImage(const Image *image,const double radius,
- const double sigma,ExceptionInfo *exception)
+ const double sigma,const double bias,ExceptionInfo *exception)
{
Image
*blur_image;
(void) ResetMagickMemory(kernel_info,0,sizeof(*kernel_info));
kernel_info->width=width;
kernel_info->height=width;
+ kernel_info->bias=bias;
kernel_info->signature=MagickSignature;
kernel_info->values=(double *) AcquireAlignedMemory(kernel_info->width,
kernel_info->width*sizeof(*kernel_info->values));
i++;
}
}
- kernel_info->bias=image->bias;
blur_image=ConvolveImage(image,kernel_info,exception);
kernel_info=DestroyKernelInfo(kernel_info);
return(blur_image);
}
case SharpenPreview:
{
- preview_image=SharpenImage(thumbnail,radius,sigma,exception);
+ preview_image=SharpenImage(thumbnail,radius,sigma,image->bias,
+ exception);
(void) FormatLocaleString(label,MaxTextExtent,"sharpen %gx%g",
radius,sigma);
break;
}
case BlurPreview:
{
- preview_image=BlurImage(thumbnail,radius,sigma,exception);
+ preview_image=BlurImage(thumbnail,radius,sigma,image->bias,exception);
(void) FormatLocaleString(label,MaxTextExtent,"blur %gx%g",radius,
sigma);
break;
case CharcoalDrawingPreview:
{
preview_image=CharcoalImage(thumbnail,(double) radius,(double) sigma,
- exception);
+ image->bias,exception);
(void) FormatLocaleString(label,MaxTextExtent,"charcoal %gx%g",
radius,sigma);
break;
% The format of the SharpenImage method is:
%
% Image *SharpenImage(const Image *image,const double radius,
-% const double sigma,ExceptionInfo *exception)
+% const double sigma,const double bias,ExceptionInfo *exception)
%
% A description of each parameter follows:
%
%
% o sigma: the standard deviation of the Laplacian, in pixels.
%
+% o bias: bias.
+%
% o exception: return any errors or warnings in this structure.
%
*/
MagickExport Image *SharpenImage(const Image *image,const double radius,
- const double sigma,ExceptionInfo *exception)
+ const double sigma,const double bias,ExceptionInfo *exception)
{
double
normalize;
(void) ResetMagickMemory(kernel_info,0,sizeof(*kernel_info));
kernel_info->width=width;
kernel_info->height=width;
+ kernel_info->bias=bias;
kernel_info->signature=MagickSignature;
kernel_info->values=(double *) AcquireAlignedMemory(kernel_info->width,
kernel_info->width*sizeof(*kernel_info->values));
}
}
kernel_info->values[i/2]=(double) ((-2.0)*normalize);
- kernel_info->bias=image->bias;
sharp_image=ConvolveImage(image,kernel_info,exception);
kernel_info=DestroyKernelInfo(kernel_info);
return(sharp_image);
if (image->debug != MagickFalse)
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
assert(exception != (ExceptionInfo *) NULL);
- unsharp_image=BlurImage(image,radius,sigma,exception);
+ unsharp_image=BlurImage(image,radius,sigma,image->bias,exception);
if (unsharp_image == (Image *) NULL)
return((Image *) NULL);
quantum_threshold=(MagickRealType) QuantumRange*threshold;
pixel.green=GetPixelGreen(image,p)-
(MagickRealType) GetPixelGreen(image,q);
if (fabs(2.0*pixel.green) < quantum_threshold)
- pixel.green=(MagickRealType)
- GetPixelGreen(image,p);
+ pixel.green=(MagickRealType) GetPixelGreen(image,p);
else
- pixel.green=(MagickRealType)
- GetPixelGreen(image,p)+
+ pixel.green=(MagickRealType) GetPixelGreen(image,p)+
(pixel.green*amount);
SetPixelGreen(unsharp_image,
ClampToQuantum(pixel.green),q);
}
if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0)
{
- pixel.blue=GetPixelBlue(image,p)-
- (MagickRealType) GetPixelBlue(image,q);
+ pixel.blue=GetPixelBlue(image,p)-(MagickRealType)
+ GetPixelBlue(image,q);
if (fabs(2.0*pixel.blue) < quantum_threshold)
- pixel.blue=(MagickRealType)
- GetPixelBlue(image,p);
+ pixel.blue=(MagickRealType) GetPixelBlue(image,p);
else
- pixel.blue=(MagickRealType)
- GetPixelBlue(image,p)+(pixel.blue*amount);
- SetPixelBlue(unsharp_image,
- ClampToQuantum(pixel.blue),q);
+ pixel.blue=(MagickRealType) GetPixelBlue(image,p)+
+ (pixel.blue*amount);
+ SetPixelBlue(unsharp_image,ClampToQuantum(pixel.blue),q);
}
if (((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0) &&
(image->colorspace == CMYKColorspace))
{
- pixel.black=GetPixelBlack(image,p)-
- (MagickRealType) GetPixelBlack(image,q);
+ pixel.black=GetPixelBlack(image,p)-(MagickRealType)
+ GetPixelBlack(image,q);
if (fabs(2.0*pixel.black) < quantum_threshold)
- pixel.black=(MagickRealType)
- GetPixelBlack(image,p);
+ pixel.black=(MagickRealType) GetPixelBlack(image,p);
else
- pixel.black=(MagickRealType)
- GetPixelBlack(image,p)+(pixel.black*
- amount);
- SetPixelBlack(unsharp_image,
- ClampToQuantum(pixel.black),q);
+ pixel.black=(MagickRealType) GetPixelBlack(image,p)+
+ (pixel.black*amount);
+ SetPixelBlack(unsharp_image,ClampToQuantum(pixel.black),q);
}
if ((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0)
{
- pixel.alpha=GetPixelAlpha(image,p)-
- (MagickRealType) GetPixelAlpha(image,q);
+ pixel.alpha=GetPixelAlpha(image,p)-(MagickRealType)
+ GetPixelAlpha(image,q);
if (fabs(2.0*pixel.alpha) < quantum_threshold)
- pixel.alpha=(MagickRealType)
- GetPixelAlpha(image,p);
+ pixel.alpha=(MagickRealType) GetPixelAlpha(image,p);
else
- pixel.alpha=GetPixelAlpha(image,p)+
- (pixel.alpha*amount);
- SetPixelAlpha(unsharp_image,
- ClampToQuantum(pixel.alpha),q);
+ pixel.alpha=GetPixelAlpha(image,p)+(pixel.alpha*amount);
+ SetPixelAlpha(unsharp_image,ClampToQuantum(pixel.alpha),q);
}
p+=GetPixelChannels(image);
q+=GetPixelChannels(unsharp_image);
ExceptionInfo *),
*AdaptiveSharpenImage(const Image *,const double,const double,const double,
ExceptionInfo *),
- *BlurImage(const Image *,const double,const double,ExceptionInfo *),
+ *BlurImage(const Image *,const double,const double,const double,
+ ExceptionInfo *),
*ConvolveImage(const Image *,const KernelInfo *,ExceptionInfo *),
*DespeckleImage(const Image *,ExceptionInfo *),
*EdgeImage(const Image *,const double,const double,ExceptionInfo *),
*EmbossImage(const Image *,const double,const double,ExceptionInfo *),
- *GaussianBlurImage(const Image *,const double,const double,ExceptionInfo *),
+ *GaussianBlurImage(const Image *,const double,const double,const double,
+ ExceptionInfo *),
*MotionBlurImage(const Image *,const double,const double,const double,
ExceptionInfo *),
*PreviewImage(const Image *,const PreviewType,ExceptionInfo *),
ExceptionInfo *),
*ShadeImage(const Image *,const MagickBooleanType,const double,const double,
ExceptionInfo *),
- *SharpenImage(const Image *,const double,const double,ExceptionInfo *),
+ *SharpenImage(const Image *,const double,const double,const double,
+ ExceptionInfo *),
*SpreadImage(const Image *,const double,ExceptionInfo *),
*StatisticImage(const Image *,const StatisticType,const size_t,const size_t,
ExceptionInfo *),
% The format of the CharcoalImage method is:
%
% Image *CharcoalImage(const Image *image,const double radius,
-% const double sigma,ExceptionInfo *exception)
+% const double sigma,const double bias,ExceptionInfo *exception)
%
% A description of each parameter follows:
%
%
% o sigma: the standard deviation of the Gaussian, in pixels.
%
+% o bias: the bias.
+%
% o exception: return any errors or warnings in this structure.
%
*/
MagickExport Image *CharcoalImage(const Image *image,const double radius,
- const double sigma,ExceptionInfo *exception)
+ const double sigma,const double bias,ExceptionInfo *exception)
{
Image
*charcoal_image,
clone_image=DestroyImage(clone_image);
if (edge_image == (Image *) NULL)
return((Image *) NULL);
- charcoal_image=BlurImage(edge_image,radius,sigma,exception);
+ charcoal_image=BlurImage(edge_image,radius,sigma,bias,exception);
edge_image=DestroyImage(edge_image);
if (charcoal_image == (Image *) NULL)
return((Image *) NULL);
}
border_view=DestroyCacheView(border_view);
channel_mask=SetPixelChannelMask(border_image,AlphaChannel);
- shadow_image=BlurImage(border_image,0.0,sigma,exception);
+ shadow_image=BlurImage(border_image,0.0,sigma,image->bias,exception);
(void) SetPixelChannelMap(border_image,channel_mask);
border_image=DestroyImage(border_image);
if (shadow_image == (Image *) NULL)
% The format of the VignetteImage method is:
%
% Image *VignetteImage(const Image *image,const double radius,
-% const double sigma,const ssize_t x,const ssize_t y,ExceptionInfo *exception)
+% const double sigma,const ssize_t x,const ssize_t y,
+% ExceptionInfo *exception)
%
% A description of each parameter follows:
%
draw_info->primitive=AcquireString(ellipse);
(void) DrawImage(oval_image,draw_info,exception);
draw_info=DestroyDrawInfo(draw_info);
- blur_image=BlurImage(oval_image,radius,sigma,exception);
+ blur_image=BlurImage(oval_image,radius,sigma,image->bias,exception);
oval_image=DestroyImage(oval_image);
if (blur_image == (Image *) NULL)
{
extern MagickExport Image
*AddNoiseImage(const Image *,const NoiseType,ExceptionInfo *),
*BlueShiftImage(const Image *,const double,ExceptionInfo *),
- *CharcoalImage(const Image *,const double,const double,ExceptionInfo *),
+ *CharcoalImage(const Image *,const double,const double,const double,
+ ExceptionInfo *),
*ColorizeImage(const Image *,const char *,const PixelPacket,ExceptionInfo *),
*ColorMatrixImage(const Image *,const KernelInfo *kernel,ExceptionInfo *),
*FxImage(const Image *,const char *,ExceptionInfo *),
% The format of the MagickBlurImage method is:
%
% MagickBooleanType MagickBlurImage(MagickWand *wand,const double radius,
-% const double sigma)
+% const double sigmaconst double bias)
%
% A description of each parameter follows:
%
%
% o sigma: the standard deviation of the , in pixels.
%
+% o bias: the bias.
+%
*/
WandExport MagickBooleanType MagickBlurImage(MagickWand *wand,
- const double radius,const double sigma)
+ const double radius,const double sigma,const double bias)
{
Image
*blur_image;
(void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
if (wand->images == (Image *) NULL)
ThrowWandException(WandError,"ContainsNoImages",wand->name);
- blur_image=BlurImage(wand->images,radius,sigma,wand->exception);
+ blur_image=BlurImage(wand->images,radius,sigma,bias,wand->exception);
if (blur_image == (Image *) NULL)
return(MagickFalse);
ReplaceImageInList(&wand->images,blur_image);
% The format of the MagickCharcoalImage method is:
%
% MagickBooleanType MagickCharcoalImage(MagickWand *wand,
-% const double radius,const double sigma)
+% const double radius,const double sigma,const double bias)
%
% A description of each parameter follows:
%
%
% o sigma: the standard deviation of the Gaussian, in pixels.
%
+% o bias: the bias.
+%
*/
WandExport MagickBooleanType MagickCharcoalImage(MagickWand *wand,
- const double radius,const double sigma)
+ const double radius,const double sigma,const double bias)
{
Image
*charcoal_image;
(void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
if (wand->images == (Image *) NULL)
ThrowWandException(WandError,"ContainsNoImages",wand->name);
- charcoal_image=CharcoalImage(wand->images,radius,sigma,wand->exception);
+ charcoal_image=CharcoalImage(wand->images,radius,sigma,bias,wand->exception);
if (charcoal_image == (Image *) NULL)
return(MagickFalse);
ReplaceImageInList(&wand->images,charcoal_image);
% The format of the MagickGaussianBlurImage method is:
%
% MagickBooleanType MagickGaussianBlurImage(MagickWand *wand,
-% const double radius,const double sigma)
+% const double radius,const double sigma,const double bias)
%
% A description of each parameter follows:
%
%
% o sigma: the standard deviation of the Gaussian, in pixels.
%
+% o bias: the bias.
+%
*/
WandExport MagickBooleanType MagickGaussianBlurImage(MagickWand *wand,
- const double radius,const double sigma)
+ const double radius,const double sigma,const double bias)
{
Image
*blur_image;
(void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
if (wand->images == (Image *) NULL)
ThrowWandException(WandError,"ContainsNoImages",wand->name);
- blur_image=GaussianBlurImage(wand->images,radius,sigma,wand->exception);
+ blur_image=GaussianBlurImage(wand->images,radius,sigma,bias,wand->exception);
if (blur_image == (Image *) NULL)
return(MagickFalse);
ReplaceImageInList(&wand->images,blur_image);
% The format of the MagickSharpenImage method is:
%
% MagickBooleanType MagickSharpenImage(MagickWand *wand,
-% const double radius,const double sigma)
+% const double radius,const double sigma,const double bias)
%
% A description of each parameter follows:
%
%
% o sigma: the standard deviation of the Gaussian, in pixels.
%
+% o bias: the bias.
+%
*/
WandExport MagickBooleanType MagickSharpenImage(MagickWand *wand,
- const double radius,const double sigma)
+ const double radius,const double sigma,const double bias)
{
Image
*sharp_image;
(void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name);
if (wand->images == (Image *) NULL)
ThrowWandException(WandError,"ContainsNoImages",wand->name);
- sharp_image=SharpenImage(wand->images,radius,sigma,wand->exception);
+ sharp_image=SharpenImage(wand->images,radius,sigma,bias,wand->exception);
if (sharp_image == (Image *) NULL)
return(MagickFalse);
ReplaceImageInList(&wand->images,sharp_image);
MagickAutoLevelImage(MagickWand *),
MagickBlackThresholdImage(MagickWand *,const PixelWand *),
MagickBlueShiftImage(MagickWand *,const double),
- MagickBlurImage(MagickWand *,const double,const double),
+ MagickBlurImage(MagickWand *,const double,const double,const double),
MagickBorderImage(MagickWand *,const PixelWand *,const size_t,const size_t),
MagickBrightnessContrastImage(MagickWand *,const double,const double),
- MagickCharcoalImage(MagickWand *,const double,const double),
+ MagickCharcoalImage(MagickWand *,const double,const double,const double),
MagickChopImage(MagickWand *,const size_t,const size_t,const ssize_t,
const ssize_t),
MagickClampImage(MagickWand *),
MagickFunctionImage(MagickWand *,const MagickFunction,const size_t,
const double *),
MagickGammaImage(MagickWand *,const double),
- MagickGaussianBlurImage(MagickWand *,const double,const double),
+ MagickGaussianBlurImage(MagickWand *,const double,const double,const double),
MagickGetImageAlphaChannel(MagickWand *),
MagickGetImageBackgroundColor(MagickWand *,PixelWand *),
MagickGetImageBluePrimary(MagickWand *,double *,double *),
const double),
MagickShadowImage(MagickWand *,const double,const double,const ssize_t,
const ssize_t),
- MagickSharpenImage(MagickWand *,const double,const double),
+ MagickSharpenImage(MagickWand *,const double,const double,const double),
MagickShaveImage(MagickWand *,const size_t,const size_t),
MagickShearImage(MagickWand *,const PixelWand *,const double,const double),
MagickSigmoidalContrastImage(MagickWand *,const MagickBooleanType,
flags=ParseGeometry(argv[i+1],&geometry_info);
if ((flags & SigmaValue) == 0)
geometry_info.sigma=1.0;
+ if ((flags & XiValue) == 0)
+ geometry_info.xi=0.0;
mogrify_image=AdaptiveBlurImage(*image,geometry_info.rho,
geometry_info.sigma,geometry_info.xi,exception);
break;
flags=ParseGeometry(argv[i+1],&geometry_info);
if ((flags & SigmaValue) == 0)
geometry_info.sigma=1.0;
+ if ((flags & XiValue) == 0)
+ geometry_info.xi=0.0;
mogrify_image=AdaptiveSharpenImage(*image,geometry_info.rho,
geometry_info.sigma,geometry_info.xi,exception);
break;
flags=ParseGeometry(argv[i+1],&geometry_info);
if ((flags & SigmaValue) == 0)
geometry_info.sigma=1.0;
+ if ((flags & XiValue) == 0)
+ geometry_info.xi=0.0;
mogrify_image=BlurImage(*image,geometry_info.rho,
- geometry_info.sigma,exception);
+ geometry_info.sigma,geometry_info.xi,exception);
break;
}
if (LocaleCompare("border",option+1) == 0)
{
if (*option == '+')
{
- (void) QueryColorDatabase(MogrifyBorderColor,&draw_info->border_color,
- exception);
+ (void) QueryColorDatabase(MogrifyBorderColor,
+ &draw_info->border_color,exception);
break;
}
(void) QueryColorDatabase(argv[i+1],&draw_info->border_color,
flags=ParseGeometry(argv[i+1],&geometry_info);
if ((flags & SigmaValue) == 0)
geometry_info.sigma=1.0;
+ if ((flags & XiValue) == 0)
+ geometry_info.xi=1.0;
mogrify_image=CharcoalImage(*image,geometry_info.rho,
- geometry_info.sigma,exception);
+ geometry_info.sigma,geometry_info.xi,exception);
break;
}
if (LocaleCompare("chop",option+1) == 0)
flags=ParseGeometry(argv[i+1],&geometry_info);
if ((flags & SigmaValue) == 0)
geometry_info.sigma=1.0;
+ if ((flags & XiValue) == 0)
+ geometry_info.xi=0.0;
mogrify_image=GaussianBlurImage(*image,geometry_info.rho,
- geometry_info.sigma,exception);
+ geometry_info.sigma,geometry_info.xi,exception);
break;
}
if (LocaleCompare("geometry",option+1) == 0)
flags=ParseGeometry(argv[i+1],&geometry_info);
if ((flags & SigmaValue) == 0)
geometry_info.sigma=1.0;
+ if ((flags & XiValue) == 0)
+ geometry_info.xi=0.0;
mogrify_image=SharpenImage(*image,geometry_info.rho,
- geometry_info.sigma,exception);
+ geometry_info.sigma,geometry_info.xi,exception);
break;
}
if (LocaleCompare("shave",option+1) == 0)
"-brightness-contrast geometry",
" improve brightness / contrast of the image",
"-cdl filename color correct with a color decision list",
- "-charcoal radius simulate a charcoal drawing",
+ "-charcoal geometry simulate a charcoal drawing",
"-chop geometry remove pixels from the image interior",
"-clamp restrict pixel range from 0 to the quantum depth",
"-clip clip along the first path from the 8BIM profile",
{"bordercolor", StringReference}, {"color", StringReference},
{"compose", MagickComposeOptions} } },
{ "Blur", { {"geometry", StringReference}, {"radius", RealReference},
- {"sigma", RealReference}, {"channel", MagickChannelOptions} } },
+ {"sigma", RealReference}, {"bias", RealReference},
+ {"channel", MagickChannelOptions} } },
{ "Chop", { {"geometry", StringReference}, {"width", IntegerReference},
{"height", IntegerReference}, {"x", IntegerReference},
{"y", IntegerReference} } },
{ "Shade", { {"geometry", StringReference}, {"azimuth", RealReference},
{"elevation", RealReference}, {"gray", MagickBooleanOptions} } },
{ "Sharpen", { {"geometry", StringReference}, {"radius", RealReference},
- {"sigma", RealReference}, {"channel", MagickChannelOptions} } },
+ {"sigma", RealReference}, {"bias", RealReference},
+ {"channel", MagickChannelOptions} } },
{ "Shear", { {"geometry", StringReference}, {"x", RealReference},
{"y", RealReference}, { "fill", StringReference},
{"color", StringReference} } },
{ "Threshold", { {"threshold", StringReference},
{"channel", MagickChannelOptions} } },
{ "Charcoal", { {"geometry", StringReference}, {"radius", RealReference},
- {"sigma", RealReference} } },
+ {"sigma", RealReference}, {"biabias", RealReference} } },
{ "Trim", { {"fuzz", StringReference} } },
{ "Wave", { {"geometry", StringReference}, {"amplitude", RealReference},
{"wavelength", RealReference},
{ "Deconstruct", },
{ "GaussianBlur", { {"geometry", StringReference},
{"radius", RealReference}, {"sigma", RealReference},
- {"channel", MagickChannelOptions} } },
+ {"bias", RealReference}, {"channel", MagickChannelOptions} } },
{ "Convolve", { {"coefficients", ArrayReference},
{"channel", MagickChannelOptions}, {"bias", StringReference},
{"kernel", StringReference} } },
if (attribute_flag[2] != 0)
geometry_info.sigma=argument_list[2].real_reference;
if (attribute_flag[3] != 0)
- channel=(ChannelType) argument_list[3].integer_reference;
+ geometry_info.xi=argument_list[3].real_reference;
+ if (attribute_flag[4] != 0)
+ channel=(ChannelType) argument_list[4].integer_reference;
channel_mask=SetPixelChannelMask(image,channel);
image=BlurImage(image,geometry_info.rho,geometry_info.sigma,
- exception);
+ geometry_info.xi,exception);
if (image != (Image *) NULL)
(void) SetPixelChannelMask(image,channel_mask);
break;
if (attribute_flag[2] != 0)
geometry_info.sigma=argument_list[2].real_reference;
if (attribute_flag[3] != 0)
- channel=(ChannelType) argument_list[3].integer_reference;
+ geometry_info.xi=argument_list[3].real_reference;
+ if (attribute_flag[4] != 0)
+ channel=(ChannelType) argument_list[4].integer_reference;
channel_mask=SetPixelChannelMask(image,channel);
image=SharpenImage(image,geometry_info.rho,geometry_info.sigma,
- exception);
+ geometry_info.xi,exception);
if (image != (Image *) NULL)
(void) SetPixelChannelMask(image,channel_mask);
break;
geometry_info.rho=argument_list[1].real_reference;
if (attribute_flag[2] != 0)
geometry_info.sigma=argument_list[2].real_reference;
+ if (attribute_flag[3] != 0)
+ geometry_info.xi=argument_list[3].real_reference;
image=CharcoalImage(image,geometry_info.rho,geometry_info.sigma,
- exception);
+ geometry_info.xi,exception);
break;
}
case 59: /* Trim */
if (attribute_flag[2] != 0)
geometry_info.sigma=argument_list[2].real_reference;
if (attribute_flag[3] != 0)
- channel=(ChannelType) argument_list[3].integer_reference;
+ geometry_info.xi=argument_list[3].real_reference;
+ if (attribute_flag[4] != 0)
+ channel=(ChannelType) argument_list[4].integer_reference;
channel_mask=SetPixelChannelMask(image,channel);
image=GaussianBlurImage(image,geometry_info.rho,geometry_info.sigma,
- exception);
+ geometry_info.xi,exception);
if (image != (Image *) NULL)
(void) SetPixelChannelMask(image,channel_mask);
break;
previous_profile=GetImageProfile(image,name);
if (previous_profile != (const StringInfo *) NULL)
{
+ ssize_t
+ length;
+
+ length=GetStringInfoLength(profile);
SetStringInfoLength(profile,GetStringInfoLength(profile)+
GetStringInfoLength(previous_profile));
(void) memcpy(GetStringInfoDatum(profile),GetStringInfoDatum(profile)+
- GetStringInfoLength(previous_profile),GetStringInfoLength(profile));
+ GetStringInfoLength(previous_profile),length);
(void) memcpy(GetStringInfoDatum(profile),
GetStringInfoDatum(previous_profile),
GetStringInfoLength(previous_profile));
}
channel_mask=SetPixelChannelMask(msl_info->image[n],channel);
blur_image=BlurImage(msl_info->image[n],geometry_info.rho,
- geometry_info.sigma,&msl_info->image[n]->exception);
+ geometry_info.sigma,geometry_info.xi,
+ &msl_info->image[n]->exception);
(void) SetPixelChannelMap(msl_info->image[n],channel_mask);
if (blur_image == (Image *) NULL)
break;
}
if (LocaleCompare((const char *) tag, "charcoal") == 0)
{
- double radius = 0.0,
+ double bias = 0.0,
+ radius = 0.0,
sigma = 1.0;
if (msl_info->image[n] == (Image *) NULL)
msl_info->attributes[n],(const char *) attributes[i],&exception));
switch (*keyword)
{
+ case 'B':
+ case 'b':
+ {
+ if (LocaleCompare(keyword, "bias") == 0)
+ {
+ bias = InterpretLocaleValue(value,(char **) NULL);
+ break;
+ }
+ ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
+ break;
+ }
case 'R':
case 'r':
{
Image
*newImage;
- newImage=CharcoalImage(msl_info->image[n],radius,sigma,
+ newImage=CharcoalImage(msl_info->image[n],radius,sigma,bias,
&msl_info->image[n]->exception);
if (newImage == (Image *) NULL)
break;
}
if (LocaleCompare((const char *) tag,"sharpen") == 0)
{
- double radius = 0.0,
+ double bias = 0.0,
+ radius = 0.0,
sigma = 1.0;
if (msl_info->image[n] == (Image *) NULL)
msl_info->attributes[n],(const char *) attributes[i],&exception));
switch (*keyword)
{
+ case 'B':
+ case 'b':
+ {
+ if (LocaleCompare(keyword, "bias") == 0)
+ {
+ bias = InterpretLocaleValue(value,(char **) NULL);
+ break;
+ }
+ ThrowMSLException(OptionError,"UnrecognizedAttribute",keyword);
+ break;
+ }
case 'R':
case 'r':
{
Image
*newImage;
- newImage=SharpenImage(msl_info->image[n],radius,sigma,&msl_info->image[n]->exception);
+ newImage=SharpenImage(msl_info->image[n],radius,sigma,bias,
+ &msl_info->image[n]->exception);
if (newImage == (Image *) NULL)
break;
msl_info->image[n]=DestroyImage(msl_info->image[n]);