From: cristy Date: Mon, 5 Sep 2011 17:29:53 +0000 (+0000) Subject: (no commit message) X-Git-Tag: 7.0.1-0~7080 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8ae632dd5ba985b5cac535dd36e209795fbd52d8;p=imagemagick --- diff --git a/Magick++/lib/Image.cpp b/Magick++/lib/Image.cpp index 05fb5c6c2..d2cf163cd 100644 --- a/Magick++/lib/Image.cpp +++ b/Magick++/lib/Image.cpp @@ -864,12 +864,22 @@ void Magick::Image::draw ( const std::list &drawable_ ) } // Hilight edges in image -void Magick::Image::edge ( const double radius_ ) +void Magick::Image::edge ( const double radius_) { ExceptionInfo exceptionInfo; GetExceptionInfo( &exceptionInfo ); MagickCore::Image* newImage = - EdgeImage( image(), radius_, &exceptionInfo ); + EdgeImage( image(), radius_, 1.0, &exceptionInfo ); + replaceImage( newImage ); + throwException( exceptionInfo ); + (void) DestroyExceptionInfo( &exceptionInfo ); +} +void Magick::Image::edge ( const double radius_, const double sigma_ ) +{ + ExceptionInfo exceptionInfo; + GetExceptionInfo( &exceptionInfo ); + MagickCore::Image* newImage = + EdgeImage( image(), radius_, sigma_, &exceptionInfo ); replaceImage( newImage ); throwException( exceptionInfo ); (void) DestroyExceptionInfo( &exceptionInfo ); diff --git a/Magick++/lib/Magick++/Image.h b/Magick++/lib/Magick++/Image.h index 8d3986fb7..dd0397c36 100644 --- a/Magick++/lib/Magick++/Image.h +++ b/Magick++/lib/Magick++/Image.h @@ -284,6 +284,8 @@ namespace Magick // Edge image (hilight edges in image) void edge ( const double radius_ = 0.0 ); + void edge ( const double radius_ = 0.0, + const double sigma_ = 1.0); // Emboss image (hilight edges with 3D effect) // The radius_ parameter specifies the radius of the Gaussian, in diff --git a/Magick++/lib/Magick++/STL.h b/Magick++/lib/Magick++/STL.h index 2c3074ee3..df6c43a79 100644 --- a/Magick++/lib/Magick++/STL.h +++ b/Magick++/lib/Magick++/STL.h @@ -389,12 +389,13 @@ namespace Magick class MagickDLLDecl edgeImage : public std::unary_function { public: - edgeImage( const double radius_ = 0.0 ); + edgeImage( const double radius_ = 0.0, const double sigma_ = 0.5 ); void operator()( Image &image_ ) const; private: double _radius; + double _sigma; }; // Emboss image (hilight edges with 3D effect) diff --git a/Magick++/lib/STL.cpp b/Magick++/lib/STL.cpp index fdeee8a03..0a79fcc7f 100644 --- a/Magick++/lib/STL.cpp +++ b/Magick++/lib/STL.cpp @@ -335,13 +335,14 @@ void Magick::drawImage::operator()( Magick::Image &image_ ) const } // Edge image (hilight edges in image) -Magick::edgeImage::edgeImage( const double radius_ ) - : _radius( radius_ ) +Magick::edgeImage::edgeImage( const double radius_, const double sigma_ ) + : _radius( radius_ ), + _sigma( sigma_ ) { } void Magick::edgeImage::operator()( Magick::Image &image_ ) const { - image_.edge( _radius ); + image_.edge( _radius, _sigma ); } // Emboss image (hilight edges with 3D effect) diff --git a/MagickCore/display.c b/MagickCore/display.c index 536b0646b..3a3365aed 100644 --- a/MagickCore/display.c +++ b/MagickCore/display.c @@ -8316,7 +8316,8 @@ static Image *XMagickCommand(Display *display,XResourceInfo *resource_info, XSetCursorState(display,windows,MagickTrue); XCheckRefreshWindows(display,windows); flags=ParseGeometry(radius,&geometry_info); - edge_image=EdgeImage(*image,geometry_info.rho,exception); + edge_image=EdgeImage(*image,geometry_info.rho,geometry_info.sigma, + exception); if (edge_image != (Image *) NULL) { *image=DestroyImage(*image); @@ -8351,7 +8352,8 @@ static Image *XMagickCommand(Display *display,XResourceInfo *resource_info, XSetCursorState(display,windows,MagickTrue); XCheckRefreshWindows(display,windows); flags=ParseGeometry(amount,&geometry_info); - spread_image=EdgeImage(*image,geometry_info.rho,exception); + spread_image=EdgeImage(*image,geometry_info.rho,geometry_info.sigma, + exception); if (spread_image != (Image *) NULL) { *image=DestroyImage(*image); diff --git a/MagickCore/effect.c b/MagickCore/effect.c index 6e35d1511..fa49098bc 100644 --- a/MagickCore/effect.c +++ b/MagickCore/effect.c @@ -226,7 +226,7 @@ MagickExport Image *AdaptiveBlurImage(const Image *image, /* Edge detect the image brighness channel, level, blur, and level again. */ - edge_image=EdgeImage(image,radius,exception); + edge_image=EdgeImage(image,radius,sigma,exception); if (edge_image == (Image *) NULL) { blur_image=DestroyImage(blur_image); @@ -401,7 +401,7 @@ MagickExport Image *AdaptiveBlurImage(const Image *image, proceed; #if defined(MAGICKCORE_OPENMP_SUPPORT) - #pragma omp critical (MagickCore_AdaptiveSharpenImage) + #pragma omp critical (MagickCore_AdaptiveBlurImage) #endif proceed=SetImageProgress(image,AdaptiveBlurImageTag,progress++, image->rows); @@ -517,7 +517,7 @@ MagickExport Image *AdaptiveSharpenImage(const Image *image,const double radius, /* Edge detect the image brighness channel, level, sharp, and level again. */ - edge_image=EdgeImage(image,radius,exception); + edge_image=EdgeImage(image,radius,sigma,exception); if (edge_image == (Image *) NULL) { sharp_image=DestroyImage(sharp_image); @@ -1741,7 +1741,7 @@ MagickExport Image *DespeckleImage(const Image *image,ExceptionInfo *exception) % The format of the EdgeImage method is: % % Image *EdgeImage(const Image *image,const double radius, -% ExceptionInfo *exception) +% const double sigma,ExceptionInfo *exception) % % A description of each parameter follows: % @@ -1749,11 +1749,13 @@ MagickExport Image *DespeckleImage(const Image *image,ExceptionInfo *exception) % % o radius: the radius of the pixel neighborhood. % +% o sigma: the standard deviation of the Gaussian, in pixels. +% % o exception: return any errors or warnings in this structure. % */ MagickExport Image *EdgeImage(const Image *image,const double radius, - ExceptionInfo *exception) + const double sigma,ExceptionInfo *exception) { Image *edge_image; @@ -1778,7 +1780,7 @@ MagickExport Image *EdgeImage(const Image *image,const double radius, (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); assert(exception != (ExceptionInfo *) NULL); assert(exception->signature == MagickSignature); - width=GetOptimalKernelWidth1D(radius,0.5); + width=GetOptimalKernelWidth2D(radius,sigma); kernel_info=AcquireKernelInfo((const char *) NULL); if (kernel_info == (KernelInfo *) NULL) ThrowImageException(ResourceLimitError,"MemoryAllocationFailed"); @@ -2605,7 +2607,7 @@ MagickExport Image *PreviewImage(const Image *image,const PreviewType preview, } case EdgeDetectPreview: { - preview_image=EdgeImage(thumbnail,radius,exception); + preview_image=EdgeImage(thumbnail,radius,sigma,exception); (void) FormatLocaleString(label,MaxTextExtent,"edge %g",radius); break; } diff --git a/MagickCore/effect.h b/MagickCore/effect.h index 40cfd0d36..6d83189b8 100644 --- a/MagickCore/effect.h +++ b/MagickCore/effect.h @@ -78,7 +78,7 @@ extern MagickExport Image *BlurImage(const Image *,const double,const double,ExceptionInfo *), *ConvolveImage(const Image *,const KernelInfo *,ExceptionInfo *), *DespeckleImage(const Image *,ExceptionInfo *), - *EdgeImage(const Image *,const double,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 *), *MotionBlurImage(const Image *,const double,const double,const double, diff --git a/MagickCore/fx.c b/MagickCore/fx.c index 640bbf403..34f65a31d 100644 --- a/MagickCore/fx.c +++ b/MagickCore/fx.c @@ -641,7 +641,7 @@ MagickExport Image *CharcoalImage(const Image *image,const double radius, if (clone_image == (Image *) NULL) return((Image *) NULL); (void) SetImageType(clone_image,GrayscaleType,exception); - edge_image=EdgeImage(clone_image,radius,exception); + edge_image=EdgeImage(clone_image,radius,sigma,exception); clone_image=DestroyImage(clone_image); if (edge_image == (Image *) NULL) return((Image *) NULL); @@ -4366,7 +4366,7 @@ MagickExport Image *SketchImage(const Image *image,const double radius, random_image=DestroyImage(random_image); if (blur_image == (Image *) NULL) return((Image *) NULL); - dodge_image=EdgeImage(blur_image,radius,exception); + dodge_image=EdgeImage(blur_image,radius,sigma,exception); blur_image=DestroyImage(blur_image); if (dodge_image == (Image *) NULL) return((Image *) NULL); diff --git a/MagickWand/magick-image.c b/MagickWand/magick-image.c index 20abc98ab..9d66efd86 100644 --- a/MagickWand/magick-image.c +++ b/MagickWand/magick-image.c @@ -2502,7 +2502,8 @@ WandExport MagickBooleanType MagickDrawImage(MagickWand *wand, % % The format of the MagickEdgeImage method is: % -% MagickBooleanType MagickEdgeImage(MagickWand *wand,const double radius) +% MagickBooleanType MagickEdgeImage(MagickWand *wand,const double radius, +% const double sigma) % % A description of each parameter follows: % @@ -2510,9 +2511,11 @@ WandExport MagickBooleanType MagickDrawImage(MagickWand *wand, % % o radius: the radius of the pixel neighborhood. % +% o sigma: the standard deviation of the Gaussian, in pixels. +% */ WandExport MagickBooleanType MagickEdgeImage(MagickWand *wand, - const double radius) + const double radius,const double sigma) { Image *edge_image; @@ -2523,7 +2526,7 @@ WandExport MagickBooleanType MagickEdgeImage(MagickWand *wand, (void) LogMagickEvent(WandEvent,GetMagickModule(),"%s",wand->name); if (wand->images == (Image *) NULL) ThrowWandException(WandError,"ContainsNoImages",wand->name); - edge_image=EdgeImage(wand->images,radius,wand->exception); + edge_image=EdgeImage(wand->images,radius,sigma,wand->exception); if (edge_image == (Image *) NULL) return(MagickFalse); ReplaceImageInList(&wand->images,edge_image); diff --git a/MagickWand/magick-image.h b/MagickWand/magick-image.h index 8e2cb98e5..1f3e19888 100644 --- a/MagickWand/magick-image.h +++ b/MagickWand/magick-image.h @@ -118,7 +118,7 @@ extern WandExport MagickBooleanType MagickDistortImage(MagickWand *,const DistortImageMethod,const size_t, const double *,const MagickBooleanType), MagickDrawImage(MagickWand *,const DrawingWand *), - MagickEdgeImage(MagickWand *,const double), + MagickEdgeImage(MagickWand *,const double,const double), MagickEmbossImage(MagickWand *,const double,const double), MagickEncipherImage(MagickWand *,const char *), MagickEnhanceImage(MagickWand *), diff --git a/MagickWand/mogrify.c b/MagickWand/mogrify.c index e6a1ddea9..97ec4a789 100644 --- a/MagickWand/mogrify.c +++ b/MagickWand/mogrify.c @@ -1409,7 +1409,8 @@ WandExport MagickBooleanType MogrifyImage(ImageInfo *image_info,const int argc, flags=ParseGeometry(argv[i+1],&geometry_info); if ((flags & SigmaValue) == 0) geometry_info.sigma=1.0; - mogrify_image=EdgeImage(*image,geometry_info.rho,exception); + mogrify_image=EdgeImage(*image,geometry_info.rho, + geometry_info.sigma,exception); break; } if (LocaleCompare("emboss",option+1) == 0) diff --git a/PerlMagick/Magick.xs b/PerlMagick/Magick.xs index c5b907e94..e4ebb7560 100644 --- a/PerlMagick/Magick.xs +++ b/PerlMagick/Magick.xs @@ -7606,7 +7606,8 @@ Mogrify(ref,...) { if (attribute_flag[0] != 0) geometry_info.rho=argument_list[0].real_reference; - image=EdgeImage(image,geometry_info.rho,exception); + image=EdgeImage(image,geometry_info.rho,geometry_info.sigma, + exception); break; } case 11: /* Emboss */ diff --git a/coders/msl.c b/coders/msl.c index 042d8ede3..06d6be97e 100644 --- a/coders/msl.c +++ b/coders/msl.c @@ -2762,7 +2762,7 @@ static void MSLStartElement(void *context,const xmlChar *tag, } } edge_image=EdgeImage(msl_info->image[n],geometry_info.rho, - &msl_info->image[n]->exception); + geometry_info.sigma,&msl_info->image[n]->exception); if (edge_image == (Image *) NULL) break; msl_info->image[n]=DestroyImage(msl_info->image[n]);