1 // This may look like C code, but it is really -*- C++ -*-
3 // Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003
5 // Implementation of Image
8 #define MAGICKCORE_IMPLEMENTATION 1
9 #define MAGICK_PLUSPLUS_IMPLEMENTATION 1
11 #include "Magick++/Include.h"
20 #include "Magick++/Image.h"
21 #include "Magick++/Functions.h"
22 #include "Magick++/Pixels.h"
23 #include "Magick++/Options.h"
24 #include "Magick++/ImageRef.h"
26 #define AbsoluteValue(x) ((x) < 0 ? -(x) : (x))
27 #define MagickPI 3.14159265358979323846264338327950288419716939937510
28 #define DegreesToRadians(x) (MagickPI*(x)/180.0)
30 MagickPPExport const char *Magick::borderGeometryDefault="6x6+0+0";
31 MagickPPExport const char *Magick::frameGeometryDefault="25x25+6+6";
32 MagickPPExport const char *Magick::raiseGeometryDefault="6x6+0+0";
34 MagickPPExport int Magick::operator == (const Magick::Image &left_,
35 const Magick::Image &right_)
37 // If image pixels and signature are the same, then the image is identical
38 return((left_.rows() == right_.rows()) &&
39 (left_.columns() == right_.columns()) &&
40 (left_.signature() == right_.signature()));
43 MagickPPExport int Magick::operator != (const Magick::Image &left_,
44 const Magick::Image &right_)
46 return(!(left_ == right_));
49 MagickPPExport int Magick::operator > (const Magick::Image &left_,
50 const Magick::Image &right_)
52 return(!(left_ < right_) && (left_ != right_));
55 MagickPPExport int Magick::operator < (const Magick::Image &left_,
56 const Magick::Image &right_)
58 // If image pixels are less, then image is smaller
59 return((left_.rows() * left_.columns()) <
60 (right_.rows() * right_.columns()));
63 MagickPPExport int Magick::operator >= (const Magick::Image &left_,
64 const Magick::Image &right_)
66 return((left_ > right_) || (left_ == right_));
69 MagickPPExport int Magick::operator <= (const Magick::Image &left_,
70 const Magick::Image &right_)
72 return((left_ < right_) || ( left_ == right_));
75 Magick::Image::Image(void)
76 : _imgRef(new ImageRef)
80 Magick::Image::Image(const Blob &blob_)
81 : _imgRef(new ImageRef)
85 // Initialize, Allocate and Read images
88 catch(const Warning &/*warning_*/)
90 // FIXME: need a way to report warnings in constructor
92 catch (const Error &/*error_*/)
100 Magick::Image::Image(const Blob &blob_,const Geometry &size_)
101 : _imgRef(new ImageRef)
108 catch(const Warning &/*warning_*/)
110 // FIXME: need a way to report warnings in constructor
112 catch(const Error &/*error_*/)
120 Magick::Image::Image(const Blob &blob_,const Geometry &size_,
122 : _imgRef(new ImageRef)
127 read(blob_,size_,depth_);
129 catch(const Warning &/*warning_*/)
131 // FIXME: need a way to report warnings in constructor
133 catch(const Error &/*error_*/)
141 Magick::Image::Image(const Blob &blob_,const Geometry &size_,
142 const size_t depth_,const std::string &magick_)
143 : _imgRef(new ImageRef)
148 read(blob_,size_,depth_,magick_);
150 catch(const Warning &/*warning_*/)
152 // FIXME: need a way to report warnings in constructor
154 catch(const Error &/*error_*/)
162 Magick::Image::Image(const Blob &blob_,const Geometry &size_,
163 const std::string &magick_)
164 : _imgRef(new ImageRef)
169 read(blob_,size_,magick_);
171 catch(const Warning &/*warning_*/)
173 // FIXME: need a way to report warnings in constructor
175 catch(const Error &/*error_*/)
183 Magick::Image::Image(const Geometry &size_,const Color &color_)
184 : _imgRef(new ImageRef)
186 // xc: prefix specifies an X11 color string
187 std::string imageSpec("xc:");
195 // Initialize, Allocate and Read images
198 catch(const Warning &/*warning_*/)
200 // FIXME: need a way to report warnings in constructor
202 catch(const Error & /*error_*/)
210 Magick::Image::Image(const Image &image_)
211 : _imgRef(image_._imgRef)
213 Lock(&_imgRef->_mutexLock);
215 // Increase reference count
216 ++_imgRef->_refCount;
219 Magick::Image::Image(const size_t width_,const size_t height_,
220 const std::string &map_,const StorageType type_,const void *pixels_)
221 : _imgRef(new ImageRef)
225 read(width_,height_,map_.c_str(),type_,pixels_);
227 catch(const Warning &/*warning_*/)
229 // FIXME: need a way to report warnings in constructor
231 catch(const Error &/*error_*/)
239 Magick::Image::Image(const std::string &imageSpec_)
240 : _imgRef(new ImageRef)
244 // Initialize, Allocate and Read images
247 catch(const Warning &/*warning_*/)
249 // FIXME: need a way to report warnings in constructor
251 catch(const Error &/*error_*/)
259 Magick::Image::~Image()
265 Lock(&_imgRef->_mutexLock);
266 if (--_imgRef->_refCount == 0)
276 Magick::Image& Magick::Image::operator=(const Magick::Image &image_)
284 Lock(&image_._imgRef->_mutexLock);
285 ++image_._imgRef->_refCount;
289 Lock(&_imgRef->_mutexLock);
290 if (--_imgRef->_refCount == 0)
296 // Delete old image reference with associated image and options.
300 // Use new image reference
301 _imgRef=image_._imgRef;
307 void Magick::Image::adjoin(const bool flag_)
310 options()->adjoin(flag_);
313 bool Magick::Image::adjoin(void) const
315 return(constOptions()->adjoin());
318 void Magick::Image::alpha(const bool matteFlag_)
322 // If matte channel is requested, but image doesn't already have a
323 // matte channel, then create an opaque matte channel. Likewise, if
324 // the image already has a matte channel but a matte channel is not
325 // desired, then set the matte channel to opaque.
327 if ((matteFlag_ && !constImage()->alpha_trait) ||
328 (constImage()->alpha_trait && !matteFlag_))
329 SetImageAlpha(image(),OpaqueAlpha,&exceptionInfo);
332 image()->alpha_trait=matteFlag_ ? BlendPixelTrait : UndefinedPixelTrait;
335 bool Magick::Image::alpha(void) const
337 if (constImage()->alpha_trait == BlendPixelTrait)
343 void Magick::Image::alphaColor(const Color &alphaColor_)
347 if (alphaColor_.isValid())
349 image()->matte_color=alphaColor_;
350 options()->matteColor(alphaColor_);
354 // Set to default matte color
355 Color tmpColor("#BDBDBD");
356 image()->matte_color=tmpColor;
357 options()->matteColor(tmpColor);
361 Magick::Color Magick::Image::alphaColor(void) const
363 return(Color(ClampToQuantum(constImage()->matte_color.red),
364 ClampToQuantum(constImage()->matte_color.green),
365 ClampToQuantum(constImage()->matte_color.blue)));
368 void Magick::Image::antiAlias(const bool flag_)
371 options()->antiAlias(static_cast<size_t>(flag_));
374 bool Magick::Image::antiAlias(void)
376 return(static_cast<bool>(options()->antiAlias()));
379 void Magick::Image::animationDelay(const size_t delay_)
382 image()->delay=delay_;
385 size_t Magick::Image::animationDelay(void) const
387 return(constImage()->delay);
390 void Magick::Image::animationIterations(const size_t iterations_)
393 image()->iterations=iterations_;
396 size_t Magick::Image::animationIterations(void) const
398 return(constImage()->iterations);
401 void Magick::Image::attenuate(const double attenuate_)
404 value[MaxTextExtent];
407 FormatLocaleString(value,MaxTextExtent,"%.20g",attenuate_);
408 (void) SetImageArtifact(image(),"attenuate",value);
411 void Magick::Image::backgroundColor(const Color &backgroundColor_)
415 if (backgroundColor_.isValid())
416 image()->background_color=backgroundColor_;
418 image()->background_color=Color();
420 options()->backgroundColor(backgroundColor_);
423 Magick::Color Magick::Image::backgroundColor(void) const
425 return(constOptions()->backgroundColor());
428 void Magick::Image::backgroundTexture(const std::string &backgroundTexture_)
431 options()->backgroundTexture(backgroundTexture_);
434 std::string Magick::Image::backgroundTexture(void) const
436 return(constOptions()->backgroundTexture());
439 size_t Magick::Image::baseColumns(void) const
441 return(constImage()->magick_columns);
444 std::string Magick::Image::baseFilename(void) const
446 return(std::string(constImage()->magick_filename));
449 size_t Magick::Image::baseRows(void) const
451 return(constImage()->magick_rows);
454 void Magick::Image::blackPointCompensation(const bool flag_)
456 image()->black_point_compensation=(MagickBooleanType) flag_;
459 bool Magick::Image::blackPointCompensation(void) const
461 return(static_cast<bool>(constImage()->black_point_compensation));
464 void Magick::Image::borderColor(const Color &borderColor_)
468 if (borderColor_.isValid())
469 image()->border_color=borderColor_;
471 image()->border_color=Color();
473 options()->borderColor(borderColor_);
476 Magick::Color Magick::Image::borderColor(void) const
478 return(constOptions()->borderColor());
481 Magick::Geometry Magick::Image::boundingBox(void) const
487 bbox=GetImageBoundingBox(constImage(),&exceptionInfo);
489 return(Geometry(bbox));
492 void Magick::Image::boxColor(const Color &boxColor_)
495 options()->boxColor(boxColor_);
498 Magick::Color Magick::Image::boxColor(void) const
500 return(constOptions()->boxColor());
503 void Magick::Image::channelDepth(const size_t depth_)
507 SetImageDepth(image(),depth_,&exceptionInfo);
511 size_t Magick::Image::channelDepth()
517 channel_depth=GetImageDepth(constImage(),&exceptionInfo);
519 return(channel_depth);
522 size_t Magick::Image::channels() const
524 return(constImage()->number_channels);
527 void Magick::Image::classType(const ClassType class_)
529 if (classType() == PseudoClass && class_ == DirectClass)
531 // Use SyncImage to synchronize the DirectClass pixels with the
532 // color map and then set to DirectClass type.
535 SyncImage(image(),&exceptionInfo);
537 image()->colormap=(PixelInfo *)RelinquishMagickMemory(image()->colormap);
538 image()->storage_class=static_cast<MagickCore::ClassType>(DirectClass);
542 if (classType() == DirectClass && class_ == PseudoClass)
544 // Quantize to create PseudoClass color map
546 quantizeColors(MaxColormapSize);
548 image()->storage_class=static_cast<MagickCore::ClassType>(PseudoClass);
552 Magick::ClassType Magick::Image::classType(void) const
554 return static_cast<Magick::ClassType>(constImage()->storage_class);
557 void Magick::Image::clipMask(const Magick::Image &clipMask_)
562 if (clipMask_.isValid())
563 SetImageMask(image(),clipMask_.constImage(),&exceptionInfo);
565 SetImageMask(image(),0,&exceptionInfo);
569 Magick::Image Magick::Image::clipMask(void) const
575 image=GetImageMask(constImage(),&exceptionInfo);
577 if (image == (MagickCore::Image *) NULL)
578 return(Magick::Image());
580 return(Magick::Image(image));
583 void Magick::Image::colorFuzz(const double fuzz_)
587 options()->colorFuzz(fuzz_);
590 double Magick::Image::colorFuzz(void) const
592 return(constOptions()->colorFuzz());
595 void Magick::Image::colorMapSize(const size_t entries_)
597 if (entries_ >MaxColormapSize)
598 throwExceptionExplicit(OptionError,
599 "Colormap entries must not exceed MaxColormapSize");
603 (void) AcquireImageColormap(image(),entries_,&exceptionInfo);
607 size_t Magick::Image::colorMapSize(void) const
609 if (!constImage()->colormap)
610 throwExceptionExplicit(OptionError,"Image does not contain a colormap");
612 return(constImage()->colors);
615 void Magick::Image::colorSpace(const ColorspaceType colorSpace_)
617 if (image()->colorspace == colorSpace_)
622 TransformImageColorspace(image(),colorSpace_,&exceptionInfo);
626 Magick::ColorspaceType Magick::Image::colorSpace(void) const
628 return (constImage()->colorspace);
631 void Magick::Image::colorSpaceType(const ColorspaceType colorSpace_)
635 SetImageColorspace(image(),colorSpace_,&exceptionInfo);
637 options()->colorspaceType(colorSpace_);
640 Magick::ColorspaceType Magick::Image::colorSpaceType(void) const
642 return(constOptions()->colorspaceType());
645 size_t Magick::Image::columns(void) const
647 return(constImage()->columns);
650 void Magick::Image::comment(const std::string &comment_)
654 SetImageProperty(image(),"Comment",NULL,&exceptionInfo);
655 if (comment_.length() > 0)
656 SetImageProperty(image(),"Comment",comment_.c_str(),&exceptionInfo);
660 std::string Magick::Image::comment(void) const
666 value=GetImageProperty(constImage(),"Comment",&exceptionInfo);
670 return(std::string(value));
672 return(std::string()); // Intentionally no exception
675 void Magick::Image::compose(const CompositeOperator compose_)
677 image()->compose=compose_;
680 Magick::CompositeOperator Magick::Image::compose(void) const
682 return(constImage()->compose);
685 void Magick::Image::compressType(const CompressionType compressType_)
688 image()->compression=compressType_;
689 options()->compressType(compressType_);
692 Magick::CompressionType Magick::Image::compressType(void) const
694 return(constImage()->compression);
697 void Magick::Image::debug(const bool flag_)
700 options()->debug(flag_);
703 bool Magick::Image::debug(void) const
705 return(constOptions()->debug());
708 void Magick::Image::density(const Geometry &density_)
711 options()->density(density_);
712 if (density_.isValid())
714 image()->resolution.x=density_.width();
715 if (density_.height() != 0)
716 image()->resolution.y=density_.height();
718 image()->resolution.y=density_.width();
723 image()->resolution.x=0;
724 image()->resolution.y=0;
728 Magick::Geometry Magick::Image::density(void) const
736 if (constImage()->resolution.x > 0.0)
737 x_resolution=static_cast<ssize_t>(constImage()->resolution.x + 0.5);
739 if (constImage()->resolution.y > 0.0)
740 y_resolution=static_cast<ssize_t>(constImage()->resolution.y + 0.5);
742 return(Geometry(x_resolution,y_resolution));
745 return(constOptions()->density());
748 void Magick::Image::depth(const size_t depth_)
753 if (depth > MAGICKCORE_QUANTUM_DEPTH)
754 depth=MAGICKCORE_QUANTUM_DEPTH;
757 image()->depth=depth;
758 options()->depth(depth);
761 size_t Magick::Image::depth(void) const
763 return(constImage()->depth);
766 std::string Magick::Image::directory(void) const
768 if (constImage()->directory)
769 return(std::string(constImage()->directory));
771 throwExceptionExplicit(CorruptImageWarning,
772 "Image does not contain a directory");
774 return(std::string());
777 void Magick::Image::endian(const Magick::EndianType endian_)
780 options()->endian(endian_);
781 image()->endian=endian_;
784 Magick::EndianType Magick::Image::endian(void) const
786 return(constImage()->endian);
789 void Magick::Image::exifProfile(const Magick::Blob &exifProfile_)
793 if (exifProfile_.data() != 0)
798 exif_profile=AcquireStringInfo(exifProfile_.length());
799 SetStringInfoDatum(exif_profile,(unsigned char *) exifProfile_.data());
801 (void) SetImageProfile(image(),"exif",exif_profile,&exceptionInfo);
802 exif_profile=DestroyStringInfo(exif_profile);
807 Magick::Blob Magick::Image::exifProfile(void) const
812 exif_profile=GetImageProfile(constImage(),"exif");
813 if (exif_profile == (StringInfo *) NULL)
815 return(Blob(GetStringInfoDatum(exif_profile),
816 GetStringInfoLength(exif_profile)));
819 void Magick::Image::fileName(const std::string &fileName_)
823 fileName_.copy(image()->filename,sizeof(image()->filename)-1);
824 image()->filename[fileName_.length()]=0; // Null terminate
826 options()->fileName(fileName_);
829 std::string Magick::Image::fileName(void) const
831 return(constOptions()->fileName());
834 MagickCore::MagickSizeType Magick::Image::fileSize(void) const
836 return(GetBlobSize(constImage()));
839 void Magick::Image::fillColor(const Magick::Color &fillColor_)
845 options()->fillColor(fillColor_);
847 artifact("fill",value);
850 Magick::Color Magick::Image::fillColor(void) const
852 return(constOptions()->fillColor());
855 void Magick::Image::fillRule(const Magick::FillRule &fillRule_)
858 options()->fillRule(fillRule_);
861 Magick::FillRule Magick::Image::fillRule(void) const
863 return constOptions()->fillRule();
866 void Magick::Image::fillPattern(const Image &fillPattern_)
869 if (fillPattern_.isValid())
870 options()->fillPattern(fillPattern_.constImage());
872 options()->fillPattern(static_cast<MagickCore::Image*>(NULL));
875 Magick::Image Magick::Image::fillPattern(void) const
877 // FIXME: This is inordinately innefficient
878 const MagickCore::Image
884 tmpTexture=constOptions()->fillPattern();
892 image=CloneImage(tmpTexture,0,0,MagickTrue,&exceptionInfo);
893 texture.replaceImage(image);
899 void Magick::Image::filterType(const Magick::FilterTypes filterType_)
902 image()->filter=filterType_;
905 Magick::FilterTypes Magick::Image::filterType(void) const
907 return(constImage()->filter);
910 void Magick::Image::font(const std::string &font_)
913 options()->font(font_);
916 std::string Magick::Image::font(void) const
918 return(constOptions()->font());
921 void Magick::Image::fontPointsize(const double pointSize_)
924 options()->fontPointsize(pointSize_);
927 double Magick::Image::fontPointsize(void) const
929 return(constOptions()->fontPointsize());
932 std::string Magick::Image::format(void) const
938 magick_info=GetMagickInfo(constImage()->magick,&exceptionInfo);
941 if ((magick_info != 0) && (*magick_info->description != '\0'))
942 return(std::string(magick_info->description));
944 throwExceptionExplicit(CorruptImageWarning,"Unrecognized image magick type");
945 return(std::string());
948 std::string Magick::Image::formatExpression(const std::string expression)
957 text=InterpretImageProperties(imageInfo(),image(),expression.c_str(),
959 if (text != (char *) NULL)
961 result=std::string(text);
962 text=DestroyString(text);
968 double Magick::Image::gamma(void) const
970 return(constImage()->gamma);
973 Magick::Geometry Magick::Image::geometry(void) const
975 if (constImage()->geometry)
976 return Geometry(constImage()->geometry);
978 throwExceptionExplicit(OptionWarning,"Image does not contain a geometry");
983 void Magick::Image::gifDisposeMethod(
984 const MagickCore::DisposeType disposeMethod_)
987 image()->dispose=disposeMethod_;
990 MagickCore::DisposeType Magick::Image::gifDisposeMethod(void) const
992 return(constImage()->dispose);
995 void Magick::Image::highlightColor(const Color color_)
1001 artifact("highlight-color",value);
1004 void Magick::Image::iccColorProfile(const Magick::Blob &colorProfile_)
1006 profile("icm",colorProfile_);
1009 Magick::Blob Magick::Image::iccColorProfile(void) const
1014 color_profile=GetImageProfile(constImage(),"icc");
1015 if (color_profile == (StringInfo *) NULL)
1017 return(Blob(GetStringInfoDatum(color_profile),GetStringInfoLength(
1021 void Magick::Image::interlaceType(const Magick::InterlaceType interlace_)
1024 image()->interlace=interlace_;
1025 options()->interlaceType(interlace_);
1028 Magick::InterlaceType Magick::Image::interlaceType(void) const
1030 return(constImage()->interlace);
1033 void Magick::Image::interpolate(const PixelInterpolateMethod interpolate_)
1036 image()->interpolate=interpolate_;
1039 Magick::PixelInterpolateMethod Magick::Image::interpolate(void) const
1041 return constImage()->interpolate;
1044 void Magick::Image::iptcProfile(const Magick::Blob &iptcProfile_)
1047 if (iptcProfile_.data() != 0)
1052 iptc_profile=AcquireStringInfo(iptcProfile_.length());
1053 SetStringInfoDatum(iptc_profile,(unsigned char *) iptcProfile_.data());
1055 (void) SetImageProfile(image(),"iptc",iptc_profile,&exceptionInfo);
1056 iptc_profile=DestroyStringInfo(iptc_profile);
1061 Magick::Blob Magick::Image::iptcProfile(void) const
1066 iptc_profile=GetImageProfile(constImage(),"iptc");
1067 if (iptc_profile == (StringInfo *) NULL)
1069 return(Blob(GetStringInfoDatum(iptc_profile),GetStringInfoLength(
1073 void Magick::Image::isValid(const bool isValid_)
1078 _imgRef=new ImageRef;
1080 else if (!isValid())
1082 // Construct with single-pixel black image to make
1083 // image valid. This is an obvious hack.
1084 size(Geometry(1,1));
1089 bool Magick::Image::isValid(void) const
1091 return rows() && columns();
1094 void Magick::Image::label(const std::string &label_)
1098 (void) SetImageProperty(image(),"Label",NULL,&exceptionInfo);
1099 if (label_.length() > 0)
1100 (void) SetImageProperty(image(),"Label",label_.c_str(),&exceptionInfo);
1104 std::string Magick::Image::label(void) const
1110 value=GetImageProperty(constImage(),"Label",&exceptionInfo);
1114 return(std::string(value));
1116 return(std::string());
1119 void Magick::Image::lowlightColor(const Color color_)
1125 artifact("lowlight-color",value);
1128 void Magick::Image::magick(const std::string &magick_)
1132 magick_.copy(image()->magick,sizeof(image()->magick)-1);
1133 image()->magick[magick_.length()]=0;
1135 options()->magick(magick_);
1138 std::string Magick::Image::magick(void) const
1140 if (*(constImage()->magick) != '\0')
1141 return(std::string(constImage()->magick));
1143 return(constOptions()->magick());
1146 double Magick::Image::meanErrorPerPixel(void) const
1148 return(constImage()->error.mean_error_per_pixel);
1151 void Magick::Image::modulusDepth(const size_t depth_)
1155 SetImageDepth(image(),depth_,&exceptionInfo);
1157 options()->depth(depth_);
1160 size_t Magick::Image::modulusDepth(void) const
1166 depth=GetImageDepth(constImage(),&exceptionInfo);
1171 void Magick::Image::monochrome(const bool monochromeFlag_)
1174 options()->monochrome(monochromeFlag_);
1177 bool Magick::Image::monochrome(void) const
1179 return(constOptions()->monochrome());
1182 Magick::Geometry Magick::Image::montageGeometry(void) const
1184 if (constImage()->montage)
1185 return Magick::Geometry(constImage()->montage);
1187 throwExceptionExplicit(CorruptImageWarning,
1188 "Image does not contain a montage");
1190 return(Magick::Geometry());
1193 double Magick::Image::normalizedMaxError(void) const
1195 return(constImage()->error.normalized_maximum_error);
1198 double Magick::Image::normalizedMeanError(void) const
1200 return(constImage()->error.normalized_mean_error);
1203 void Magick::Image::orientation(const Magick::OrientationType orientation_)
1206 image()->orientation=orientation_;
1209 Magick::OrientationType Magick::Image::orientation(void) const
1211 return(constImage()->orientation);
1214 void Magick::Image::page(const Magick::Geometry &pageSize_)
1217 options()->page(pageSize_);
1218 image()->page=pageSize_;
1221 Magick::Geometry Magick::Image::page(void) const
1223 return(Geometry(constImage()->page.width,constImage()->page.height,
1224 AbsoluteValue(constImage()->page.x),AbsoluteValue(constImage()->page.y),
1225 constImage()->page.x < 0 ? true : false,
1226 constImage()->page.y < 0 ? true : false));
1229 void Magick::Image::quality(const size_t quality_)
1232 image()->quality=quality_;
1233 options()->quality(quality_);
1236 size_t Magick::Image::quality(void) const
1238 return(constImage()->quality);
1241 void Magick::Image::quantizeColors(const size_t colors_)
1244 options()->quantizeColors(colors_);
1247 size_t Magick::Image::quantizeColors(void) const
1249 return(constOptions()->quantizeColors());
1252 void Magick::Image::quantizeColorSpace(
1253 const Magick::ColorspaceType colorSpace_)
1256 options()->quantizeColorSpace(colorSpace_);
1259 Magick::ColorspaceType Magick::Image::quantizeColorSpace(void) const
1261 return(constOptions()->quantizeColorSpace());
1264 void Magick::Image::quantizeDither(const bool ditherFlag_)
1267 options()->quantizeDither(ditherFlag_);
1270 bool Magick::Image::quantizeDither(void) const
1272 return(constOptions()->quantizeDither());
1275 void Magick::Image::quantizeDitherMethod(const DitherMethod ditherMethod_)
1278 options()->quantizeDitherMethod(ditherMethod_);
1281 MagickCore::DitherMethod Magick::Image::quantizeDitherMethod(void) const
1283 return(constOptions()->quantizeDitherMethod());
1286 void Magick::Image::quantizeTreeDepth(const size_t treeDepth_)
1289 options()->quantizeTreeDepth(treeDepth_);
1292 size_t Magick::Image::quantizeTreeDepth() const
1294 return(constOptions()->quantizeTreeDepth());
1297 void Magick::Image::renderingIntent(
1298 const Magick::RenderingIntent renderingIntent_)
1301 image()->rendering_intent=renderingIntent_;
1304 Magick::RenderingIntent Magick::Image::renderingIntent(void) const
1306 return(static_cast<Magick::RenderingIntent>(constImage()->rendering_intent));
1309 void Magick::Image::resolutionUnits(
1310 const Magick::ResolutionType resolutionUnits_)
1313 image()->units=resolutionUnits_;
1314 options()->resolutionUnits(resolutionUnits_);
1317 Magick::ResolutionType Magick::Image::resolutionUnits(void) const
1319 return(constOptions()->resolutionUnits());
1322 size_t Magick::Image::rows(void) const
1324 return(constImage()->rows);
1327 void Magick::Image::scene(const size_t scene_)
1330 image()->scene=scene_;
1333 size_t Magick::Image::scene(void) const
1335 return(constImage()->scene);
1338 void Magick::Image::size(const Geometry &geometry_)
1341 options()->size(geometry_);
1342 image()->rows=geometry_.height();
1343 image()->columns=geometry_.width();
1346 Magick::Geometry Magick::Image::size(void) const
1348 return(Magick::Geometry(constImage()->columns,constImage()->rows));
1351 void Magick::Image::strokeAntiAlias(const bool flag_)
1354 options()->strokeAntiAlias(flag_);
1357 bool Magick::Image::strokeAntiAlias(void) const
1359 return(constOptions()->strokeAntiAlias());
1362 void Magick::Image::strokeColor(const Magick::Color &strokeColor_)
1368 options()->strokeColor(strokeColor_);
1370 artifact("stroke",value);
1373 Magick::Color Magick::Image::strokeColor(void) const
1375 return(constOptions()->strokeColor());
1378 void Magick::Image::strokeDashArray(const double *strokeDashArray_)
1381 options()->strokeDashArray(strokeDashArray_);
1384 const double* Magick::Image::strokeDashArray(void) const
1386 return(constOptions()->strokeDashArray());
1389 void Magick::Image::strokeDashOffset(const double strokeDashOffset_)
1392 options()->strokeDashOffset(strokeDashOffset_);
1395 double Magick::Image::strokeDashOffset(void) const
1397 return(constOptions()->strokeDashOffset());
1400 void Magick::Image::strokeLineCap(const Magick::LineCap lineCap_)
1403 options()->strokeLineCap(lineCap_);
1406 Magick::LineCap Magick::Image::strokeLineCap(void) const
1408 return(constOptions()->strokeLineCap());
1411 void Magick::Image::strokeLineJoin(const Magick::LineJoin lineJoin_)
1414 options()->strokeLineJoin(lineJoin_);
1417 Magick::LineJoin Magick::Image::strokeLineJoin(void) const
1419 return(constOptions()->strokeLineJoin());
1422 void Magick::Image::strokeMiterLimit(const size_t strokeMiterLimit_)
1425 options()->strokeMiterLimit(strokeMiterLimit_);
1428 size_t Magick::Image::strokeMiterLimit(void) const
1430 return(constOptions()->strokeMiterLimit());
1433 void Magick::Image::strokePattern(const Image &strokePattern_)
1436 if(strokePattern_.isValid())
1437 options()->strokePattern(strokePattern_.constImage());
1439 options()->strokePattern(static_cast<MagickCore::Image*>(NULL));
1442 Magick::Image Magick::Image::strokePattern(void) const
1444 // FIXME: This is inordinately innefficient
1445 const MagickCore::Image
1451 tmpTexture=constOptions()->strokePattern();
1459 image=CloneImage(tmpTexture,0,0,MagickTrue,&exceptionInfo);
1460 texture.replaceImage(image);
1466 void Magick::Image::strokeWidth(const double strokeWidth_)
1469 value[MaxTextExtent];
1472 options()->strokeWidth(strokeWidth_);
1473 FormatLocaleString(value,MaxTextExtent,"%.20g",strokeWidth_);
1474 (void) SetImageArtifact(image(),"strokewidth",value);
1477 double Magick::Image::strokeWidth(void) const
1479 return(constOptions()->strokeWidth());
1482 void Magick::Image::subImage(const size_t subImage_)
1485 options()->subImage(subImage_);
1488 size_t Magick::Image::subImage(void) const
1490 return(constOptions()->subImage());
1493 void Magick::Image::subRange(const size_t subRange_)
1496 options()->subRange(subRange_);
1499 size_t Magick::Image::subRange(void) const
1501 return(constOptions()->subRange());
1504 void Magick::Image::textDirection(DirectionType direction_)
1507 options()->textDirection(direction_);
1510 Magick::DirectionType Magick::Image::textDirection(void) const
1512 return(constOptions()->textDirection());
1515 void Magick::Image::textEncoding(const std::string &encoding_)
1518 options()->textEncoding(encoding_);
1521 std::string Magick::Image::textEncoding(void) const
1523 return(constOptions()->textEncoding());
1526 void Magick::Image::textGravity(GravityType gravity_)
1529 options()->textGravity(gravity_);
1532 Magick::GravityType Magick::Image::textGravity(void) const
1534 return(constOptions()->textGravity());
1537 void Magick::Image::textInterlineSpacing(double spacing_)
1540 options()->textInterlineSpacing(spacing_);
1543 double Magick::Image::textInterlineSpacing(void) const
1545 return(constOptions()->textInterlineSpacing());
1548 void Magick::Image::textInterwordSpacing(double spacing_)
1551 options()->textInterwordSpacing(spacing_);
1554 double Magick::Image::textInterwordSpacing(void) const
1556 return(constOptions()->textInterwordSpacing());
1559 void Magick::Image::textKerning(double kerning_)
1562 options()->textKerning(kerning_);
1565 double Magick::Image::textKerning(void) const
1567 return(constOptions()->textKerning());
1570 size_t Magick::Image::totalColors(void) const
1576 colors=GetNumberColors(constImage(),0,&exceptionInfo);
1581 void Magick::Image::transformRotation(const double angle_)
1584 options()->transformRotation(angle_);
1587 void Magick::Image::transformSkewX(const double skewx_)
1590 options()->transformSkewX(skewx_);
1593 void Magick::Image::transformSkewY(const double skewy_)
1596 options()->transformSkewY(skewy_);
1599 Magick::ImageType Magick::Image::type(void) const
1601 if (constOptions()->type() != UndefinedType)
1602 return(constOptions()->type());
1603 else if (constImage()->type != UndefinedType)
1604 return(constImage()->type);
1606 return(determineType());
1609 void Magick::Image::type(const Magick::ImageType type_)
1612 options()->type(type_);
1614 SetImageType(image(),type_,&exceptionInfo);
1618 void Magick::Image::verbose(const bool verboseFlag_)
1621 options()->verbose(verboseFlag_);
1624 bool Magick::Image::verbose(void) const
1626 return(constOptions()->verbose());
1629 void Magick::Image::view(const std::string &view_)
1632 options()->view(view_);
1635 std::string Magick::Image::view(void) const
1637 return(constOptions()->view());
1640 void Magick::Image::virtualPixelMethod(
1641 const VirtualPixelMethod virtualPixelMethod_)
1645 SetImageVirtualPixelMethod(image(),virtualPixelMethod_,&exceptionInfo);
1649 Magick::VirtualPixelMethod Magick::Image::virtualPixelMethod(void) const
1651 return(GetImageVirtualPixelMethod(constImage()));
1654 void Magick::Image::x11Display(const std::string &display_)
1657 options()->x11Display(display_);
1660 std::string Magick::Image::x11Display(void) const
1662 return(constOptions()->x11Display());
1665 double Magick::Image::xResolution(void) const
1667 return(constImage()->resolution.x);
1670 double Magick::Image::yResolution(void) const
1672 return(constImage()->resolution.y);
1675 void Magick::Image::adaptiveBlur(const double radius_,const double sigma_)
1681 newImage=AdaptiveBlurImage(constImage(),radius_,sigma_,&exceptionInfo);
1682 replaceImage(newImage);
1686 void Magick::Image::adaptiveResize(const Geometry &geometry_)
1699 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
1703 newImage=AdaptiveResizeImage(constImage(),width,height,&exceptionInfo);
1704 replaceImage(newImage);
1708 void Magick::Image::adaptiveSharpen(const double radius_,const double sigma_)
1714 newImage=AdaptiveSharpenImage(constImage(),radius_,sigma_,&exceptionInfo);
1715 replaceImage(newImage);
1719 void Magick::Image::adaptiveSharpenChannel(const ChannelType channel_,
1720 const double radius_,const double sigma_ )
1726 SetPPChannelMask(channel_);
1727 newImage=AdaptiveSharpenImage(constImage(),radius_,sigma_,&exceptionInfo);
1728 RestorePPChannelMask;
1729 replaceImage(newImage);
1733 void Magick::Image::adaptiveThreshold(const size_t width_,const size_t height_,
1734 const ssize_t offset_)
1741 newImage=AdaptiveThresholdImage(constImage(),width_,height_,offset_,
1743 replaceImage(newImage);
1747 void Magick::Image::addNoise(const NoiseType noiseType_)
1753 newImage=AddNoiseImage(constImage(),noiseType_,1.0,&exceptionInfo);
1754 replaceImage(newImage);
1758 void Magick::Image::addNoiseChannel(const ChannelType channel_,
1759 const NoiseType noiseType_)
1765 SetPPChannelMask(channel_);
1766 newImage=AddNoiseImage(constImage(),noiseType_,1.0,&exceptionInfo);
1767 RestorePPChannelMask;
1768 replaceImage(newImage);
1772 void Magick::Image::affineTransform(const DrawableAffine &affine_)
1780 _affine.sx=affine_.sx();
1781 _affine.sy=affine_.sy();
1782 _affine.rx=affine_.rx();
1783 _affine.ry=affine_.ry();
1784 _affine.tx=affine_.tx();
1785 _affine.ty=affine_.ty();
1788 newImage=AffineTransformImage(constImage(),&_affine,&exceptionInfo);
1789 replaceImage(newImage);
1793 void Magick::Image::alpha(const unsigned int alpha_)
1797 SetImageAlpha(image(),alpha_,&exceptionInfo);
1801 void Magick::Image::alphaChannel(AlphaChannelOption alphaOption_)
1805 SetImageAlphaChannel(image(),alphaOption_,&exceptionInfo);
1809 void Magick::Image::alphaFloodfill(const Color &target_,
1810 const unsigned int alpha_,const ssize_t x_,const ssize_t y_,
1811 const Magick::PaintMethod method_)
1817 GetPixelInfo(constImage(),&target);
1818 target.red=static_cast<PixelInfo>(target_).red;
1819 target.green=static_cast<PixelInfo>(target_).green;
1820 target.blue=static_cast<PixelInfo>(target_).blue;
1821 target.alpha=alpha_;
1823 SetPPChannelMask(AlphaChannel);
1824 FloodfillPaintImage(image(),options()->drawInfo(),&target,x_,y_,
1825 method_ == FloodfillMethod ? MagickFalse : MagickTrue,&exceptionInfo);
1826 RestorePPChannelMask;
1830 void Magick::Image::annotate(const std::string &text_,
1831 const Geometry &location_)
1833 annotate(text_,location_,NorthWestGravity,0.0);
1836 void Magick::Image::annotate(const std::string &text_,
1837 const Geometry &boundingArea_,const GravityType gravity_)
1839 annotate(text_,boundingArea_,gravity_,0.0);
1842 void Magick::Image::annotate(const std::string &text_,
1843 const Geometry &boundingArea_,const GravityType gravity_,
1844 const double degrees_)
1850 boundingArea[MaxTextExtent];
1857 drawInfo=options()->drawInfo();
1858 drawInfo->text=const_cast<char *>(text_.c_str());
1859 drawInfo->geometry=0;
1861 if (boundingArea_.isValid())
1863 if (boundingArea_.width() == 0 || boundingArea_.height() == 0)
1865 FormatLocaleString(boundingArea,MaxTextExtent,"%+.20g%+.20g",
1866 (double) boundingArea_.xOff(),(double) boundingArea_.yOff());
1870 (void) CopyMagickString(boundingArea,string(boundingArea_).c_str(),
1873 drawInfo->geometry=boundingArea;
1876 drawInfo->gravity=gravity_;
1878 oaffine=drawInfo->affine;
1879 if (degrees_ != 0.0)
1892 current=drawInfo->affine;
1893 affine.sx=cos(DegreesToRadians(fmod(degrees_,360.0)));
1894 affine.rx=sin(DegreesToRadians(fmod(degrees_,360.0)));
1895 affine.ry=(-sin(DegreesToRadians(fmod(degrees_,360.0))));
1896 affine.sy=cos(DegreesToRadians(fmod(degrees_,360.0)));
1898 drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
1899 drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
1900 drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
1901 drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
1902 drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty
1907 AnnotateImage(image(),drawInfo,&exceptionInfo);
1909 // Restore original values
1910 drawInfo->affine=oaffine;
1912 drawInfo->geometry=0;
1917 void Magick::Image::annotate(const std::string &text_,
1918 const GravityType gravity_)
1925 drawInfo=options()->drawInfo();
1926 drawInfo->text=const_cast<char *>(text_.c_str());
1927 drawInfo->gravity=gravity_;
1930 AnnotateImage(image(),drawInfo,&exceptionInfo);
1932 drawInfo->gravity=NorthWestGravity;
1938 void Magick::Image::artifact(const std::string &name_,const std::string &value_)
1941 (void) SetImageArtifact(image(),name_.c_str(),value_.c_str());
1944 std::string Magick::Image::artifact(const std::string &name_)
1949 value=GetImageArtifact(constImage(),name_.c_str());
1951 return(std::string(value));
1952 return(std::string());
1955 void Magick::Image::attribute(const std::string name_,const std::string value_)
1959 SetImageProperty(image(),name_.c_str(),value_.c_str(),&exceptionInfo);
1963 std::string Magick::Image::attribute(const std::string name_)
1969 value=GetImageProperty(constImage(),name_.c_str(),&exceptionInfo);
1973 return(std::string(value));
1975 return(std::string()); // Intentionally no exception
1978 void Magick::Image::autoGamma(void)
1982 (void) SyncImageSettings(imageInfo(),image(),&exceptionInfo);
1983 (void) AutoGammaImage(image(),&exceptionInfo);
1987 void Magick::Image::autoGammaChannel(const ChannelType channel_)
1991 SetPPChannelMask(channel_);
1992 (void) SyncImageSettings(imageInfo(),image(),&exceptionInfo);
1993 (void) AutoGammaImage(image(),&exceptionInfo);
1994 RestorePPChannelMask;
1998 void Magick::Image::autoLevel(void)
2002 (void) SyncImageSettings(imageInfo(),image(),&exceptionInfo);
2003 (void) AutoLevelImage(image(),&exceptionInfo);
2007 void Magick::Image::autoLevelChannel(const ChannelType channel_)
2011 SetPPChannelMask(channel_);
2012 (void) SyncImageSettings(imageInfo(),image(),&exceptionInfo);
2013 (void) AutoLevelImage(image(),&exceptionInfo);
2014 RestorePPChannelMask;
2018 void Magick::Image::autoOrient(void)
2023 if (image()->orientation == UndefinedOrientation ||
2024 image()->orientation == TopLeftOrientation)
2028 (void) SyncImageSettings(imageInfo(),image(),&exceptionInfo);
2029 newImage=AutoOrientImage(constImage(),image()->orientation,&exceptionInfo);
2030 replaceImage(newImage);
2034 void Magick::Image::blackThreshold(const std::string &threshold_)
2038 BlackThresholdImage(image(),threshold_.c_str(),&exceptionInfo);
2042 void Magick::Image::blackThresholdChannel(const ChannelType channel_,
2043 const std::string &threshold_)
2047 SetPPChannelMask(channel_);
2048 BlackThresholdImage(image(),threshold_.c_str(),&exceptionInfo);
2049 RestorePPChannelMask;
2053 void Magick::Image::blueShift(const double factor_)
2059 newImage=BlueShiftImage(constImage(),factor_,&exceptionInfo);
2060 replaceImage(newImage);
2064 void Magick::Image::blur(const double radius_,const double sigma_)
2070 newImage=BlurImage(constImage(),radius_,sigma_,&exceptionInfo);
2071 replaceImage(newImage);
2075 void Magick::Image::blurChannel(const ChannelType channel_,
2076 const double radius_,const double sigma_)
2082 SetPPChannelMask(channel_);
2083 newImage=BlurImage(constImage(),radius_,sigma_,&exceptionInfo);
2084 RestorePPChannelMask;
2085 replaceImage(newImage);
2089 void Magick::Image::border(const Geometry &geometry_)
2095 borderInfo=geometry_;
2098 newImage=BorderImage(constImage(),&borderInfo,image()->compose,
2100 replaceImage(newImage);
2104 void Magick::Image::brightnessContrast(const double brightness_,
2105 const double contrast_)
2109 BrightnessContrastImage(image(),brightness_,contrast_,&exceptionInfo);
2113 void Magick::Image::brightnessContrastChannel(const ChannelType channel_,
2114 const double brightness_,const double contrast_)
2118 SetPPChannelMask(channel_);
2119 BrightnessContrastImage(image(),brightness_,contrast_,&exceptionInfo);
2120 RestorePPChannelMask;
2124 void Magick::Image::cannyEdge(const double radius_,const double sigma_,
2125 const double lowerPercent_,const double upperPercent_)
2132 newImage=CannyEdgeImage(constImage(),radius_,sigma_,lowerPercent_,
2133 upperPercent_,&exceptionInfo);
2134 replaceImage(newImage);
2138 void Magick::Image::channel(const ChannelType channel_)
2144 newImage=SeparateImage(image(),channel_,&exceptionInfo);
2145 replaceImage(newImage);
2149 void Magick::Image::charcoal(const double radius_,const double sigma_)
2155 newImage=CharcoalImage(image(),radius_,sigma_,&exceptionInfo);
2156 replaceImage(newImage);
2160 void Magick::Image::chop(const Geometry &geometry_)
2169 newImage=ChopImage(image(),&chopInfo,&exceptionInfo);
2170 replaceImage(newImage);
2174 void Magick::Image::chromaBluePrimary(const double x_,const double y_)
2177 image()->chromaticity.blue_primary.x=x_;
2178 image()->chromaticity.blue_primary.y=y_;
2181 void Magick::Image::chromaBluePrimary(double *x_,double *y_) const
2183 *x_=constImage()->chromaticity.blue_primary.x;
2184 *y_=constImage()->chromaticity.blue_primary.y;
2187 void Magick::Image::chromaGreenPrimary(const double x_,const double y_)
2190 image()->chromaticity.green_primary.x=x_;
2191 image()->chromaticity.green_primary.y=y_;
2194 void Magick::Image::chromaGreenPrimary(double *x_,double *y_) const
2196 *x_=constImage()->chromaticity.green_primary.x;
2197 *y_=constImage()->chromaticity.green_primary.y;
2200 void Magick::Image::chromaRedPrimary(const double x_,const double y_)
2203 image()->chromaticity.red_primary.x=x_;
2204 image()->chromaticity.red_primary.y=y_;
2207 void Magick::Image::chromaRedPrimary(double *x_,double *y_) const
2209 *x_=constImage()->chromaticity.red_primary.x;
2210 *y_=constImage()->chromaticity.red_primary.y;
2213 void Magick::Image::chromaWhitePoint(const double x_,const double y_)
2216 image()->chromaticity.white_point.x=x_;
2217 image()->chromaticity.white_point.y=y_;
2220 void Magick::Image::chromaWhitePoint(double *x_,double *y_) const
2222 *x_=constImage()->chromaticity.white_point.x;
2223 *y_=constImage()->chromaticity.white_point.y;
2226 void Magick::Image::cdl(const std::string &cdl_)
2230 (void) ColorDecisionListImage(image(),cdl_.c_str(),&exceptionInfo);
2234 void Magick::Image::clamp(void)
2238 ClampImage(image(),&exceptionInfo);
2242 void Magick::Image::clampChannel(const ChannelType channel_)
2246 SetPPChannelMask(channel_);
2247 ClampImage(image(),&exceptionInfo);
2248 RestorePPChannelMask;
2252 void Magick::Image::clip(void)
2256 ClipImage(image(),&exceptionInfo);
2260 void Magick::Image::clipPath(const std::string pathname_,const bool inside_)
2264 ClipImagePath(image(),pathname_.c_str(),(MagickBooleanType) inside_,
2269 void Magick::Image::clut(const Image &clutImage_,
2270 const PixelInterpolateMethod method)
2274 ClutImage(image(),clutImage_.constImage(),method,&exceptionInfo);
2278 void Magick::Image::clutChannel(const ChannelType channel_,
2279 const Image &clutImage_,const PixelInterpolateMethod method)
2283 SetPPChannelMask(channel_);
2284 ClutImage(image(),clutImage_.constImage(),method,&exceptionInfo);
2285 RestorePPChannelMask;
2289 void Magick::Image::colorize(const unsigned int alpha_,const Color &penColor_)
2291 colorize(alpha_,alpha_,alpha_,penColor_);
2294 void Magick::Image::colorize(const unsigned int alphaRed_,
2295 const unsigned int alphaGreen_,const unsigned int alphaBlue_,
2296 const Color &penColor_)
2299 blend[MaxTextExtent];
2308 if (!penColor_.isValid())
2309 throwExceptionExplicit(OptionError,"Pen color argument is invalid");
2311 FormatLocaleString(blend,MaxTextExtent,"%u/%u/%u",alphaRed_,alphaGreen_,
2314 GetPixelInfo(image(),&target);
2315 pixel=static_cast<PixelInfo>(penColor_);
2316 target.red=pixel.red;
2317 target.green=pixel.green;
2318 target.blue=pixel.blue;
2319 target.alpha=pixel.alpha;
2321 newImage=ColorizeImage(image(),blend,&target,&exceptionInfo);
2322 replaceImage(newImage);
2326 void Magick::Image::colorMap(const size_t index_,const Color &color_)
2333 if (index_ > (MaxColormapSize-1))
2334 throwExceptionExplicit(OptionError,
2335 "Colormap index must be less than MaxColormapSize");
2337 if (!color_.isValid())
2338 throwExceptionExplicit(OptionError,"Color argument is invalid");
2342 // Ensure that colormap size is large enough
2343 if (colorMapSize() < (index_+1))
2344 colorMapSize(index_+1);
2346 // Set color at index in colormap
2347 (imageptr->colormap)[index_]=color_;
2350 Magick::Color Magick::Image::colorMap(const size_t index_) const
2352 if (!constImage()->colormap)
2354 throwExceptionExplicit(OptionError,"Image does not contain a colormap");
2358 if (index_ > constImage()->colors-1)
2359 throwExceptionExplicit(OptionError,"Index out of range");
2361 return(Magick::Color((constImage()->colormap)[index_]));
2364 void Magick::Image::colorMatrix(const size_t order_,
2365 const double *color_matrix_)
2371 kernel_info=AcquireKernelInfo((const char *) NULL);
2372 if (kernel_info != (KernelInfo *) NULL)
2374 kernel_info->width=order_;
2375 kernel_info->height=order_;
2376 kernel_info->values=(MagickRealType *) AcquireAlignedMemory(order_,
2377 order_*sizeof(*kernel_info->values));
2378 if (kernel_info->values != (MagickRealType *) NULL)
2383 for (ssize_t i=0; i < (ssize_t) (order_*order_); i++)
2384 kernel_info->values[i]=color_matrix_[i];
2385 newImage=ColorMatrixImage(image(),kernel_info,&exceptionInfo);
2386 replaceImage(newImage);
2388 kernel_info=DestroyKernelInfo(kernel_info);
2393 bool Magick::Image::compare(const Image &reference_)
2404 status=static_cast<bool>(IsImagesEqual(image(),ref.image(),&exceptionInfo));
2409 double Magick::Image::compare(const Image &reference_,const MetricType metric_)
2415 GetImageDistortion(image(),reference_.constImage(),metric_,&distortion,
2421 double Magick::Image::compareChannel(const ChannelType channel_,
2422 const Image &reference_,const MetricType metric_)
2428 SetPPChannelMask(channel_);
2429 GetImageDistortion(image(),reference_.constImage(),metric_,&distortion,
2431 RestorePPChannelMask;
2436 Magick::Image Magick::Image::compare(const Image &reference_,
2437 const MetricType metric_,double *distortion)
2443 newImage=CompareImages(image(),reference_.constImage(),metric_,distortion,
2446 if (newImage == (MagickCore::Image *) NULL)
2447 return(Magick::Image());
2449 return(Magick::Image(newImage));
2452 Magick::Image Magick::Image::compareChannel(const ChannelType channel_,
2453 const Image &reference_,const MetricType metric_,double *distortion)
2459 SetPPChannelMask(channel_);
2460 newImage=CompareImages(image(),reference_.constImage(),metric_,distortion,
2462 RestorePPChannelMask;
2464 if (newImage == (MagickCore::Image *) NULL)
2465 return(Magick::Image());
2467 return(Magick::Image(newImage));
2470 void Magick::Image::composite(const Image &compositeImage_,
2471 const Geometry &offset_,const CompositeOperator compose_)
2481 ParseMetaGeometry(static_cast<std::string>(offset_).c_str(),&x,&y,&width,
2486 CompositeImage(image(),compositeImage_.constImage(),compose_,MagickFalse,
2487 x,y,&exceptionInfo);
2491 void Magick::Image::composite(const Image &compositeImage_,
2492 const GravityType gravity_,const CompositeOperator compose_)
2498 SetGeometry(compositeImage_.constImage(),&geometry);
2499 GravityAdjustGeometry(columns(),rows(),gravity_,&geometry);
2502 CompositeImage(image(),compositeImage_.constImage(),compose_,MagickFalse,
2503 geometry.x,geometry.y,&exceptionInfo);
2507 void Magick::Image::composite(const Image &compositeImage_,
2508 const ssize_t xOffset_,const ssize_t yOffset_,
2509 const CompositeOperator compose_)
2511 // Image supplied as compositeImage is composited with current image and
2512 // results in updating current image.
2515 CompositeImage(image(),compositeImage_.constImage(),compose_,MagickFalse,
2516 xOffset_,yOffset_,&exceptionInfo);
2520 void Magick::Image::contrast(const size_t sharpen_)
2524 ContrastImage(image(),(MagickBooleanType) sharpen_,&exceptionInfo);
2528 void Magick::Image::contrastStretch(const double blackPoint_,
2529 const double whitePoint_)
2533 ContrastStretchImage(image(),blackPoint_,whitePoint_,&exceptionInfo);
2537 void Magick::Image::contrastStretchChannel(const ChannelType channel_,
2538 const double blackPoint_,const double whitePoint_)
2542 SetPPChannelMask(channel_);
2543 ContrastStretchImage(image(),blackPoint_,whitePoint_,&exceptionInfo);
2544 RestorePPChannelMask;
2548 void Magick::Image::convolve(const size_t order_,const double *kernel_)
2554 kernel_info=AcquireKernelInfo((const char *) NULL);
2555 kernel_info->width=order_;
2556 kernel_info->height=order_;
2557 kernel_info->values=(MagickRealType *) AcquireAlignedMemory(order_,
2558 order_*sizeof(*kernel_info->values));
2559 if (kernel_info->values != (MagickRealType *) NULL)
2564 for (ssize_t i=0; i < (ssize_t) (order_*order_); i++)
2565 kernel_info->values[i]=kernel_[i];
2566 newImage=ConvolveImage(image(),kernel_info,&exceptionInfo);
2567 replaceImage(newImage);
2569 kernel_info=DestroyKernelInfo(kernel_info);
2573 void Magick::Image::crop(const Geometry &geometry_)
2582 newImage=CropImage(constImage(),&cropInfo,&exceptionInfo);
2583 replaceImage(newImage);
2587 void Magick::Image::cycleColormap(const ssize_t amount_)
2591 CycleColormapImage(image(),amount_,&exceptionInfo);
2595 void Magick::Image::decipher(const std::string &passphrase_)
2599 DecipherImage(image(),passphrase_.c_str(),&exceptionInfo);
2603 void Magick::Image::defineSet(const std::string &magick_,
2604 const std::string &key_,bool flag_)
2610 definition=magick_ + ":" + key_;
2612 (void) SetImageOption(imageInfo(),definition.c_str(),"");
2614 DeleteImageOption(imageInfo(),definition.c_str());
2617 bool Magick::Image::defineSet(const std::string &magick_,
2618 const std::string &key_ ) const
2626 key=magick_ + ":" + key_;
2627 option=GetImageOption(constImageInfo(),key.c_str());
2633 void Magick::Image::defineValue(const std::string &magick_,
2634 const std::string &key_,const std::string &value_)
2641 format=magick_ + ":" + key_;
2643 (void) SetImageOption(imageInfo(),format.c_str(),option.c_str());
2646 std::string Magick::Image::defineValue(const std::string &magick_,
2647 const std::string &key_) const
2655 definition=magick_ + ":" + key_;
2656 option=GetImageOption(constImageInfo(),definition.c_str());
2658 return(std::string(option));
2659 return(std::string());
2662 void Magick::Image::deskew(const double threshold_)
2668 newImage=DeskewImage(constImage(),threshold_,&exceptionInfo);
2669 replaceImage(newImage);
2673 void Magick::Image::despeckle(void)
2679 newImage=DespeckleImage(constImage(),&exceptionInfo);
2680 replaceImage(newImage);
2684 Magick::ImageType Magick::Image::determineType(void) const
2690 image_type=GetImageType(constImage(),&exceptionInfo);
2695 void Magick::Image::display(void)
2698 DisplayImages(imageInfo(),image(),&exceptionInfo);
2702 void Magick::Image::distort(const DistortImageMethod method_,
2703 const size_t numberArguments_,const double *arguments_,const bool bestfit_)
2709 newImage=DistortImage(constImage(), method_,numberArguments_,arguments_,
2710 bestfit_ == true ? MagickTrue : MagickFalse,&exceptionInfo);
2711 replaceImage(newImage);
2715 void Magick::Image::draw(const Magick::Drawable &drawable_)
2722 wand=DrawAllocateWand(options()->drawInfo(),image());
2726 drawable_.operator()(wand);
2730 ClonePPDrawException(wand);
2731 wand=DestroyDrawingWand(wand);
2732 ThrowPPDrawException;
2736 void Magick::Image::draw(const std::list<Magick::Drawable> &drawable_)
2743 wand=DrawAllocateWand(options()->drawInfo(),image());
2747 for (std::list<Magick::Drawable>::const_iterator p = drawable_.begin();
2748 p != drawable_.end(); p++ )
2750 p->operator()(wand);
2751 if (DrawGetExceptionType(wand) != UndefinedException)
2755 if (DrawGetExceptionType(wand) == UndefinedException)
2758 ClonePPDrawException(wand);
2759 wand=DestroyDrawingWand(wand);
2760 ThrowPPDrawException;
2764 void Magick::Image::edge(const double radius_)
2770 newImage=EdgeImage(constImage(),radius_,&exceptionInfo);
2771 replaceImage(newImage);
2775 void Magick::Image::emboss(const double radius_,const double sigma_)
2781 newImage=EmbossImage(constImage(),radius_,sigma_,&exceptionInfo);
2782 replaceImage(newImage);
2786 void Magick::Image::encipher(const std::string &passphrase_)
2790 EncipherImage(image(),passphrase_.c_str(),&exceptionInfo);
2794 void Magick::Image::enhance(void)
2800 newImage=EnhanceImage(constImage(),&exceptionInfo);
2801 replaceImage(newImage);
2805 void Magick::Image::equalize(void)
2809 EqualizeImage(image(),&exceptionInfo);
2813 void Magick::Image::erase(void)
2817 (void) SetImageBackgroundColor(image(),&exceptionInfo);
2821 void *Magick::Image::exportPixels(const ::ssize_t x_,const ::ssize_t y_,
2822 const size_t width_,const size_t height_,std::string map_,
2823 const StorageType type_)
2831 result=(void *) NULL;
2832 if ((x_ < 0) || (width_ < 0) || (y_ < 0) || (height_ < 0) ||
2833 (x_ > image()->columns) || (width_ + x_ > image()->columns) ||
2834 (y_ > image()->rows) || (height_ + y_ > image()->rows) ||
2835 (map_.length() == 0))
2841 size=sizeof(unsigned char);
2844 size=sizeof(double);
2850 size=sizeof(unsigned int);
2853 size=sizeof(MagickSizeType);
2856 size=sizeof(Quantum);
2859 size=sizeof(unsigned short);
2862 throwExceptionExplicit(OptionError,"Invalid type");
2866 result=AcquireMagickMemory(width_*height_*map_.length()*size);
2869 MagickCore::ExportImagePixels(image(),x_,y_,width_,height_,map_.c_str(),
2870 type_,result,&exceptionInfo);
2871 if (exceptionInfo.severity != UndefinedException)
2872 result=RelinquishMagickMemory(result);
2877 void Magick::Image::extent(const Geometry &geometry_ )
2883 extentInfo=geometry_;
2886 extentInfo.x=geometry_.xOff();
2887 extentInfo.y=geometry_.yOff();
2889 newImage=ExtentImage(image(),&extentInfo,&exceptionInfo);
2890 replaceImage(newImage);
2894 void Magick::Image::extent(const Geometry &geometry_,
2895 const Color &backgroundColor_)
2897 backgroundColor(backgroundColor_);
2901 void Magick::Image::extent(const Geometry &geometry_,
2902 const Color &backgroundColor_,const GravityType gravity_)
2904 backgroundColor(backgroundColor_);
2905 extent(geometry_,gravity_);
2908 void Magick::Image::extent(const Geometry &geometry_,
2909 const GravityType gravity_)
2914 SetGeometry(image(),&geometry);
2915 geometry.width=geometry_.width();
2916 geometry.height=geometry_.height();
2917 GravityAdjustGeometry(image()->columns,image()->rows,gravity_,&geometry);
2921 void Magick::Image::flip(void)
2927 newImage=FlipImage(constImage(),&exceptionInfo);
2928 replaceImage(newImage);
2932 void Magick::Image::floodFillAlpha(const ssize_t x_,const ssize_t y_,
2933 const unsigned int alpha_,const PaintMethod method_)
2940 GetPixelInfo(image(),&target);
2941 pixel=static_cast<PixelInfo>(pixelColor(x_,y_));
2942 target.red=pixel.red;
2943 target.green=pixel.green;
2944 target.blue=pixel.blue;
2945 target.alpha=alpha_;
2948 FloodfillPaintImage(image(),options()->drawInfo(),&target,
2949 static_cast<ssize_t>(x_), static_cast<ssize_t>(y_),
2950 method_ == FloodfillMethod ? MagickFalse : MagickTrue,&exceptionInfo);
2954 void Magick::Image::floodFillColor(const Geometry &point_,
2955 const Magick::Color &fillColor_)
2957 floodFillTexture(point_,Image(Geometry(1,1),fillColor_));
2960 void Magick::Image::floodFillColor(const ssize_t x_,const ssize_t y_,
2961 const Magick::Color &fillColor_)
2963 floodFillTexture(x_,y_,Image(Geometry(1,1),fillColor_));
2966 void Magick::Image::floodFillColor(const Geometry &point_,
2967 const Magick::Color &fillColor_,const Magick::Color &borderColor_)
2969 floodFillTexture(point_,Image(Geometry(1,1),fillColor_),borderColor_);
2972 void Magick::Image::floodFillColor(const ssize_t x_,const ssize_t y_,
2973 const Magick::Color &fillColor_,const Magick::Color &borderColor_)
2975 floodFillTexture(x_,y_,Image(Geometry(1,1),fillColor_),borderColor_);
2978 void Magick::Image::floodFillTexture(const Magick::Geometry &point_,
2979 const Magick::Image &texture_)
2981 floodFillTexture(point_.xOff(),point_.yOff(),texture_);
2984 void Magick::Image::floodFillTexture(const ssize_t x_,const ssize_t y_,
2985 const Magick::Image &texture_)
2995 // Set drawing fill pattern
2996 fillPattern=(MagickCore::Image *)NULL;
2997 if (options()->fillPattern() != (MagickCore::Image *)NULL)
3000 fillPattern=CloneImage(options()->fillPattern(),0,0,MagickTrue,
3004 options()->fillPattern(texture_.constImage());
3007 Pixels pixels(*this);
3009 p=pixels.get(x_,y_,1,1);
3016 GetPixelInfo(constImage(),&target);
3017 target.red=GetPixelRed(constImage(),p);
3018 target.green=GetPixelGreen(constImage(),p);
3019 target.blue=GetPixelBlue(constImage(),p);
3021 FloodfillPaintImage(image(),options()->drawInfo(),&target,
3022 static_cast<ssize_t>(x_),static_cast<ssize_t>(y_),MagickFalse,
3024 options()->fillPattern(fillPattern);
3028 options()->fillPattern(fillPattern);
3031 void Magick::Image::floodFillTexture(const Magick::Geometry &point_,
3032 const Magick::Image &texture_,const Magick::Color &borderColor_)
3034 floodFillTexture(point_.xOff(),point_.yOff(),texture_,borderColor_);
3037 void Magick::Image::floodFillTexture(const ssize_t x_,const ssize_t y_,
3038 const Magick::Image &texture_,const Magick::Color &borderColor_)
3048 // Set drawing fill pattern
3049 fillPattern=(MagickCore::Image *)NULL;
3050 if (options()->fillPattern() != (MagickCore::Image *)NULL)
3053 fillPattern=CloneImage(options()->fillPattern(),0,0,MagickTrue,
3057 options()->fillPattern(texture_.constImage());
3059 GetPixelInfo(constImage(),&target);
3060 target.red=static_cast<PixelInfo>(borderColor_).red;
3061 target.green=static_cast<PixelInfo>(borderColor_).green;
3062 target.blue=static_cast<PixelInfo>(borderColor_).blue;
3064 FloodfillPaintImage(image(),options()->drawInfo(),&target,
3065 static_cast<ssize_t>(x_),static_cast<ssize_t>(y_),MagickTrue,
3067 options()->fillPattern(fillPattern);
3071 void Magick::Image::flop(void)
3077 newImage=FlopImage(constImage(),&exceptionInfo);
3078 replaceImage(newImage);
3082 void Magick::Image::fontTypeMetrics(const std::string &text_,
3083 TypeMetric *metrics)
3088 drawInfo=options()->drawInfo();
3089 drawInfo->text=const_cast<char *>(text_.c_str());
3091 GetTypeMetrics(image(),drawInfo,&(metrics->_typeMetric),&exceptionInfo);
3096 void Magick::Image::fontTypeMetricsMultiline(const std::string &text_,
3097 TypeMetric *metrics)
3102 drawInfo=options()->drawInfo();
3103 drawInfo->text=const_cast<char *>(text_.c_str());
3105 GetMultilineTypeMetrics(image(),drawInfo,&(metrics->_typeMetric),&exceptionInfo);
3110 void Magick::Image::frame(const Geometry &geometry_)
3118 info.x=static_cast<ssize_t>(geometry_.width());
3119 info.y=static_cast<ssize_t>(geometry_.height());
3120 info.width=columns() + (static_cast<size_t>(info.x) << 1);
3121 info.height=rows() + (static_cast<size_t>(info.y) << 1);
3122 info.outer_bevel=geometry_.xOff();
3123 info.inner_bevel=geometry_.yOff();
3126 newImage=FrameImage(constImage(),&info,image()->compose,&exceptionInfo);
3127 replaceImage(newImage);
3131 void Magick::Image::frame(const size_t width_,const size_t height_,
3132 const ssize_t outerBevel_,const ssize_t innerBevel_)
3140 info.x=static_cast<ssize_t>(width_);
3141 info.y=static_cast<ssize_t>(height_);
3142 info.width=columns() + (static_cast<size_t>(info.x) << 1);
3143 info.height=rows() + (static_cast<size_t>(info.y) << 1);
3144 info.outer_bevel=static_cast<ssize_t>(outerBevel_);
3145 info.inner_bevel=static_cast<ssize_t>(innerBevel_);
3148 newImage=FrameImage(constImage(),&info,image()->compose,&exceptionInfo);
3149 replaceImage(newImage);
3153 void Magick::Image::fx(const std::string expression_)
3159 newImage=FxImage(constImage(),expression_.c_str(),&exceptionInfo);
3160 replaceImage(newImage);
3164 void Magick::Image::fx(const std::string expression_,
3165 const Magick::ChannelType channel_)
3171 SetPPChannelMask(channel_);
3172 newImage=FxImage(constImage(),expression_.c_str(),&exceptionInfo);
3173 RestorePPChannelMask;
3174 replaceImage(newImage);
3178 void Magick::Image::gamma(const double gamma_)
3182 GammaImage(image(),gamma_,&exceptionInfo);
3186 void Magick::Image::gamma(const double gammaRed_,const double gammaGreen_,
3187 const double gammaBlue_)
3190 gamma[MaxTextExtent + 1];
3192 FormatLocaleString(gamma,MaxTextExtent,"%3.6f/%3.6f/%3.6f/",gammaRed_,
3193 gammaGreen_,gammaBlue_);
3197 GammaImage(image(),atof(gamma),&exceptionInfo);
3201 void Magick::Image::gaussianBlur(const double width_,const double sigma_)
3207 newImage=GaussianBlurImage(constImage(),width_,sigma_,&exceptionInfo);
3208 replaceImage(newImage);
3212 void Magick::Image::gaussianBlurChannel(const ChannelType channel_,
3213 const double width_,const double sigma_)
3219 SetPPChannelMask(channel_);
3220 newImage=GaussianBlurImage(constImage(),width_,sigma_,&exceptionInfo);
3221 RestorePPChannelMask;
3222 replaceImage(newImage);
3226 const Magick::Quantum *Magick::Image::getConstPixels(const ssize_t x_,
3227 const ssize_t y_,const size_t columns_,const size_t rows_) const
3233 p=(*GetVirtualPixels)(constImage(),x_, y_,columns_, rows_,&exceptionInfo);
3238 const void *Magick::Image::getConstMetacontent(void) const
3243 result=GetVirtualMetacontent(constImage());
3246 throwExceptionExplicit(OptionError,"Unable to retrieve meta content.");
3251 void *Magick::Image::getMetacontent(void )
3256 result=GetAuthenticMetacontent(image());
3259 throwExceptionExplicit(OptionError,"Unable to retrieve meta content.");
3264 Magick::Quantum *Magick::Image::getPixels(const ssize_t x_,const ssize_t y_,
3265 const size_t columns_,const size_t rows_)
3272 result=(*GetAuthenticPixels)(image(),x_, y_,columns_,rows_,&exceptionInfo);
3278 void Magick::Image::haldClut(const Image &clutImage_)
3282 (void) HaldClutImage(image(),clutImage_.constImage(),&exceptionInfo);
3286 void Magick::Image::houghLine(const size_t width_,const size_t height_,
3287 const size_t threshold_)
3293 newImage=HoughLineImage(constImage(),width_,height_,threshold_,
3295 replaceImage(newImage);
3299 void Magick::Image::implode(const double factor_)
3305 newImage=ImplodeImage(constImage(),factor_,image()->interpolate,
3307 replaceImage(newImage);
3311 void Magick::Image::inverseFourierTransform(const Image &phase_)
3313 inverseFourierTransform(phase_,true);
3316 void Magick::Image::inverseFourierTransform(const Image &phase_,
3317 const bool magnitude_)
3323 newImage=InverseFourierTransformImage(constImage(),phase_.constImage(),
3324 magnitude_ == true ? MagickTrue : MagickFalse,&exceptionInfo);
3325 replaceImage(newImage);
3329 void Magick::Image::level(const double blackPoint_,const double whitePoint_,
3330 const double gamma_)
3334 (void) LevelImage(image(),blackPoint_,whitePoint_,gamma_,&exceptionInfo);
3338 void Magick::Image::levelChannel(const ChannelType channel_,
3339 const double blackPoint_,const double whitePoint_,const double gamma_)
3343 SetPPChannelMask(channel_);
3344 (void) LevelImage(image(),blackPoint_,whitePoint_,gamma_,&exceptionInfo);
3345 RestorePPChannelMask;
3349 void Magick::Image::levelColors(const Color &blackColor_,
3350 const Color &whiteColor_,const bool invert_)
3359 GetPixelInfo(image(),&black);
3360 pixel=static_cast<PixelInfo>(blackColor_);
3361 black.red=pixel.red;
3362 black.green=pixel.green;
3363 black.blue=pixel.blue;
3364 black.alpha=pixel.alpha;
3366 GetPixelInfo(image(),&white);
3367 pixel=static_cast<PixelInfo>(whiteColor_);
3368 white.red=pixel.red;
3369 white.green=pixel.green;
3370 white.blue=pixel.blue;
3371 white.alpha=pixel.alpha;
3374 (void) LevelImageColors(image(),&black,&white,invert_ == true ?
3375 MagickTrue : MagickFalse,&exceptionInfo);
3379 void Magick::Image::levelColorsChannel(const ChannelType channel_,
3380 const Color &blackColor_,const Color &whiteColor_,const bool invert_)
3389 GetPixelInfo(image(),&black);
3390 pixel=static_cast<PixelInfo>(blackColor_);
3391 black.red=pixel.red;
3392 black.green=pixel.green;
3393 black.blue=pixel.blue;
3394 black.alpha=pixel.alpha;
3396 GetPixelInfo(image(),&white);
3397 pixel=static_cast<PixelInfo>(whiteColor_);
3398 white.red=pixel.red;
3399 white.green=pixel.green;
3400 white.blue=pixel.blue;
3401 white.alpha=pixel.alpha;
3404 SetPPChannelMask(channel_);
3405 (void) LevelImageColors(image(),&black,&white,invert_ == true ?
3406 MagickTrue : MagickFalse,&exceptionInfo);
3407 RestorePPChannelMask;
3411 void Magick::Image::linearStretch(const double blackPoint_,
3412 const double whitePoint_)
3416 LinearStretchImage(image(),blackPoint_,whitePoint_,&exceptionInfo);
3420 void Magick::Image::liquidRescale(const Geometry &geometry_)
3433 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
3437 newImage=LiquidRescaleImage(image(),width,height,x,y,&exceptionInfo);
3438 replaceImage(newImage);
3442 void Magick::Image::magnify(void)
3448 newImage=MagnifyImage(constImage(),&exceptionInfo);
3449 replaceImage(newImage);
3453 void Magick::Image::map(const Image &mapImage_,const bool dither_)
3457 options()->quantizeDither(dither_);
3458 RemapImage(options()->quantizeInfo(),image(),mapImage_.constImage(),
3463 void Magick::Image::medianFilter(const double radius_)
3469 newImage=StatisticImage(image(),MedianStatistic,(size_t) radius_,
3470 (size_t) radius_,&exceptionInfo);
3471 replaceImage(newImage);
3475 void Magick::Image::minify(void)
3481 newImage=MinifyImage(constImage(),&exceptionInfo);
3482 replaceImage(newImage);
3486 void Magick::Image::modulate(const double brightness_,const double saturation_,
3490 modulate[MaxTextExtent + 1];
3492 FormatLocaleString(modulate,MaxTextExtent,"%3.6f,%3.6f,%3.6f",brightness_,
3497 ModulateImage(image(),modulate,&exceptionInfo);
3501 Magick::ImageMoments Magick::Image::moments(void)
3503 return(ImageMoments(constImage()));
3506 void Magick::Image::morphology(const MorphologyMethod method_,
3507 const std::string kernel_,const ssize_t iterations_)
3515 kernel=AcquireKernelInfo(kernel_.c_str());
3516 if (kernel == (KernelInfo *)NULL)
3517 throwExceptionExplicit(OptionError,"Unable to parse kernel.");
3520 newImage=MorphologyImage(constImage(),method_,iterations_,kernel,
3522 replaceImage(newImage);
3523 kernel=DestroyKernelInfo(kernel);
3527 void Magick::Image::morphology(const MorphologyMethod method_,
3528 const KernelInfoType kernel_,const std::string arguments_,
3529 const ssize_t iterations_)
3537 option=CommandOptionToMnemonic(MagickKernelOptions,kernel_);
3538 if (option == (const char *)NULL)
3539 throwExceptionExplicit(OptionError,"Unable to determine kernel type.");
3541 kernel=std::string(option);
3542 if (!arguments_.empty())
3543 kernel+=":"+arguments_;
3545 morphology(method_,kernel,iterations_);
3548 void Magick::Image::morphologyChannel(const ChannelType channel_,
3549 const MorphologyMethod method_,const std::string kernel_,
3550 const ssize_t iterations_)
3558 kernel=AcquireKernelInfo(kernel_.c_str());
3559 if (kernel == (KernelInfo *)NULL)
3560 throwExceptionExplicit(OptionError,"Unable to parse kernel.");
3563 SetPPChannelMask(channel_);
3564 newImage=MorphologyImage(constImage(),method_,iterations_,kernel,
3566 RestorePPChannelMask;
3567 replaceImage(newImage);
3568 kernel=DestroyKernelInfo(kernel);
3572 void Magick::Image::morphologyChannel(const ChannelType channel_,
3573 const MorphologyMethod method_,const KernelInfoType kernel_,
3574 const std::string arguments_,const ssize_t iterations_)
3582 option=CommandOptionToMnemonic(MagickKernelOptions,kernel_);
3583 if (option == (const char *)NULL)
3584 throwExceptionExplicit(OptionError,"Unable to determine kernel type.");
3586 kernel=std::string(option);
3587 if (!arguments_.empty())
3588 kernel+=":"+arguments_;
3590 morphologyChannel(channel_,method_,kernel,iterations_);
3593 void Magick::Image::motionBlur(const double radius_,const double sigma_,
3594 const double angle_)
3600 newImage=MotionBlurImage(constImage(),radius_,sigma_,angle_,&exceptionInfo);
3601 replaceImage(newImage);
3605 void Magick::Image::negate(const bool grayscale_)
3609 NegateImage(image(),(MagickBooleanType) grayscale_,&exceptionInfo);
3613 void Magick::Image::negateChannel(const ChannelType channel_,
3614 const bool grayscale_)
3618 SetPPChannelMask(channel_);
3619 NegateImage(image(),(MagickBooleanType) grayscale_,&exceptionInfo);
3620 RestorePPChannelMask;
3624 void Magick::Image::normalize(void)
3628 NormalizeImage(image(),&exceptionInfo);
3632 void Magick::Image::oilPaint(const double radius_,const double sigma_)
3638 newImage=OilPaintImage(constImage(),radius_,sigma_,&exceptionInfo);
3639 replaceImage(newImage);
3643 void Magick::Image::opaque(const Color &opaqueColor_,const Color &penColor_)
3653 if (!opaqueColor_.isValid())
3654 throwExceptionExplicit(OptionError,"Opaque color argument is invalid");
3656 if (!penColor_.isValid())
3657 throwExceptionExplicit(OptionError,"Pen color argument is invalid");
3660 opaqueColor=opaqueColor_;
3664 (void) QueryColorCompliance(opaqueColor.c_str(),AllCompliance,&opaque,
3666 (void) QueryColorCompliance(penColor.c_str(),AllCompliance,&pen,
3668 OpaquePaintImage(image(),&opaque,&pen,MagickFalse,&exceptionInfo);
3672 void Magick::Image::orderedDither(std::string thresholdMap_)
3676 (void) OrderedPosterizeImage(image(),thresholdMap_.c_str(),&exceptionInfo);
3680 void Magick::Image::orderedDitherChannel(const ChannelType channel_,
3681 std::string thresholdMap_)
3685 SetPPChannelMask(channel_);
3686 (void) OrderedPosterizeImage(image(),thresholdMap_.c_str(),&exceptionInfo);
3687 RestorePPChannelMask;
3691 void Magick::Image::perceptible(const double epsilon_)
3695 PerceptibleImage(image(),epsilon_,&exceptionInfo);
3699 void Magick::Image::perceptibleChannel(const ChannelType channel_,
3700 const double epsilon_)
3704 SetPPChannelMask(channel_);
3705 PerceptibleImage(image(),epsilon_,&exceptionInfo);
3706 RestorePPChannelMask;
3710 void Magick::Image::ping(const std::string &imageSpec_)
3716 options()->fileName(imageSpec_);
3717 newImage=PingImage(imageInfo(),&exceptionInfo);
3718 replaceImage(newImage);
3722 void Magick::Image::ping(const Blob& blob_)
3728 newImage=PingBlob(imageInfo(),blob_.data(),blob_.length(),&exceptionInfo);
3729 replaceImage(newImage);
3733 void Magick::Image::pixelColor(const ssize_t x_,const ssize_t y_,
3734 const Color &color_)
3742 // Test arguments to ensure they are within the image.
3743 if (y_ > (ssize_t) rows() || x_ > (ssize_t) columns())
3744 throwExceptionExplicit(OptionError,"Access outside of image boundary");
3748 // Set image to DirectClass
3749 classType(DirectClass );
3752 Pixels pixels(*this);
3754 pixel=pixels.get(x_, y_, 1, 1 );
3756 MagickCore::SetPixelInfoPixel(constImage(),&packet,pixel);
3757 // Tell ImageMagick that pixels have been updated
3761 Magick::Color Magick::Image::pixelColor(const ssize_t x_,
3762 const ssize_t y_) const
3767 pixel=getConstPixels(x_,y_,1,1);
3773 MagickCore::GetPixelInfoPixel(constImage(),pixel,&packet);
3774 return(Color(packet));
3777 return(Color()); // invalid
3780 void Magick::Image::polaroid(const std::string &caption_,const double angle_,
3781 const PixelInterpolateMethod method_)
3787 newImage=PolaroidImage(constImage(),options()->drawInfo(),caption_.c_str(),
3788 angle_,method_,&exceptionInfo);
3789 replaceImage(newImage);
3793 void Magick::Image::posterize(const size_t levels_,const DitherMethod method_)
3797 PosterizeImage(image(),levels_,method_,&exceptionInfo);
3801 void Magick::Image::posterizeChannel(const ChannelType channel_,
3802 const size_t levels_,const DitherMethod method_)
3806 SetPPChannelMask(channel_);
3807 PosterizeImage(image(),levels_,method_,&exceptionInfo);
3808 RestorePPChannelMask;
3812 void Magick::Image::process(std::string name_,const ssize_t argc,
3818 (void) InvokeDynamicImageFilter(name_.c_str(),&image(),argc,argv,
3823 void Magick::Image::profile(const std::string name_,
3824 const Magick::Blob &profile_)
3828 (void) ProfileImage(image(),name_.c_str(),(unsigned char *)profile_.data(),
3829 profile_.length(),&exceptionInfo);
3833 Magick::Blob Magick::Image::profile(const std::string name_) const
3838 profile=GetImageProfile(constImage(),name_.c_str());
3840 if (profile == (StringInfo *) NULL)
3842 return(Blob((void*) GetStringInfoDatum(profile),GetStringInfoLength(
3846 void Magick::Image::quantize(const bool measureError_)
3851 options()->quantizeInfo()->measure_error=MagickTrue;
3853 options()->quantizeInfo()->measure_error=MagickFalse;
3856 QuantizeImage(options()->quantizeInfo(),image(),&exceptionInfo);
3860 void Magick::Image::quantumOperator(const ChannelType channel_,
3861 const MagickEvaluateOperator operator_,double rvalue_)
3864 SetPPChannelMask(channel_);
3865 EvaluateImage(image(),operator_,rvalue_,&exceptionInfo);
3866 RestorePPChannelMask;
3870 void Magick::Image::quantumOperator(const ssize_t x_,const ssize_t y_,
3871 const size_t columns_,const size_t rows_,const ChannelType channel_,
3872 const MagickEvaluateOperator operator_,const double rvalue_)
3880 geometry.width = columns_;
3881 geometry.height = rows_;
3886 cropImage=CropImage(image(),&geometry,&exceptionInfo);
3887 SetPPChannelMask(channel_);
3888 EvaluateImage(cropImage,operator_,rvalue_,&exceptionInfo);
3889 RestorePPChannelMask;
3890 (void) CompositeImage(image(),cropImage,image()->alpha_trait ==
3891 BlendPixelTrait ? OverCompositeOp : CopyCompositeOp,MagickFalse,
3892 geometry.x,geometry.y,&exceptionInfo );
3893 cropImage=DestroyImageList(cropImage);
3897 void Magick::Image::raise(const Geometry &geometry_,const bool raisedFlag_)
3900 raiseInfo=geometry_;
3904 RaiseImage(image(),&raiseInfo,raisedFlag_ == true ? MagickTrue : MagickFalse,
3909 void Magick::Image::randomThreshold(const Geometry &thresholds_)
3912 (void) RandomThresholdImage(image(),static_cast<std::string>(
3913 thresholds_).c_str(),&exceptionInfo);
3917 void Magick::Image::randomThresholdChannel(const ChannelType channel_,
3918 const Geometry &thresholds_)
3922 SetPPChannelMask(channel_);
3923 (void) RandomThresholdImage(image(),static_cast<std::string>(
3924 thresholds_).c_str(),&exceptionInfo);
3925 RestorePPChannelMask;
3929 void Magick::Image::read(const Blob &blob_)
3935 newImage=BlobToImage(imageInfo(),static_cast<const void *>(blob_.data()),
3936 blob_.length(),&exceptionInfo);
3937 replaceImage(newImage);
3941 void Magick::Image::read(const Blob &blob_,const Geometry &size_)
3947 void Magick::Image::read(const Blob &blob_,const Geometry &size_,
3948 const size_t depth_)
3955 void Magick::Image::read(const Blob &blob_,const Geometry &size_,
3956 const size_t depth_,const std::string &magick_)
3961 // Set explicit image format
3962 fileName(magick_ + ':');
3966 void Magick::Image::read(const Blob &blob_,const Geometry &size_,
3967 const std::string &magick_)
3971 // Set explicit image format
3972 fileName(magick_ + ':');
3976 void Magick::Image::read(const Geometry &size_,const std::string &imageSpec_)
3982 void Magick::Image::read(const size_t width_,const size_t height_,
3983 const std::string &map_,const StorageType type_,const void *pixels_)
3989 newImage=ConstituteImage(width_,height_,map_.c_str(),type_, pixels_,
3991 replaceImage(newImage);
3995 void Magick::Image::read(const std::string &imageSpec_)
4001 options()->fileName(imageSpec_);
4002 newImage=ReadImage(imageInfo(),&exceptionInfo);
4004 // Ensure that multiple image frames were not read.
4005 if (newImage && newImage->next)
4010 // Destroy any extra image frames
4011 next=newImage->next;
4014 DestroyImageList(next);
4016 replaceImage(newImage);
4020 void Magick::Image::readPixels(const Magick::QuantumType quantum_,
4021 const unsigned char *source_)
4026 quantum_info=AcquireQuantumInfo(imageInfo(),image());
4028 ImportQuantumPixels(image(),(MagickCore::CacheView *) NULL,quantum_info,
4029 quantum_,source_,&exceptionInfo);
4030 quantum_info=DestroyQuantumInfo(quantum_info);
4034 void Magick::Image::reduceNoise(void)
4039 void Magick::Image::reduceNoise(const double order_)
4045 newImage=StatisticImage(constImage(),NonpeakStatistic,(size_t) order_,
4046 (size_t) order_,&exceptionInfo);
4047 replaceImage(newImage);
4051 void Magick::Image::resample(const Geometry &geometry_)
4064 // Calculate new size. This code should be supported using binary arguments
4065 // in the ImageMagick library.
4066 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
4070 newImage=ResampleImage(constImage(),width,height,image()->filter,
4072 replaceImage(newImage);
4076 void Magick::Image::resize(const Geometry &geometry_)
4089 // Calculate new size. This code should be supported using binary arguments
4090 // in the ImageMagick library.
4091 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
4095 newImage=ResizeImage(constImage(),width,height,image()->filter,
4097 replaceImage(newImage);
4101 void Magick::Image::roll(const Geometry &roll_)
4110 if (roll_.xNegative())
4112 if (roll_.yNegative())
4116 newImage=RollImage(constImage(),xOff,yOff,&exceptionInfo);
4117 replaceImage(newImage);
4121 void Magick::Image::roll(const size_t columns_,const size_t rows_)
4127 newImage=RollImage(constImage(),static_cast<ssize_t>(columns_),
4128 static_cast<ssize_t>(rows_),&exceptionInfo);
4129 replaceImage(newImage);
4133 void Magick::Image::rotate(const double degrees_)
4139 newImage=RotateImage(constImage(),degrees_,&exceptionInfo);
4140 replaceImage(newImage);
4144 void Magick::Image::rotationalBlur(const double angle_)
4150 newImage=RotationalBlurImage(constImage(),angle_,&exceptionInfo);
4151 replaceImage(newImage);
4155 void Magick::Image::rotationalBlurChannel(const ChannelType channel_,
4156 const double angle_)
4162 SetPPChannelMask(channel_);
4163 newImage=RotationalBlurImage(constImage(),angle_,&exceptionInfo);
4164 RestorePPChannelMask;
4165 replaceImage(newImage);
4169 void Magick::Image::sample(const Geometry &geometry_)
4182 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
4186 newImage=SampleImage(constImage(),width,height,&exceptionInfo);
4187 replaceImage(newImage);
4191 void Magick::Image::scale(const Geometry &geometry_)
4204 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
4208 newImage=ScaleImage(constImage(),width,height,&exceptionInfo);
4209 replaceImage(newImage);
4213 void Magick::Image::segment(const double clusterThreshold_,
4214 const double smoothingThreshold_)
4218 SegmentImage(image(),options()->quantizeColorSpace(),
4219 (MagickBooleanType) options()->verbose(),clusterThreshold_,
4220 smoothingThreshold_,&exceptionInfo);
4221 SyncImage(image(),&exceptionInfo);
4225 void Magick::Image::selectiveBlur(const double radius_,const double sigma_,
4226 const double threshold_)
4232 newImage=SelectiveBlurImage(constImage(),radius_,sigma_,threshold_,
4234 replaceImage(newImage);
4238 void Magick::Image::selectiveBlurChannel(const ChannelType channel_,
4239 const double radius_,const double sigma_,const double threshold_)
4245 SetPPChannelMask(channel_);
4246 newImage=SelectiveBlurImage(constImage(),radius_,sigma_,threshold_,
4248 RestorePPChannelMask;
4249 replaceImage(newImage);
4253 Magick::Image Magick::Image::separate(const ChannelType channel_)
4259 image=SeparateImage(constImage(),channel_,&exceptionInfo);
4261 if (image == (MagickCore::Image *) NULL)
4262 return(Magick::Image());
4264 return(Magick::Image(image));
4267 void Magick::Image::sepiaTone(const double threshold_)
4273 newImage=SepiaToneImage(constImage(),threshold_,&exceptionInfo);
4274 replaceImage(newImage);
4278 Magick::Quantum *Magick::Image::setPixels(const ssize_t x_,const ssize_t y_,
4279 const size_t columns_,const size_t rows_)
4286 result=(*QueueAuthenticPixels)(image(),x_,y_,columns_,rows_,&exceptionInfo);
4291 void Magick::Image::shade(const double azimuth_,const double elevation_,
4292 const bool colorShading_)
4298 newImage=ShadeImage(constImage(),colorShading_ == true ?
4299 MagickTrue : MagickFalse,azimuth_,elevation_,&exceptionInfo);
4300 replaceImage(newImage);
4304 void Magick::Image::shadow(const double percent_opacity_,const double sigma_,
4305 const ssize_t x_,const ssize_t y_)
4311 newImage=ShadowImage(constImage(),percent_opacity_, sigma_,x_, y_,
4313 replaceImage(newImage);
4317 void Magick::Image::sharpen(const double radius_,const double sigma_)
4323 newImage=SharpenImage(constImage(),radius_,sigma_,&exceptionInfo);
4324 replaceImage(newImage);
4328 void Magick::Image::sharpenChannel(const ChannelType channel_,
4329 const double radius_,const double sigma_)
4335 SetPPChannelMask(channel_);
4336 newImage=SharpenImage(constImage(),radius_,sigma_,&exceptionInfo);
4337 RestorePPChannelMask;
4338 replaceImage(newImage);
4342 void Magick::Image::shave(const Geometry &geometry_)
4348 shaveInfo=geometry_;
4351 newImage=ShaveImage(constImage(),&shaveInfo,&exceptionInfo);
4352 replaceImage(newImage);
4356 void Magick::Image::shear(const double xShearAngle_,const double yShearAngle_)
4362 newImage=ShearImage(constImage(),xShearAngle_,yShearAngle_,&exceptionInfo);
4363 replaceImage(newImage);
4367 void Magick::Image::sigmoidalContrast(const size_t sharpen_,
4368 const double contrast,const double midpoint)
4372 (void) SigmoidalContrastImage(image(),(MagickBooleanType) sharpen_,contrast,
4373 midpoint,&exceptionInfo);
4377 std::string Magick::Image::signature(const bool force_) const
4382 Lock(&_imgRef->_mutexLock);
4384 // Re-calculate image signature if necessary
4386 if (force_ || !GetImageProperty(constImage(),"Signature",&exceptionInfo) ||
4387 constImage()->taint)
4388 SignatureImage(const_cast<MagickCore::Image *>(constImage()),
4391 property=GetImageProperty(constImage(),"Signature",&exceptionInfo);
4394 return(std::string(property));
4397 void Magick::Image::sketch(const double radius_,const double sigma_,
4398 const double angle_)
4404 newImage=SketchImage(constImage(),radius_,sigma_,angle_,&exceptionInfo);
4405 replaceImage(newImage);
4409 void Magick::Image::solarize(const double factor_)
4413 SolarizeImage(image(),factor_,&exceptionInfo);
4417 void Magick::Image::sparseColor(const ChannelType channel_,
4418 const SparseColorMethod method_,const size_t numberArguments_,
4419 const double *arguments_)
4425 SetPPChannelMask(channel_);
4426 newImage=SparseColorImage(constImage(),method_,numberArguments_,arguments_,
4428 RestorePPChannelMask;
4429 replaceImage(newImage);
4433 void Magick::Image::splice(const Geometry &geometry_)
4439 spliceInfo=geometry_;
4442 newImage=SpliceImage(constImage(),&spliceInfo,&exceptionInfo);
4443 replaceImage(newImage);
4447 void Magick::Image::spread(const size_t amount_)
4453 newImage=SpreadImage(constImage(),amount_,image()->interpolate,
4455 replaceImage(newImage);
4459 void Magick::Image::statistics(ImageStatistics *statistics)
4467 SetPPChannelMask(RedChannel);
4468 (void) GetImageRange(constImage(),&minimum,&maximum,&exceptionInfo);
4469 statistics->red.minimum=minimum;
4470 statistics->red.maximum=maximum;
4471 (void) GetImageMean(constImage(),&statistics->red.mean,
4472 &statistics->red.standard_deviation,&exceptionInfo);
4473 (void) GetImageKurtosis(constImage(),&statistics->red.kurtosis,
4474 &statistics->red.skewness,&exceptionInfo);
4476 (void) SetImageChannelMask(image(),GreenChannel);
4477 (void) GetImageRange(constImage(),&minimum,&maximum,&exceptionInfo);
4478 statistics->green.minimum=minimum;
4479 statistics->green.maximum=maximum;
4480 (void) GetImageMean(constImage(),&statistics->green.mean,
4481 &statistics->green.standard_deviation,&exceptionInfo);
4482 (void) GetImageKurtosis(constImage(),&statistics->green.kurtosis,
4483 &statistics->green.skewness,&exceptionInfo);
4485 (void) SetImageChannelMask(image(),GreenChannel);
4486 (void) GetImageRange(constImage(),&minimum,&maximum,&exceptionInfo);
4487 statistics->blue.minimum=minimum;
4488 statistics->blue.maximum=maximum;
4489 (void) GetImageMean(constImage(),&statistics->blue.mean,
4490 &statistics->blue.standard_deviation,&exceptionInfo);
4491 (void) GetImageKurtosis(constImage(),&statistics->blue.kurtosis,
4492 &statistics->blue.skewness,&exceptionInfo);
4494 (void) SetImageChannelMask(image(),AlphaChannel);
4495 (void) GetImageRange(constImage(),&minimum,&maximum,&exceptionInfo);
4496 statistics->alpha.minimum=minimum;
4497 statistics->alpha.maximum=maximum;
4498 (void) GetImageMean(constImage(),&statistics->alpha.mean,
4499 &statistics->alpha.standard_deviation,&exceptionInfo);
4500 (void) GetImageKurtosis(constImage(),&statistics->alpha.kurtosis,
4501 &statistics->alpha.skewness,&exceptionInfo);
4502 RestorePPChannelMask;
4506 void Magick::Image::stegano(const Image &watermark_)
4512 newImage=SteganoImage(constImage(),watermark_.constImage(),&exceptionInfo);
4513 replaceImage(newImage);
4517 void Magick::Image::stereo(const Image &rightImage_)
4523 newImage=StereoImage(constImage(),rightImage_.constImage(),&exceptionInfo);
4524 replaceImage(newImage);
4528 void Magick::Image::strip(void)
4532 StripImage(image(),&exceptionInfo);
4536 Magick::Image Magick::Image::subImageSearch(const Image &reference_,
4537 const MetricType metric_,Geometry *offset_,double *similarityMetric_,
4538 const double similarityThreshold)
4547 newImage=SimilarityImage(image(),reference_.constImage(),metric_,
4548 similarityThreshold,&offset,similarityMetric_,&exceptionInfo);
4550 if (offset_ != (Geometry *) NULL)
4552 if (newImage == (MagickCore::Image *) NULL)
4553 return(Magick::Image());
4555 return(Magick::Image(newImage));
4558 void Magick::Image::swirl(const double degrees_)
4564 newImage=SwirlImage(constImage(),degrees_,image()->interpolate,
4566 replaceImage(newImage);
4570 void Magick::Image::syncPixels(void)
4573 (void) (*SyncAuthenticPixels)(image(),&exceptionInfo);
4577 void Magick::Image::texture(const Image &texture_)
4581 TextureImage(image(),texture_.constImage(),&exceptionInfo);
4585 void Magick::Image::threshold(const double threshold_)
4589 BilevelImage(image(),threshold_,&exceptionInfo);
4593 void Magick::Image::thumbnail(const Geometry &geometry_)
4606 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
4610 newImage=ThumbnailImage(constImage(),width,height,&exceptionInfo);
4611 replaceImage(newImage);
4615 void Magick::Image::tint(const std::string opacity_)
4624 color=static_cast<PixelInfo>(constOptions()->fillColor());
4625 newImage=TintImage(constImage(),opacity_.c_str(),&color,&exceptionInfo);
4626 replaceImage(newImage);
4630 void Magick::Image::transform(const Geometry &imageGeometry_)
4634 TransformImage(&(image()),0,std::string(imageGeometry_).c_str(),
4639 void Magick::Image::transform(const Geometry &imageGeometry_,
4640 const Geometry &cropGeometry_)
4644 TransformImage(&(image()),std::string(cropGeometry_).c_str(),std::string(
4645 imageGeometry_).c_str(), &exceptionInfo);
4649 void Magick::Image::transformOrigin(const double x_,const double y_)
4652 options()->transformOrigin(x_,y_);
4655 void Magick::Image::transformReset(void)
4658 options()->transformReset();
4661 void Magick::Image::transformScale(const double sx_,const double sy_)
4664 options()->transformScale(sx_,sy_);
4667 void Magick::Image::transparent(const Color &color_)
4675 if (!color_.isValid())
4676 throwExceptionExplicit(OptionError,"Color argument is invalid");
4680 (void) QueryColorCompliance(color.c_str(),AllCompliance,&target,
4683 TransparentPaintImage(image(),&target,TransparentAlpha,MagickFalse,
4688 void Magick::Image::transparentChroma(const Color &colorLow_,
4689 const Color &colorHigh_)
4699 if (!colorLow_.isValid() || !colorHigh_.isValid())
4700 throwExceptionExplicit(OptionError,"Color argument is invalid");
4703 colorHigh=colorHigh_;
4706 (void) QueryColorCompliance(colorLow.c_str(),AllCompliance,&targetLow,
4708 (void) QueryColorCompliance(colorHigh.c_str(),AllCompliance,&targetHigh,
4711 TransparentPaintImageChroma(image(),&targetLow,&targetHigh,TransparentAlpha,
4712 MagickFalse,&exceptionInfo);
4716 void Magick::Image::transpose(void)
4722 newImage=TransposeImage(constImage(),&exceptionInfo);
4723 replaceImage(newImage);
4727 void Magick::Image::transverse(void)
4733 newImage=TransverseImage(constImage(),&exceptionInfo);
4734 replaceImage(newImage);
4738 void Magick::Image::trim(void)
4744 newImage=TrimImage(constImage(),&exceptionInfo);
4745 replaceImage(newImage);
4749 Magick::Image Magick::Image::uniqueColors(void)
4755 image=UniqueImageColors(constImage(),&exceptionInfo);
4757 if (image == (MagickCore::Image *) NULL)
4758 return(Magick::Image());
4760 return(Magick::Image(image));
4763 void Magick::Image::unsharpmask(const double radius_,const double sigma_,
4764 const double amount_,const double threshold_)
4770 newImage=UnsharpMaskImage(constImage(),radius_,sigma_,amount_,threshold_,
4772 replaceImage(newImage);
4776 void Magick::Image::unsharpmaskChannel(const ChannelType channel_,
4777 const double radius_,const double sigma_,const double amount_,
4778 const double threshold_)
4784 SetPPChannelMask(channel_);
4785 newImage=UnsharpMaskImage(constImage(),radius_,sigma_,amount_,threshold_,
4787 RestorePPChannelMask;
4788 replaceImage(newImage);
4792 void Magick::Image::vignette(const double radius_,const double sigma_,
4793 const ssize_t x_,const ssize_t y_)
4799 newImage=VignetteImage(constImage(),radius_,sigma_,x_,y_,&exceptionInfo);
4800 replaceImage(newImage);
4804 void Magick::Image::wave(const double amplitude_,const double wavelength_)
4810 newImage=WaveImage(constImage(),amplitude_,wavelength_,image()->interpolate,
4812 replaceImage(newImage);
4816 void Magick::Image::whiteThreshold(const std::string &threshold_)
4820 WhiteThresholdImage(image(),threshold_.c_str(),&exceptionInfo);
4824 void Magick::Image::whiteThresholdChannel(const ChannelType channel_,
4825 const std::string &threshold_)
4829 SetPPChannelMask(channel_);
4830 WhiteThresholdImage(image(),threshold_.c_str(),&exceptionInfo);
4831 RestorePPChannelMask;
4835 void Magick::Image::write(Blob *blob_)
4845 data=ImagesToBlob(constImageInfo(),image(),&length,&exceptionInfo);
4847 blob_->updateNoCopy(data,length,Blob::MallocAllocator);
4851 void Magick::Image::write(Blob *blob_,const std::string &magick_)
4862 data=ImagesToBlob(constImageInfo(),image(),&length,&exceptionInfo);
4864 blob_->updateNoCopy(data,length,Blob::MallocAllocator);
4868 void Magick::Image::write(Blob *blob_,const std::string &magick_,
4869 const size_t depth_)
4881 data=ImagesToBlob(constImageInfo(),image(),&length,&exceptionInfo);
4883 blob_->updateNoCopy(data,length,Blob::MallocAllocator);
4887 void Magick::Image::write(const ssize_t x_,const ssize_t y_,
4888 const size_t columns_,const size_t rows_,const std::string &map_,
4889 const StorageType type_,void *pixels_)
4892 ExportImagePixels(image(),x_,y_,columns_,rows_,map_.c_str(),type_,pixels_,
4897 void Magick::Image::write(const std::string &imageSpec_)
4900 fileName(imageSpec_);
4902 WriteImage(constImageInfo(),image(),&exceptionInfo);
4906 void Magick::Image::writePixels(const Magick::QuantumType quantum_,
4907 unsigned char *destination_)
4912 quantum_info=AcquireQuantumInfo(imageInfo(),image());
4914 ExportQuantumPixels(image(),(MagickCore::CacheView *) NULL,quantum_info,
4915 quantum_,destination_, &exceptionInfo);
4916 quantum_info=DestroyQuantumInfo(quantum_info);
4920 void Magick::Image::zoom(const Geometry &geometry_)
4933 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
4937 newImage=ResizeImage(constImage(),width,height,image()->filter,&exceptionInfo);
4938 replaceImage(newImage);
4942 Magick::Image::Image(MagickCore::Image *image_)
4943 : _imgRef(new ImageRef(image_))
4947 MagickCore::Image *&Magick::Image::image(void)
4949 return(_imgRef->image());
4952 const MagickCore::Image *Magick::Image::constImage(void) const
4954 return(_imgRef->image());
4957 MagickCore::ImageInfo *Magick::Image::imageInfo(void)
4959 return(_imgRef->options()->imageInfo());
4962 const MagickCore::ImageInfo *Magick::Image::constImageInfo(void) const
4964 return(_imgRef->options()->imageInfo());
4967 Magick::Options *Magick::Image::options(void)
4969 return(_imgRef->options());
4972 const Magick::Options *Magick::Image::constOptions(void) const
4974 return(_imgRef->options());
4977 MagickCore::QuantizeInfo *Magick::Image::quantizeInfo(void)
4979 return(_imgRef->options()->quantizeInfo());
4982 const MagickCore::QuantizeInfo *Magick::Image::constQuantizeInfo(void) const
4984 return(_imgRef->options()->quantizeInfo());
4987 void Magick::Image::modifyImage(void)
4990 Lock(&_imgRef->_mutexLock);
4991 if (_imgRef->_refCount == 1)
4993 // De-register image and return
5000 replaceImage(CloneImage(image(),0,0,MagickTrue,&exceptionInfo));
5004 ssize_t Magick::Image::registerId(void)
5006 Lock(&_imgRef->_mutexLock);
5007 if ( _imgRef->id() < 0)
5013 _imgRef->id(_imgRef->id()+1);
5014 sprintf(id,"%.20g\n",(double) _imgRef->id());
5015 SetImageRegistry(ImageRegistryType,id,image(),&exceptionInfo);
5018 return(_imgRef->id());
5021 MagickCore::Image *Magick::Image::replaceImage(MagickCore::Image *replacement_)
5027 image = replacement_;
5031 image=AcquireImage(constImageInfo(),&exceptionInfo);
5036 Lock(&_imgRef->_mutexLock);
5038 if (_imgRef->_refCount == 1)
5040 // We own the image, just replace it, and de-register
5042 _imgRef->image(image);
5046 // We don't own the image, dereference and replace with copy
5047 --_imgRef->_refCount;
5048 _imgRef=new ImageRef(image,constOptions());
5052 return(_imgRef->_image);
5055 void Magick::Image::unregisterId(void)