Magick++ 7.1.2-32
Convert, Edit, Or Compose Bitmap Images
Loading...
Searching...
No Matches
Image.cpp
1// This may look like C code, but it is really -*- C++ -*-
2//
3// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003
4//
5// Copyright @ 1999 ImageMagick Studio LLC, a non-profit organization
6// dedicated to making software imaging solutions freely available.
7//
8// Implementation of Image
9//
10
11#define MAGICKCORE_IMPLEMENTATION 1
12#define MAGICK_PLUSPLUS_IMPLEMENTATION 1
13
14#include "Magick++/Include.h"
15#include "Magick++/Image.h"
16#include "Magick++/Functions.h"
17#include "Magick++/Pixels.h"
18#include "Magick++/Options.h"
19#include "Magick++/ImageRef.h"
20
21using namespace std;
22
23#define MagickPI 3.1415926535897932384626433832795028841971693993751058209749445923078164062
24#define DegreesToRadians(x) (MagickPI*(x)/180.0)
25#define ThrowImageException ThrowPPException(quiet())
26
27MagickPPExport const char *Magick::borderGeometryDefault="6x6+0+0";
28MagickPPExport const char *Magick::frameGeometryDefault="25x25+6+6";
29MagickPPExport const char *Magick::raiseGeometryDefault="6x6+0+0";
30
31MagickPPExport int Magick::operator == (const Magick::Image &left_,
32 const Magick::Image &right_)
33{
34 // If image pixels and signature are the same, then the image is identical
35 return((left_.rows() == right_.rows()) &&
36 (left_.columns() == right_.columns()) &&
37 (left_.signature() == right_.signature()));
38}
39
40MagickPPExport int Magick::operator != (const Magick::Image &left_,
41 const Magick::Image &right_)
42{
43 return(!(left_ == right_));
44}
45
46MagickPPExport int Magick::operator > (const Magick::Image &left_,
47 const Magick::Image &right_)
48{
49 return(!(left_ < right_) && (left_ != right_));
50}
51
52MagickPPExport int Magick::operator < (const Magick::Image &left_,
53 const Magick::Image &right_)
54{
55 // If image pixels are less, then image is smaller
56 return((left_.rows() * left_.columns()) <
57 (right_.rows() * right_.columns()));
58}
59
60MagickPPExport int Magick::operator >= (const Magick::Image &left_,
61 const Magick::Image &right_)
62{
63 return((left_ > right_) || (left_ == right_));
64}
65
66MagickPPExport int Magick::operator <= (const Magick::Image &left_,
67 const Magick::Image &right_)
68{
69 return((left_ < right_) || ( left_ == right_));
70}
71
72Magick::Image::Image(void)
73 : _imgRef(new ImageRef)
74{
75}
76
77Magick::Image::Image(const Blob &blob_)
78 : _imgRef(new ImageRef)
79{
80 try
81 {
82 // Initialize, Allocate and Read images
83 quiet(true);
84 read(blob_);
85 quiet(false);
86 }
87 catch (const Error&)
88 {
89 // Release resources
90 delete _imgRef;
91 throw;
92 }
93}
94
95Magick::Image::Image(const Blob &blob_,const Geometry &size_)
96 : _imgRef(new ImageRef)
97{
98 try
99 {
100 // Read from Blob
101 quiet(true);
102 read(blob_, size_);
103 quiet(false);
104 }
105 catch(const Error&)
106 {
107 // Release resources
108 delete _imgRef;
109 throw;
110 }
111}
112
113Magick::Image::Image(const Blob &blob_,const Geometry &size_,
114 const size_t depth_)
115 : _imgRef(new ImageRef)
116{
117 try
118 {
119 // Read from Blob
120 quiet(true);
121 read(blob_,size_,depth_);
122 quiet(false);
123 }
124 catch(const Error&)
125 {
126 // Release resources
127 delete _imgRef;
128 throw;
129 }
130}
131
132Magick::Image::Image(const Blob &blob_,const Geometry &size_,
133 const size_t depth_,const std::string &magick_)
134 : _imgRef(new ImageRef)
135{
136 try
137 {
138 // Read from Blob
139 quiet(true);
140 read(blob_,size_,depth_,magick_);
141 quiet(false);
142 }
143 catch(const Error&)
144 {
145 // Release resources
146 delete _imgRef;
147 throw;
148 }
149}
150
151Magick::Image::Image(const Blob &blob_,const Geometry &size_,
152 const std::string &magick_)
153 : _imgRef(new ImageRef)
154{
155 try
156 {
157 // Read from Blob
158 quiet(true);
159 read(blob_,size_,magick_);
160 quiet(false);
161 }
162 catch(const Error&)
163 {
164 // Release resources
165 delete _imgRef;
166 throw;
167 }
168}
169
170Magick::Image::Image(const Geometry &size_,const Color &color_)
171 : _imgRef(new ImageRef)
172{
173 // xc: prefix specifies an X11 color string
174 std::string imageSpec("xc:");
175 imageSpec+=color_;
176
177 try
178 {
179 quiet(true);
180 // Set image size
181 size(size_);
182
183 // Initialize, Allocate and Read images
184 read(imageSpec);
185 quiet(false);
186 }
187 catch(const Error&)
188 {
189 // Release resources
190 delete _imgRef;
191 throw;
192 }
193}
194
195Magick::Image::Image(const Image &image_)
196 : _imgRef(image_._imgRef)
197{
198 _imgRef->increase();
199}
200
201Magick::Image::Image(const Image &image_,const Geometry &geometry_)
202 : _imgRef(new ImageRef)
203{
204 const RectangleInfo
205 geometry=geometry_;
206
207 OffsetInfo
208 offset;
209
210 MagickCore::Image
211 *image;
212
213 GetPPException;
214 image=CloneImage(image_.constImage(),geometry_.width(),geometry_.height(),
215 MagickTrue,exceptionInfo);
216 replaceImage(image);
217 _imgRef->options(new Options(*image_.constOptions()));
218 offset.x=0;
219 offset.y=0;
220 (void) CopyImagePixels(image,image_.constImage(),&geometry,&offset,
221 exceptionInfo);
222 ThrowImageException;
223}
224
225Magick::Image::Image(const size_t width_,const size_t height_,
226 const std::string &map_,const StorageType type_,const void *pixels_)
227 : _imgRef(new ImageRef)
228{
229 try
230 {
231 quiet(true);
232 read(width_,height_,map_.c_str(),type_,pixels_);
233 quiet(false);
234 }
235 catch(const Error&)
236 {
237 // Release resources
238 delete _imgRef;
239 throw;
240 }
241}
242
243Magick::Image::Image(const std::string &imageSpec_)
244 : _imgRef(new ImageRef)
245{
246 try
247 {
248 // Initialize, Allocate and Read images
249 quiet(true);
250 read(imageSpec_);
251 quiet(false);
252 }
253 catch(const Error&)
254 {
255 // Release resources
256 delete _imgRef;
257 throw;
258 }
259}
260
261Magick::Image::~Image()
262{
263 try
264 {
265 if (_imgRef->decrease() == 0)
266 delete _imgRef;
267 }
268 catch(Magick::Exception&)
269 {
270 }
271
272 _imgRef=(Magick::ImageRef *) NULL;
273}
274
275Magick::Image& Magick::Image::operator=(const Magick::Image &image_)
276{
277 if (this != &image_)
278 {
279 image_._imgRef->increase();
280 if (_imgRef->decrease() == 0)
281 delete _imgRef;
282
283 // Use new image reference
284 _imgRef=image_._imgRef;
285 }
286 return(*this);
287}
288
289void Magick::Image::adjoin(const bool flag_)
290{
291 modifyImage();
292 options()->adjoin(flag_);
293}
294
295bool Magick::Image::adjoin(void) const
296{
297 return(constOptions()->adjoin());
298}
299
300void Magick::Image::alpha(const bool alphaFlag_)
301{
302 modifyImage();
303
304 // If matte channel is requested, but image doesn't already have a
305 // matte channel, then create an opaque matte channel. Likewise, if
306 // the image already has a matte channel but a matte channel is not
307 // desired, then set the matte channel to opaque.
308 GetPPException;
309 if (bool(alphaFlag_) != bool(constImage()->alpha_trait))
310 SetImageAlpha(image(),OpaqueAlpha,exceptionInfo);
311 ThrowImageException;
312
313 image()->alpha_trait=alphaFlag_ ? BlendPixelTrait : UndefinedPixelTrait;
314}
315
316bool Magick::Image::alpha(void) const
317{
318 if (constImage()->alpha_trait == BlendPixelTrait)
319 return(true);
320 else
321 return(false);
322}
323
324void Magick::Image::matteColor(const Color &matteColor_)
325{
326 modifyImage();
327
328 if (matteColor_.isValid())
329 {
330 image()->matte_color=matteColor_;
331 options()->matteColor(matteColor_);
332 }
333 else
334 {
335 // Set to default matte color
336 Color tmpColor("#BDBDBD");
337 image()->matte_color=tmpColor;
338 options()->matteColor(tmpColor);
339 }
340}
341
342Magick::Color Magick::Image::matteColor(void) const
343{
344 return(Color(constImage()->matte_color));
345}
346
347void Magick::Image::animationDelay(const size_t delay_)
348{
349 modifyImage();
350 image()->delay=delay_;
351}
352
353size_t Magick::Image::animationDelay(void) const
354{
355 return(constImage()->delay);
356}
357
358void Magick::Image::animationIterations(const size_t iterations_)
359{
360 modifyImage();
361 image()->iterations=iterations_;
362}
363
364size_t Magick::Image::animationIterations(void) const
365{
366 return(constImage()->iterations);
367}
368
369void Magick::Image::backgroundColor(const Color &backgroundColor_)
370{
371 modifyImage();
372
373 if (backgroundColor_.isValid())
374 image()->background_color=backgroundColor_;
375 else
376 image()->background_color=Color();
377
378 options()->backgroundColor(backgroundColor_);
379}
380
381Magick::Color Magick::Image::backgroundColor(void) const
382{
383 return(constOptions()->backgroundColor());
384}
385
386void Magick::Image::backgroundTexture(const std::string &backgroundTexture_)
387{
388 modifyImage();
389 options()->backgroundTexture(backgroundTexture_);
390}
391
392std::string Magick::Image::backgroundTexture(void) const
393{
394 return(constOptions()->backgroundTexture());
395}
396
397size_t Magick::Image::baseColumns(void) const
398{
399 return(constImage()->magick_columns);
400}
401
402std::string Magick::Image::baseFilename(void) const
403{
404 return(std::string(constImage()->magick_filename));
405}
406
407size_t Magick::Image::baseRows(void) const
408{
409 return(constImage()->magick_rows);
410}
411
412void Magick::Image::blackPointCompensation(const bool flag_)
413{
414 image()->black_point_compensation=(MagickBooleanType) flag_;
415}
416
417bool Magick::Image::blackPointCompensation(void) const
418{
419 return(static_cast<bool>(constImage()->black_point_compensation));
420}
421
422void Magick::Image::borderColor(const Color &borderColor_)
423{
424 modifyImage();
425
426 if (borderColor_.isValid())
427 image()->border_color=borderColor_;
428 else
429 image()->border_color=Color();
430
431 options()->borderColor(borderColor_);
432}
433
434Magick::Color Magick::Image::borderColor(void) const
435{
436 return(constOptions()->borderColor());
437}
438
439Magick::Geometry Magick::Image::boundingBox(void) const
440{
441 RectangleInfo
442 bbox;
443
444 GetPPException;
445 bbox=GetImageBoundingBox(constImage(),exceptionInfo);
446 ThrowImageException;
447 return(Geometry(bbox));
448}
449
450void Magick::Image::boxColor(const Color &boxColor_)
451{
452 modifyImage();
453 options()->boxColor(boxColor_);
454}
455
456Magick::Color Magick::Image::boxColor(void) const
457{
458 return(constOptions()->boxColor());
459}
460
461void Magick::Image::channelDepth(const ChannelType channel_,
462 const size_t depth_)
463{
464 modifyImage();
465 GetPPException;
466 GetAndSetPPChannelMask(channel_);
467 SetImageDepth(image(),depth_,exceptionInfo);
468 RestorePPChannelMask;
469 ThrowImageException;
470}
471
472size_t Magick::Image::channelDepth(const ChannelType channel_)
473{
474 size_t
475 channel_depth;
476
477 GetPPException;
478 GetAndSetPPChannelMask(channel_);
479 channel_depth=GetImageDepth(constImage(),exceptionInfo);
480 RestorePPChannelMask;
481 ThrowImageException;
482 return(channel_depth);
483}
484
485size_t Magick::Image::channels() const
486{
487 return(constImage()->number_channels);
488}
489
490void Magick::Image::classType(const ClassType class_)
491{
492 if (classType() == PseudoClass && class_ == DirectClass)
493 {
494 // Use SyncImage to synchronize the DirectClass pixels with the
495 // color map and then set to DirectClass type.
496 modifyImage();
497 GetPPException;
498 SyncImage(image(),exceptionInfo);
499 ThrowImageException;
500 image()->colormap=(PixelInfo *)RelinquishMagickMemory(image()->colormap);
501 image()->storage_class=static_cast<MagickCore::ClassType>(DirectClass);
502 return;
503 }
504
505 if (classType() == DirectClass && class_ == PseudoClass)
506 {
507 // Quantize to create PseudoClass color map
508 modifyImage();
509 quantizeColors(MaxColormapSize);
510 quantize();
511 image()->storage_class=static_cast<MagickCore::ClassType>(PseudoClass);
512 }
513}
514
515Magick::ClassType Magick::Image::classType(void) const
516{
517 return static_cast<Magick::ClassType>(constImage()->storage_class);
518}
519
520void Magick::Image::colorFuzz(const double fuzz_)
521{
522 modifyImage();
523 image()->fuzz=fuzz_;
524 options()->colorFuzz(fuzz_);
525}
526
527double Magick::Image::colorFuzz(void) const
528{
529 return(constOptions()->colorFuzz());
530}
531
532void Magick::Image::colorMapSize(const size_t entries_)
533{
534 if (entries_ >MaxColormapSize)
535 throwExceptionExplicit(MagickCore::OptionError,
536 "Colormap entries must not exceed MaxColormapSize");
537
538 modifyImage();
539 GetPPException;
540 (void) AcquireImageColormap(image(),entries_,exceptionInfo);
541 ThrowImageException;
542}
543
544size_t Magick::Image::colorMapSize(void) const
545{
546 if (!constImage()->colormap)
547 throwExceptionExplicit(MagickCore::OptionError,
548 "Image does not contain a colormap");
549
550 return(constImage()->colors);
551}
552
553void Magick::Image::colorSpace(const ColorspaceType colorSpace_)
554{
555 if (image()->colorspace == colorSpace_)
556 return;
557
558 modifyImage();
559 GetPPException;
560 TransformImageColorspace(image(),colorSpace_,exceptionInfo);
561 ThrowImageException;
562}
563
564Magick::ColorspaceType Magick::Image::colorSpace(void) const
565{
566 return (constImage()->colorspace);
567}
568
569void Magick::Image::colorSpaceType(const ColorspaceType colorSpace_)
570{
571 modifyImage();
572 GetPPException;
573 SetImageColorspace(image(),colorSpace_,exceptionInfo);
574 ThrowImageException;
575 options()->colorspaceType(colorSpace_);
576}
577
578Magick::ColorspaceType Magick::Image::colorSpaceType(void) const
579{
580 return(constOptions()->colorspaceType());
581}
582
583size_t Magick::Image::columns(void) const
584{
585 return(constImage()->columns);
586}
587
588void Magick::Image::comment(const std::string &comment_)
589{
590 modifyImage();
591 GetPPException;
592 SetImageProperty(image(),"Comment",NULL,exceptionInfo);
593 if (comment_.length() > 0)
594 SetImageProperty(image(),"Comment",comment_.c_str(),exceptionInfo);
595 ThrowImageException;
596}
597
598std::string Magick::Image::comment(void) const
599{
600 const char
601 *value;
602
603 GetPPException;
604 value=GetImageProperty(constImage(),"Comment",exceptionInfo);
605 ThrowImageException;
606
607 if (value)
608 return(std::string(value));
609
610 return(std::string()); // Intentionally no exception
611}
612
613void Magick::Image::compose(const CompositeOperator compose_)
614{
615 image()->compose=compose_;
616}
617
618Magick::CompositeOperator Magick::Image::compose(void) const
619{
620 return(constImage()->compose);
621}
622
623void Magick::Image::compressType(const CompressionType compressType_)
624{
625 modifyImage();
626 image()->compression=compressType_;
627 options()->compressType(compressType_);
628}
629
630Magick::CompressionType Magick::Image::compressType(void) const
631{
632 return(constImage()->compression);
633}
634
635void Magick::Image::debug(const bool flag_)
636{
637 modifyImage();
638 options()->debug(flag_);
639}
640
641bool Magick::Image::debug(void) const
642{
643 return(constOptions()->debug());
644}
645
646void Magick::Image::density(const Point &density_)
647{
648 modifyImage();
649 options()->density(density_);
650 if (density_.isValid())
651 {
652 image()->resolution.x=density_.x();
653 if (density_.y() != 0.0)
654 image()->resolution.y=density_.y();
655 else
656 image()->resolution.y=density_.x();
657 }
658 else
659 {
660 // Reset to default
661 image()->resolution.x=0.0;
662 image()->resolution.y=0.0;
663 }
664}
665
666Magick::Point Magick::Image::density(void) const
667{
668 if (isValid())
669 {
670 double
671 x_resolution=72,
672 y_resolution=72;
673
674 if (constImage()->resolution.x > 0.0)
675 x_resolution=constImage()->resolution.x;
676
677 if (constImage()->resolution.y > 0.0)
678 y_resolution=constImage()->resolution.y;
679
680 return(Point(x_resolution, y_resolution));
681 }
682
683 return(constOptions()->density());
684}
685
686void Magick::Image::depth(const size_t depth_)
687{
688 modifyImage();
689 image()->depth=depth_;
690 options()->depth(depth_);
691}
692
693size_t Magick::Image::depth(void) const
694{
695 return(constImage()->depth);
696}
697
698std::string Magick::Image::directory(void) const
699{
700 if (constImage()->directory)
701 return(std::string(constImage()->directory));
702
703 if (!quiet())
704 throwExceptionExplicit(MagickCore::CorruptImageWarning,
705 "Image does not contain a directory");
706
707 return(std::string());
708}
709
710void Magick::Image::endian(const Magick::EndianType endian_)
711{
712 modifyImage();
713 options()->endian(endian_);
714 image()->endian=endian_;
715}
716
717Magick::EndianType Magick::Image::endian(void) const
718{
719 return(constImage()->endian);
720}
721
722void Magick::Image::exifProfile(const Magick::Blob &exifProfile_)
723{
724 modifyImage();
725
726 if (exifProfile_.data() != 0)
727 {
728 StringInfo
729 *exif_profile;
730
731 exif_profile=AcquireStringInfo(exifProfile_.length());
732 SetStringInfoDatum(exif_profile,(unsigned char *) exifProfile_.data());
733 GetPPException;
734 (void) SetImageProfile(image(),"exif",exif_profile,exceptionInfo);
735 exif_profile=DestroyStringInfo(exif_profile);
736 ThrowImageException;
737 }
738}
739
740Magick::Blob Magick::Image::exifProfile(void) const
741{
742 const StringInfo
743 *exif_profile;
744
745 exif_profile=GetImageProfile(constImage(),"exif");
746 if (exif_profile == (StringInfo *) NULL)
747 return(Blob());
748 return(Blob(GetStringInfoDatum(exif_profile),
749 GetStringInfoLength(exif_profile)));
750}
751
752void Magick::Image::fileName(const std::string &fileName_)
753{
754 ssize_t
755 max_length;
756
757 modifyImage();
758
759 max_length=sizeof(image()->filename)-1;
760 fileName_.copy(image()->filename,(size_t) max_length);
761 if ((ssize_t) fileName_.length() > max_length)
762 image()->filename[max_length]=0;
763 else
764 image()->filename[fileName_.length()]=0;
765
766 options()->fileName(fileName_);
767}
768
769std::string Magick::Image::fileName(void) const
770{
771 return(constOptions()->fileName());
772}
773
774MagickCore::MagickSizeType Magick::Image::fileSize(void) const
775{
776 return(GetBlobSize(constImage()));
777}
778
779void Magick::Image::fillColor(const Magick::Color &fillColor_)
780{
781 modifyImage();
782 options()->fillColor(fillColor_);
783}
784
785Magick::Color Magick::Image::fillColor(void) const
786{
787 return(constOptions()->fillColor());
788}
789
790void Magick::Image::fillRule(const Magick::FillRule &fillRule_)
791{
792 modifyImage();
793 options()->fillRule(fillRule_);
794}
795
796Magick::FillRule Magick::Image::fillRule(void) const
797{
798 return constOptions()->fillRule();
799}
800
801void Magick::Image::fillPattern(const Image &fillPattern_)
802{
803 modifyImage();
804 if (fillPattern_.isValid())
805 options()->fillPattern(fillPattern_.constImage());
806 else
807 options()->fillPattern(static_cast<MagickCore::Image*>(NULL));
808}
809
810Magick::Image Magick::Image::fillPattern(void) const
811{
812 // FIXME: This is inordinately inefficient
813 const MagickCore::Image
814 *tmpTexture;
815
816 Image
817 texture;
818
819 tmpTexture=constOptions()->fillPattern();
820
821 if (tmpTexture)
822 {
823 MagickCore::Image
824 *image;
825
826 GetPPException;
827 image=CloneImage(tmpTexture,0,0,MagickTrue,exceptionInfo);
828 texture.replaceImage(image);
829 ThrowImageException;
830 }
831 return(texture);
832}
833
834void Magick::Image::filterType(const Magick::FilterType filterType_)
835{
836 modifyImage();
837 image()->filter=filterType_;
838}
839
840Magick::FilterType Magick::Image::filterType(void) const
841{
842 return(constImage()->filter);
843}
844
845void Magick::Image::font(const std::string &font_)
846{
847 modifyImage();
848 options()->font(font_);
849}
850
851std::string Magick::Image::font(void) const
852{
853 return(constOptions()->font());
854}
855
856void Magick::Image::fontFamily(const std::string &family_)
857{
858 modifyImage();
859 options()->fontFamily(family_);
860}
861
862std::string Magick::Image::fontFamily(void) const
863{
864 return(constOptions()->fontFamily());
865}
866
867void Magick::Image::fontPointsize(const double pointSize_)
868{
869 modifyImage();
870 options()->fontPointsize(pointSize_);
871}
872
873double Magick::Image::fontPointsize(void) const
874{
875 return(constOptions()->fontPointsize());
876}
877
878void Magick::Image::fontStyle(const StyleType pointSize_)
879{
880 modifyImage();
881 options()->fontStyle(pointSize_);
882}
883
884Magick::StyleType Magick::Image::fontStyle(void) const
885{
886 return(constOptions()->fontStyle());
887}
888
889void Magick::Image::fontWeight(const size_t weight_)
890{
891 modifyImage();
892 options()->fontWeight(weight_);
893}
894
895size_t Magick::Image::fontWeight(void) const
896{
897 return(constOptions()->fontWeight());
898}
899
900std::string Magick::Image::format(void) const
901{
902 const MagickInfo
903 *magick_info;
904
905 GetPPException;
906 magick_info=GetMagickInfo(constImage()->magick,exceptionInfo);
907 ThrowImageException;
908
909 if ((magick_info != 0) && (*magick_info->description != '\0'))
910 return(std::string(magick_info->description));
911
912 if (!quiet())
913 throwExceptionExplicit(MagickCore::CorruptImageWarning,
914 "Unrecognized image magick type");
915
916 return(std::string());
917}
918
919std::string Magick::Image::formatExpression(const std::string expression)
920{
921 char
922 *text;
923
924 std::string
925 text_string;
926
927 GetPPException;
928 modifyImage();
929 text=InterpretImageProperties(imageInfo(),image(),expression.c_str(),
930 exceptionInfo);
931 if (text != (char *) NULL)
932 {
933 text_string=std::string(text);
934 text=DestroyString(text);
935 }
936 ThrowImageException;
937 return(text_string);
938}
939
940double Magick::Image::gamma(void) const
941{
942 return(constImage()->gamma);
943}
944
945Magick::Geometry Magick::Image::geometry(void) const
946{
947 if (constImage()->geometry)
948 return Geometry(constImage()->geometry);
949
950 if (!quiet())
951 throwExceptionExplicit(MagickCore::OptionWarning,
952 "Image does not contain a geometry");
953
954 return(Geometry());
955}
956
957void Magick::Image::gifDisposeMethod(
958 const MagickCore::DisposeType disposeMethod_)
959{
960 modifyImage();
961 image()->dispose=disposeMethod_;
962}
963
964MagickCore::DisposeType Magick::Image::gifDisposeMethod(void) const
965{
966 return(constImage()->dispose);
967}
968
969bool Magick::Image::hasChannel(const PixelChannel channel) const
970{
971 if (GetPixelChannelTraits(constImage(),channel) == UndefinedPixelTrait)
972 return(false);
973
974 if (channel == GreenPixelChannel || channel == BluePixelChannel)
975 return (GetPixelChannelOffset(constImage(),channel) == (ssize_t)channel);
976
977 return(true);
978}
979
980void Magick::Image::highlightColor(const Color color_)
981{
982 std::string
983 value;
984
985 value=color_;
986 artifact("compare:highlight-color",value);
987}
988
989void Magick::Image::iccColorProfile(const Magick::Blob &colorProfile_)
990{
991 profile("icc",colorProfile_);
992}
993
994Magick::Blob Magick::Image::iccColorProfile(void) const
995{
996 const StringInfo
997 *color_profile;
998
999 color_profile=GetImageProfile(constImage(),"icc");
1000 if (color_profile == (StringInfo *) NULL)
1001 return(Blob());
1002 return(Blob(GetStringInfoDatum(color_profile),GetStringInfoLength(
1003 color_profile)));
1004}
1005
1006void Magick::Image::interlaceType(const Magick::InterlaceType interlace_)
1007{
1008 modifyImage();
1009 image()->interlace=interlace_;
1010 options()->interlaceType(interlace_);
1011}
1012
1013Magick::InterlaceType Magick::Image::interlaceType(void) const
1014{
1015 return(constImage()->interlace);
1016}
1017
1018void Magick::Image::interpolate(const PixelInterpolateMethod interpolate_)
1019{
1020 modifyImage();
1021 image()->interpolate=interpolate_;
1022}
1023
1024Magick::PixelInterpolateMethod Magick::Image::interpolate(void) const
1025{
1026 return constImage()->interpolate;
1027}
1028
1029void Magick::Image::iptcProfile(const Magick::Blob &iptcProfile_)
1030{
1031 modifyImage();
1032 if (iptcProfile_.data() != 0)
1033 {
1034 StringInfo
1035 *iptc_profile;
1036
1037 iptc_profile=AcquireStringInfo(iptcProfile_.length());
1038 SetStringInfoDatum(iptc_profile,(unsigned char *) iptcProfile_.data());
1039 GetPPException;
1040 (void) SetImageProfile(image(),"iptc",iptc_profile,exceptionInfo);
1041 iptc_profile=DestroyStringInfo(iptc_profile);
1042 ThrowImageException;
1043 }
1044}
1045
1046Magick::Blob Magick::Image::iptcProfile(void) const
1047{
1048 const StringInfo
1049 *iptc_profile;
1050
1051 iptc_profile=GetImageProfile(constImage(),"iptc");
1052 if (iptc_profile == (StringInfo *) NULL)
1053 return(Blob());
1054 return(Blob(GetStringInfoDatum(iptc_profile),GetStringInfoLength(
1055 iptc_profile)));
1056}
1057
1058bool Magick::Image::isOpaque(void) const
1059{
1060 MagickBooleanType
1061 result;
1062
1063 GetPPException;
1064 result=IsImageOpaque(constImage(),exceptionInfo);
1065 ThrowImageException;
1066 return(result != MagickFalse ? true : false);
1067}
1068
1069void Magick::Image::isValid(const bool isValid_)
1070{
1071 if (!isValid_)
1072 {
1073 delete _imgRef;
1074 _imgRef=new ImageRef;
1075 }
1076 else if (!isValid())
1077 {
1078 // Construct with single-pixel black image to make
1079 // image valid. This is an obvious hack.
1080 size(Geometry(1,1));
1081 read("xc:black");
1082 }
1083}
1084
1085bool Magick::Image::isValid(void) const
1086{
1087 return rows() && columns();
1088}
1089
1090void Magick::Image::label(const std::string &label_)
1091{
1092 modifyImage();
1093 GetPPException;
1094 (void) SetImageProperty(image(),"Label",NULL,exceptionInfo);
1095 if (label_.length() > 0)
1096 (void) SetImageProperty(image(),"Label",label_.c_str(),exceptionInfo);
1097 ThrowImageException;
1098}
1099
1100std::string Magick::Image::label(void) const
1101{
1102 const char
1103 *value;
1104
1105 GetPPException;
1106 value=GetImageProperty(constImage(),"Label",exceptionInfo);
1107 ThrowImageException;
1108
1109 if (value)
1110 return(std::string(value));
1111
1112 return(std::string());
1113}
1114
1115void Magick::Image::lowlightColor(const Color color_)
1116{
1117 std::string
1118 value;
1119
1120 value=color_;
1121 artifact("compare:lowlight-color",value);
1122}
1123
1124void Magick::Image::magick(const std::string &magick_)
1125{
1126 size_t
1127 length;
1128
1129 modifyImage();
1130
1131 length=sizeof(image()->magick)-1;
1132 if (magick_.length() < length)
1133 length=magick_.length();
1134
1135 if (!magick_.empty())
1136 magick_.copy(image()->magick,length);
1137 image()->magick[length]=0;
1138
1139 options()->magick(magick_);
1140}
1141
1142std::string Magick::Image::magick(void) const
1143{
1144 if (*(constImage()->magick) != '\0')
1145 return(std::string(constImage()->magick));
1146
1147 return(constOptions()->magick());
1148}
1149
1150void Magick::Image::masklightColor(const Color color_)
1151{
1152 std::string
1153 value;
1154
1155 value=color_;
1156 artifact("compare:masklight-color",value);
1157}
1158
1159double Magick::Image::meanErrorPerPixel(void) const
1160{
1161 return(constImage()->error.mean_error_per_pixel);
1162}
1163
1164void Magick::Image::modulusDepth(const size_t depth_)
1165{
1166 modifyImage();
1167 GetPPException;
1168 SetImageDepth(image(),depth_,exceptionInfo);
1169 ThrowImageException;
1170 options()->depth(depth_);
1171}
1172
1173size_t Magick::Image::modulusDepth(void) const
1174{
1175 size_t
1176 depth;
1177
1178 GetPPException;
1179 depth=GetImageDepth(constImage(),exceptionInfo);
1180 ThrowImageException;
1181 return(depth);
1182}
1183
1184void Magick::Image::monochrome(const bool monochromeFlag_)
1185{
1186 modifyImage();
1187 options()->monochrome(monochromeFlag_);
1188}
1189
1190bool Magick::Image::monochrome(void) const
1191{
1192 return(constOptions()->monochrome());
1193}
1194
1195Magick::Geometry Magick::Image::montageGeometry(void) const
1196{
1197 if (constImage()->montage)
1198 return Magick::Geometry(constImage()->montage);
1199
1200 if (!quiet())
1201 throwExceptionExplicit(MagickCore::CorruptImageWarning,
1202 "Image does not contain a montage");
1203
1204 return(Magick::Geometry());
1205}
1206
1207double Magick::Image::normalizedMaxError(void) const
1208{
1209 return(constImage()->error.normalized_maximum_error);
1210}
1211
1212double Magick::Image::normalizedMeanError(void) const
1213{
1214 return(constImage()->error.normalized_mean_error);
1215}
1216
1217void Magick::Image::orientation(const Magick::OrientationType orientation_)
1218{
1219 modifyImage();
1220 image()->orientation=orientation_;
1221}
1222
1223Magick::OrientationType Magick::Image::orientation(void) const
1224{
1225 return(constImage()->orientation);
1226}
1227
1228void Magick::Image::page(const Magick::Geometry &pageSize_)
1229{
1230 modifyImage();
1231 options()->page(pageSize_);
1232 image()->page=pageSize_;
1233}
1234
1235Magick::Geometry Magick::Image::page(void) const
1236{
1237 return(Geometry(constImage()->page.width,constImage()->page.height,
1238 constImage()->page.x,constImage()->page.y));
1239}
1240
1241void Magick::Image::quality(const size_t quality_)
1242{
1243 modifyImage();
1244 image()->quality=quality_;
1245 options()->quality(quality_);
1246}
1247
1248size_t Magick::Image::quality(void) const
1249{
1250 return(constImage()->quality);
1251}
1252
1253void Magick::Image::quantizeColors(const size_t colors_)
1254{
1255 modifyImage();
1256 options()->quantizeColors(colors_);
1257}
1258
1259size_t Magick::Image::quantizeColors(void) const
1260{
1261 return(constOptions()->quantizeColors());
1262}
1263
1264void Magick::Image::quantizeColorSpace(
1265 const Magick::ColorspaceType colorSpace_)
1266{
1267 modifyImage();
1268 options()->quantizeColorSpace(colorSpace_);
1269}
1270
1271Magick::ColorspaceType Magick::Image::quantizeColorSpace(void) const
1272{
1273 return(constOptions()->quantizeColorSpace());
1274}
1275
1276void Magick::Image::quantizeDither(const bool ditherFlag_)
1277{
1278 modifyImage();
1279 options()->quantizeDither(ditherFlag_);
1280}
1281
1282bool Magick::Image::quantizeDither(void) const
1283{
1284 return(constOptions()->quantizeDither());
1285}
1286
1287void Magick::Image::quantizeDitherMethod(const DitherMethod ditherMethod_)
1288{
1289 modifyImage();
1290 options()->quantizeDitherMethod(ditherMethod_);
1291}
1292
1293MagickCore::DitherMethod Magick::Image::quantizeDitherMethod(void) const
1294{
1295 return(constOptions()->quantizeDitherMethod());
1296}
1297
1298void Magick::Image::quantizeTreeDepth(const size_t treeDepth_)
1299{
1300 modifyImage();
1301 options()->quantizeTreeDepth(treeDepth_);
1302}
1303
1304size_t Magick::Image::quantizeTreeDepth() const
1305{
1306 return(constOptions()->quantizeTreeDepth());
1307}
1308
1309void Magick::Image::quiet(const bool quiet_)
1310{
1311 modifyImage();
1312 options()->quiet(quiet_);
1313}
1314
1315bool Magick::Image::quiet(void) const
1316{
1317 return(constOptions()->quiet());
1318}
1319
1320void Magick::Image::renderingIntent(
1321 const Magick::RenderingIntent renderingIntent_)
1322{
1323 modifyImage();
1324 image()->rendering_intent=renderingIntent_;
1325}
1326
1327Magick::RenderingIntent Magick::Image::renderingIntent(void) const
1328{
1329 return(static_cast<Magick::RenderingIntent>(constImage()->rendering_intent));
1330}
1331
1332void Magick::Image::resolutionUnits(
1333 const Magick::ResolutionType resolutionUnits_)
1334{
1335 modifyImage();
1336 image()->units=resolutionUnits_;
1337 options()->resolutionUnits(resolutionUnits_);
1338}
1339
1340Magick::ResolutionType Magick::Image::resolutionUnits(void) const
1341{
1342 return(static_cast<Magick::ResolutionType>(constImage()->units));
1343}
1344
1345size_t Magick::Image::rows(void) const
1346{
1347 return(constImage()->rows);
1348}
1349
1350void Magick::Image::samplingFactor(const std::string &samplingFactor_)
1351{
1352 modifyImage();
1353 options()->samplingFactor(samplingFactor_);
1354}
1355
1356std::string Magick::Image::samplingFactor(void) const
1357{
1358 return(constOptions()->samplingFactor());
1359}
1360
1361void Magick::Image::scene(const size_t scene_)
1362{
1363 modifyImage();
1364 image()->scene=scene_;
1365}
1366
1367size_t Magick::Image::scene(void) const
1368{
1369 return(constImage()->scene);
1370}
1371
1372void Magick::Image::size(const Geometry &geometry_)
1373{
1374 modifyImage();
1375 options()->size(geometry_);
1376 image()->rows=geometry_.height();
1377 image()->columns=geometry_.width();
1378}
1379
1380Magick::Geometry Magick::Image::size(void) const
1381{
1382 return(Magick::Geometry(constImage()->columns,constImage()->rows));
1383}
1384
1385void Magick::Image::strokeAntiAlias(const bool flag_)
1386{
1387 modifyImage();
1388 options()->strokeAntiAlias(flag_);
1389}
1390
1391bool Magick::Image::strokeAntiAlias(void) const
1392{
1393 return(constOptions()->strokeAntiAlias());
1394}
1395
1396void Magick::Image::strokeColor(const Magick::Color &strokeColor_)
1397{
1398 std::string
1399 value;
1400
1401 modifyImage();
1402 options()->strokeColor(strokeColor_);
1403 value=strokeColor_;
1404 artifact("stroke",value);
1405}
1406
1407Magick::Color Magick::Image::strokeColor(void) const
1408{
1409 return(constOptions()->strokeColor());
1410}
1411
1412void Magick::Image::strokeDashArray(const double *strokeDashArray_)
1413{
1414 modifyImage();
1415 options()->strokeDashArray(strokeDashArray_);
1416}
1417
1418const double* Magick::Image::strokeDashArray(void) const
1419{
1420 return(constOptions()->strokeDashArray());
1421}
1422
1423void Magick::Image::strokeDashOffset(const double strokeDashOffset_)
1424{
1425 modifyImage();
1426 options()->strokeDashOffset(strokeDashOffset_);
1427}
1428
1429double Magick::Image::strokeDashOffset(void) const
1430{
1431 return(constOptions()->strokeDashOffset());
1432}
1433
1434void Magick::Image::strokeLineCap(const Magick::LineCap lineCap_)
1435{
1436 modifyImage();
1437 options()->strokeLineCap(lineCap_);
1438}
1439
1440Magick::LineCap Magick::Image::strokeLineCap(void) const
1441{
1442 return(constOptions()->strokeLineCap());
1443}
1444
1445void Magick::Image::strokeLineJoin(const Magick::LineJoin lineJoin_)
1446{
1447 modifyImage();
1448 options()->strokeLineJoin(lineJoin_);
1449}
1450
1451Magick::LineJoin Magick::Image::strokeLineJoin(void) const
1452{
1453 return(constOptions()->strokeLineJoin());
1454}
1455
1456void Magick::Image::strokeMiterLimit(const size_t strokeMiterLimit_)
1457{
1458 modifyImage();
1459 options()->strokeMiterLimit(strokeMiterLimit_);
1460}
1461
1462size_t Magick::Image::strokeMiterLimit(void) const
1463{
1464 return(constOptions()->strokeMiterLimit());
1465}
1466
1467void Magick::Image::strokePattern(const Image &strokePattern_)
1468{
1469 modifyImage();
1470 if(strokePattern_.isValid())
1471 options()->strokePattern(strokePattern_.constImage());
1472 else
1473 options()->strokePattern(static_cast<MagickCore::Image*>(NULL));
1474}
1475
1476Magick::Image Magick::Image::strokePattern(void) const
1477{
1478 // FIXME: This is inordinately inefficient
1479 const MagickCore::Image
1480 *tmpTexture;
1481
1482 Image
1483 texture;
1484
1485 tmpTexture=constOptions()->strokePattern();
1486
1487 if (tmpTexture)
1488 {
1489 MagickCore::Image
1490 *image;
1491
1492 GetPPException;
1493 image=CloneImage(tmpTexture,0,0,MagickTrue,exceptionInfo);
1494 texture.replaceImage(image);
1495 ThrowImageException;
1496 }
1497 return(texture);
1498}
1499
1500void Magick::Image::strokeWidth(const double strokeWidth_)
1501{
1502 char
1503 value[MagickPathExtent];
1504
1505 modifyImage();
1506 options()->strokeWidth(strokeWidth_);
1507 FormatLocaleString(value,MagickPathExtent,"%.17g",strokeWidth_);
1508 (void) SetImageArtifact(image(),"strokewidth",value);
1509}
1510
1511double Magick::Image::strokeWidth(void) const
1512{
1513 return(constOptions()->strokeWidth());
1514}
1515
1516void Magick::Image::subImage(const size_t subImage_)
1517{
1518 modifyImage();
1519 options()->subImage(subImage_);
1520}
1521
1522size_t Magick::Image::subImage(void) const
1523{
1524 return(constOptions()->subImage());
1525}
1526
1527void Magick::Image::subRange(const size_t subRange_)
1528{
1529 modifyImage();
1530 options()->subRange(subRange_);
1531}
1532
1533size_t Magick::Image::subRange(void) const
1534{
1535 return(constOptions()->subRange());
1536}
1537
1538void Magick::Image::textAntiAlias(const bool flag_)
1539{
1540 modifyImage();
1541 options()->textAntiAlias(flag_);
1542}
1543
1544bool Magick::Image::textAntiAlias(void) const
1545{
1546 return(constOptions()->textAntiAlias());
1547}
1548
1549void Magick::Image::textDirection(DirectionType direction_)
1550{
1551 modifyImage();
1552 options()->textDirection(direction_);
1553}
1554
1555Magick::DirectionType Magick::Image::textDirection(void) const
1556{
1557 return(constOptions()->textDirection());
1558}
1559
1560void Magick::Image::textEncoding(const std::string &encoding_)
1561{
1562 modifyImage();
1563 options()->textEncoding(encoding_);
1564}
1565
1566std::string Magick::Image::textEncoding(void) const
1567{
1568 return(constOptions()->textEncoding());
1569}
1570
1571void Magick::Image::textGravity(GravityType gravity_)
1572{
1573 modifyImage();
1574 options()->textGravity(gravity_);
1575}
1576
1577Magick::GravityType Magick::Image::textGravity(void) const
1578{
1579 return(constOptions()->textGravity());
1580}
1581
1582void Magick::Image::textInterlineSpacing(double spacing_)
1583{
1584 modifyImage();
1585 options()->textInterlineSpacing(spacing_);
1586}
1587
1588double Magick::Image::textInterlineSpacing(void) const
1589{
1590 return(constOptions()->textInterlineSpacing());
1591}
1592
1593void Magick::Image::textInterwordSpacing(double spacing_)
1594{
1595 modifyImage();
1596 options()->textInterwordSpacing(spacing_);
1597}
1598
1599double Magick::Image::textInterwordSpacing(void) const
1600{
1601 return(constOptions()->textInterwordSpacing());
1602}
1603
1604void Magick::Image::textKerning(double kerning_)
1605{
1606 modifyImage();
1607 options()->textKerning(kerning_);
1608}
1609
1610double Magick::Image::textKerning(void) const
1611{
1612 return(constOptions()->textKerning());
1613}
1614
1615void Magick::Image::textUnderColor(const Color &underColor_)
1616{
1617 modifyImage();
1618 options()->textUnderColor(underColor_);
1619}
1620
1621Magick::Color Magick::Image::textUnderColor(void) const
1622{
1623 return(constOptions()->textUnderColor());
1624}
1625
1626size_t Magick::Image::totalColors(void) const
1627{
1628 size_t
1629 colors;
1630
1631 GetPPException;
1632 colors=GetNumberColors(constImage(),(FILE *) NULL,exceptionInfo);
1633 ThrowImageException;
1634 return colors;
1635}
1636
1637void Magick::Image::transformRotation(const double angle_)
1638{
1639 modifyImage();
1640 options()->transformRotation(angle_);
1641}
1642
1643void Magick::Image::transformSkewX(const double skewx_)
1644{
1645 modifyImage();
1646 options()->transformSkewX(skewx_);
1647}
1648
1649void Magick::Image::transformSkewY(const double skewy_)
1650{
1651 modifyImage();
1652 options()->transformSkewY(skewy_);
1653}
1654
1655Magick::ImageType Magick::Image::type(void) const
1656{
1657 if (constOptions()->type() != UndefinedType)
1658 return(constOptions()->type());
1659 return(GetImageType(constImage()));
1660}
1661
1662void Magick::Image::type(const Magick::ImageType type_)
1663{
1664 modifyImage();
1665 options()->type(type_);
1666 GetPPException;
1667 SetImageType(image(),type_,exceptionInfo);
1668 ThrowImageException;
1669}
1670
1671void Magick::Image::verbose(const bool verboseFlag_)
1672{
1673 modifyImage();
1674 options()->verbose(verboseFlag_);
1675}
1676
1677bool Magick::Image::verbose(void) const
1678{
1679 return(constOptions()->verbose());
1680}
1681
1682void Magick::Image::virtualPixelMethod(
1683 const VirtualPixelMethod virtualPixelMethod_)
1684{
1685 modifyImage();
1686 GetPPException;
1687 SetImageVirtualPixelMethod(image(),virtualPixelMethod_,exceptionInfo);
1688 ThrowImageException;
1689}
1690
1691Magick::VirtualPixelMethod Magick::Image::virtualPixelMethod(void) const
1692{
1693 return(GetImageVirtualPixelMethod(constImage()));
1694}
1695
1696void Magick::Image::x11Display(const std::string &display_)
1697{
1698 modifyImage();
1699 options()->x11Display(display_);
1700}
1701
1702std::string Magick::Image::x11Display(void) const
1703{
1704 return(constOptions()->x11Display());
1705}
1706
1707double Magick::Image::xResolution(void) const
1708{
1709 return(constImage()->resolution.x);
1710}
1711
1712double Magick::Image::yResolution(void) const
1713{
1714 return(constImage()->resolution.y);
1715}
1716
1717void Magick::Image::adaptiveBlur(const double radius_,const double sigma_)
1718{
1719 MagickCore::Image
1720 *newImage;
1721
1722 GetPPException;
1723 newImage=AdaptiveBlurImage(constImage(),radius_,sigma_,exceptionInfo);
1724 replaceImage(newImage);
1725 ThrowImageException;
1726}
1727
1728void Magick::Image::adaptiveResize(const Geometry &geometry_)
1729{
1730 MagickCore::Image
1731 *newImage;
1732
1733 size_t
1734 height=rows(),
1735 width=columns();
1736
1737 ssize_t
1738 x=0,
1739 y=0;
1740
1741 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
1742 &height);
1743
1744 GetPPException;
1745 newImage=AdaptiveResizeImage(constImage(),width,height,exceptionInfo);
1746 replaceImage(newImage);
1747 ThrowImageException;
1748}
1749
1750void Magick::Image::adaptiveSharpen(const double radius_,const double sigma_)
1751{
1752 MagickCore::Image
1753 *newImage;
1754
1755 GetPPException;
1756 newImage=AdaptiveSharpenImage(constImage(),radius_,sigma_,exceptionInfo);
1757 replaceImage(newImage);
1758 ThrowImageException;
1759}
1760
1761void Magick::Image::adaptiveSharpenChannel(const ChannelType channel_,
1762 const double radius_,const double sigma_ )
1763{
1764 MagickCore::Image
1765 *newImage;
1766
1767 GetPPException;
1768 GetAndSetPPChannelMask(channel_);
1769 newImage=AdaptiveSharpenImage(constImage(),radius_,sigma_,exceptionInfo);
1770 RestorePPChannelMask;
1771 replaceImage(newImage);
1772 ThrowImageException;
1773}
1774
1775void Magick::Image::adaptiveThreshold(const size_t width_,const size_t height_,
1776 const double bias_)
1777{
1778
1779 MagickCore::Image
1780 *newImage;
1781
1782 GetPPException;
1783 newImage=AdaptiveThresholdImage(constImage(),width_,height_,bias_,
1784 exceptionInfo);
1785 replaceImage(newImage);
1786 ThrowImageException;
1787}
1788
1789void Magick::Image::addNoise(const NoiseType noiseType_,const double attenuate_)
1790{
1791 MagickCore::Image
1792 *newImage;
1793
1794 GetPPException;
1795 newImage=AddNoiseImage(constImage(),noiseType_,attenuate_,exceptionInfo);
1796 replaceImage(newImage);
1797 ThrowImageException;
1798}
1799
1800void Magick::Image::addNoiseChannel(const ChannelType channel_,
1801 const NoiseType noiseType_,const double attenuate_)
1802{
1803 MagickCore::Image
1804 *newImage;
1805
1806 GetPPException;
1807 GetAndSetPPChannelMask(channel_);
1808 newImage=AddNoiseImage(constImage(),noiseType_,attenuate_,exceptionInfo);
1809 RestorePPChannelMask;
1810 replaceImage(newImage);
1811 ThrowImageException;
1812}
1813
1814void Magick::Image::affineTransform(const DrawableAffine &affine_)
1815{
1816 AffineMatrix
1817 _affine;
1818
1819 MagickCore::Image
1820 *newImage;
1821
1822 _affine.sx=affine_.sx();
1823 _affine.sy=affine_.sy();
1824 _affine.rx=affine_.rx();
1825 _affine.ry=affine_.ry();
1826 _affine.tx=affine_.tx();
1827 _affine.ty=affine_.ty();
1828
1829 GetPPException;
1830 newImage=AffineTransformImage(constImage(),&_affine,exceptionInfo);
1831 replaceImage(newImage);
1832 ThrowImageException;
1833}
1834
1835void Magick::Image::alpha(const unsigned int alpha_)
1836{
1837 modifyImage();
1838 GetPPException;
1839 SetImageAlpha(image(),(Quantum) alpha_,exceptionInfo);
1840 ThrowImageException;
1841}
1842
1843void Magick::Image::alphaChannel(AlphaChannelOption alphaOption_)
1844{
1845 modifyImage();
1846 GetPPException;
1847 SetImageAlphaChannel(image(),alphaOption_,exceptionInfo);
1848 ThrowImageException;
1849}
1850
1851void Magick::Image::annotate(const std::string &text_,
1852 const Geometry &location_)
1853{
1854 annotate(text_,location_,NorthWestGravity,0.0);
1855}
1856
1857void Magick::Image::annotate(const std::string &text_,
1858 const Geometry &boundingArea_,const GravityType gravity_)
1859{
1860 annotate(text_,boundingArea_,gravity_,0.0);
1861}
1862
1863void Magick::Image::annotate(const std::string &text_,
1864 const Geometry &boundingArea_,const GravityType gravity_,
1865 const double degrees_)
1866{
1867 AffineMatrix
1868 oaffine;
1869
1870 char
1871 boundingArea[MagickPathExtent];
1872
1873 DrawInfo
1874 *drawInfo;
1875
1876 modifyImage();
1877
1878 drawInfo=options()->drawInfo();
1879 drawInfo->text=DestroyString(drawInfo->text);
1880 drawInfo->text=const_cast<char *>(text_.c_str());
1881 drawInfo->geometry=DestroyString(drawInfo->geometry);
1882
1883 if (boundingArea_.isValid())
1884 {
1885 if (boundingArea_.width() == 0 || boundingArea_.height() == 0)
1886 {
1887 FormatLocaleString(boundingArea,MagickPathExtent,"%+.20g%+.20g",
1888 (double) boundingArea_.xOff(),(double) boundingArea_.yOff());
1889 }
1890 else
1891 {
1892 (void) CopyMagickString(boundingArea,
1893 std::string(boundingArea_).c_str(), MagickPathExtent);
1894 }
1895 drawInfo->geometry=boundingArea;
1896 }
1897
1898 drawInfo->gravity=gravity_;
1899
1900 oaffine=drawInfo->affine;
1901 if (degrees_ != 0.0)
1902 {
1903 AffineMatrix
1904 affine,
1905 current;
1906
1907 affine.sx=1.0;
1908 affine.rx=0.0;
1909 affine.ry=0.0;
1910 affine.sy=1.0;
1911 affine.tx=0.0;
1912 affine.ty=0.0;
1913
1914 current=drawInfo->affine;
1915 affine.sx=cos(DegreesToRadians(fmod(degrees_,360.0)));
1916 affine.rx=sin(DegreesToRadians(fmod(degrees_,360.0)));
1917 affine.ry=(-sin(DegreesToRadians(fmod(degrees_,360.0))));
1918 affine.sy=cos(DegreesToRadians(fmod(degrees_,360.0)));
1919
1920 drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
1921 drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
1922 drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
1923 drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
1924 drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty
1925 +current.tx;
1926 }
1927
1928 GetPPException;
1929 AnnotateImage(image(),drawInfo,exceptionInfo);
1930
1931 // Restore original values
1932 drawInfo->affine=oaffine;
1933 drawInfo->text=(char *) NULL;
1934 drawInfo->geometry=(char *) NULL;
1935
1936 ThrowImageException;
1937}
1938
1939void Magick::Image::annotate(const std::string &text_,
1940 const GravityType gravity_)
1941{
1942 DrawInfo
1943 *drawInfo;
1944
1945 modifyImage();
1946
1947 drawInfo=options()->drawInfo();
1948 drawInfo->text=DestroyString(drawInfo->text);
1949 drawInfo->text=const_cast<char *>(text_.c_str());
1950 drawInfo->gravity=gravity_;
1951
1952 GetPPException;
1953 AnnotateImage(image(),drawInfo,exceptionInfo);
1954
1955 drawInfo->gravity=NorthWestGravity;
1956 drawInfo->text=(char *) NULL;
1957
1958 ThrowImageException;
1959}
1960
1961void Magick::Image::artifact(const std::string &name_,const std::string &value_)
1962{
1963 modifyImage();
1964 (void) SetImageArtifact(image(),name_.c_str(),value_.c_str());
1965}
1966
1967std::string Magick::Image::artifact(const std::string &name_) const
1968{
1969 const char
1970 *value;
1971
1972 value=GetImageArtifact(constImage(),name_.c_str());
1973 if (value)
1974 return(std::string(value));
1975 return(std::string());
1976}
1977
1978void Magick::Image::attribute(const std::string name_,const char *value_)
1979{
1980 modifyImage();
1981 GetPPException;
1982 SetImageProperty(image(),name_.c_str(),value_,exceptionInfo);
1983 ThrowImageException;
1984}
1985
1986void Magick::Image::attribute(const std::string name_,const std::string value_)
1987{
1988 modifyImage();
1989 GetPPException;
1990 SetImageProperty(image(),name_.c_str(),value_.c_str(),exceptionInfo);
1991 ThrowImageException;
1992}
1993
1994std::string Magick::Image::attribute(const std::string name_) const
1995{
1996 const char
1997 *value;
1998
1999 GetPPException;
2000 value=GetImageProperty(constImage(),name_.c_str(),exceptionInfo);
2001 ThrowImageException;
2002
2003 if (value)
2004 return(std::string(value));
2005
2006 return(std::string()); // Intentionally no exception
2007}
2008
2009void Magick::Image::autoGamma(void)
2010{
2011 modifyImage();
2012 GetPPException;
2013 (void) SyncImageSettings(imageInfo(),image(),exceptionInfo);
2014 (void) AutoGammaImage(image(),exceptionInfo);
2015 ThrowImageException;
2016}
2017
2018void Magick::Image::autoGammaChannel(const ChannelType channel_)
2019{
2020 modifyImage();
2021 GetPPException;
2022 GetAndSetPPChannelMask(channel_);
2023 (void) SyncImageSettings(imageInfo(),image(),exceptionInfo);
2024 (void) AutoGammaImage(image(),exceptionInfo);
2025 RestorePPChannelMask;
2026 ThrowImageException;
2027}
2028
2029void Magick::Image::autoLevel(void)
2030{
2031 modifyImage();
2032 GetPPException;
2033 (void) AutoLevelImage(image(),exceptionInfo);
2034 ThrowImageException;
2035}
2036
2037void Magick::Image::autoLevelChannel(const ChannelType channel_)
2038{
2039 modifyImage();
2040 GetPPException;
2041 GetAndSetPPChannelMask(channel_);
2042 (void) AutoLevelImage(image(),exceptionInfo);
2043 RestorePPChannelMask;
2044 ThrowImageException;
2045}
2046
2047void Magick::Image::autoOrient(void)
2048{
2049 MagickCore::Image
2050 *newImage;
2051
2052 if (image()->orientation == UndefinedOrientation ||
2053 image()->orientation == TopLeftOrientation)
2054 return;
2055
2056 GetPPException;
2057 newImage=AutoOrientImage(constImage(),image()->orientation,exceptionInfo);
2058 replaceImage(newImage);
2059 ThrowImageException;
2060}
2061
2062void Magick::Image::autoThreshold(const AutoThresholdMethod method_)
2063{
2064 modifyImage();
2065 GetPPException;
2066 AutoThresholdImage(image(),method_, exceptionInfo);
2067 ThrowImageException;
2068}
2069
2070void Magick::Image::blackThreshold(const std::string &threshold_)
2071{
2072 modifyImage();
2073 GetPPException;
2074 BlackThresholdImage(image(),threshold_.c_str(),exceptionInfo);
2075 ThrowImageException;
2076}
2077
2078void Magick::Image::blackThresholdChannel(const ChannelType channel_,
2079 const std::string &threshold_)
2080{
2081 modifyImage();
2082 GetPPException;
2083 GetAndSetPPChannelMask(channel_);
2084 BlackThresholdImage(image(),threshold_.c_str(),exceptionInfo);
2085 RestorePPChannelMask;
2086 ThrowImageException;
2087}
2088
2089void Magick::Image::blueShift(const double factor_)
2090{
2091 MagickCore::Image
2092 *newImage;
2093
2094 GetPPException;
2095 newImage=BlueShiftImage(constImage(),factor_,exceptionInfo);
2096 replaceImage(newImage);
2097 ThrowImageException;
2098}
2099
2100void Magick::Image::blur(const double radius_,const double sigma_)
2101{
2102 MagickCore::Image
2103 *newImage;
2104
2105 GetPPException;
2106 newImage=BlurImage(constImage(),radius_,sigma_,exceptionInfo);
2107 replaceImage(newImage);
2108 ThrowImageException;
2109}
2110
2111void Magick::Image::blurChannel(const ChannelType channel_,
2112 const double radius_,const double sigma_)
2113{
2114 MagickCore::Image
2115 *newImage;
2116
2117 GetPPException;
2118 GetAndSetPPChannelMask(channel_);
2119 newImage=BlurImage(constImage(),radius_,sigma_,exceptionInfo);
2120 RestorePPChannelMask;
2121 replaceImage(newImage);
2122 ThrowImageException;
2123}
2124
2125void Magick::Image::border(const Geometry &geometry_)
2126{
2127 MagickCore::Image
2128 *newImage;
2129
2130 RectangleInfo
2131 borderInfo=geometry_;
2132
2133 GetPPException;
2134 newImage=BorderImage(constImage(),&borderInfo,image()->compose,
2135 exceptionInfo);
2136 replaceImage(newImage);
2137 ThrowImageException;
2138}
2139
2140void Magick::Image::brightnessContrast(const double brightness_,
2141 const double contrast_)
2142{
2143 modifyImage();
2144 GetPPException;
2145 BrightnessContrastImage(image(),brightness_,contrast_,exceptionInfo);
2146 ThrowImageException;
2147}
2148
2149void Magick::Image::brightnessContrastChannel(const ChannelType channel_,
2150 const double brightness_,const double contrast_)
2151{
2152 modifyImage();
2153 GetPPException;
2154 GetAndSetPPChannelMask(channel_);
2155 BrightnessContrastImage(image(),brightness_,contrast_,exceptionInfo);
2156 RestorePPChannelMask;
2157 ThrowImageException;
2158}
2159
2160void Magick::Image::cannyEdge(const double radius_,const double sigma_,
2161 const double lowerPercent_,const double upperPercent_)
2162{
2163 MagickCore::Image
2164 *newImage;
2165
2166 modifyImage();
2167 GetPPException;
2168 newImage=CannyEdgeImage(constImage(),radius_,sigma_,lowerPercent_,
2169 upperPercent_,exceptionInfo);
2170 replaceImage(newImage);
2171 ThrowImageException;
2172}
2173
2174void Magick::Image::cdl(const std::string &cdl_)
2175{
2176 modifyImage();
2177 GetPPException;
2178 (void) ColorDecisionListImage(image(),cdl_.c_str(),exceptionInfo);
2179 ThrowImageException;
2180}
2181
2182void Magick::Image::channel(const ChannelType channel_)
2183{
2184 MagickCore::Image
2185 *newImage;
2186
2187 GetPPException;
2188 newImage=SeparateImage(constImage(),channel_,exceptionInfo);
2189 replaceImage(newImage);
2190 ThrowImageException;
2191}
2192
2193void Magick::Image::charcoal(const double radius_,const double sigma_)
2194{
2195 MagickCore::Image
2196 *newImage;
2197
2198 GetPPException;
2199 newImage=CharcoalImage(image(),radius_,sigma_,exceptionInfo);
2200 replaceImage(newImage);
2201 ThrowImageException;
2202}
2203
2204void Magick::Image::charcoalChannel(const ChannelType channel_,
2205 const double radius_,const double sigma_)
2206{
2207 MagickCore::Image
2208 *newImage;
2209
2210 GetPPException;
2211 GetAndSetPPChannelMask(channel_);
2212 newImage=CharcoalImage(image(),radius_,sigma_,exceptionInfo);
2213 RestorePPChannelMask;
2214 replaceImage(newImage);
2215 ThrowImageException;
2216}
2217
2218void Magick::Image::chop(const Geometry &geometry_)
2219{
2220 MagickCore::Image
2221 *newImage;
2222
2223 RectangleInfo
2224 chopInfo=geometry_;
2225
2226 GetPPException;
2227 newImage=ChopImage(image(),&chopInfo,exceptionInfo);
2228 replaceImage(newImage);
2229 ThrowImageException;
2230}
2231
2232void Magick::Image::chromaBluePrimary(const double x_,const double y_,
2233 const double z_)
2234{
2235 modifyImage();
2236 image()->chromaticity.blue_primary.x=x_;
2237 image()->chromaticity.blue_primary.y=y_;
2238 image()->chromaticity.blue_primary.z=z_;
2239}
2240
2241void Magick::Image::chromaBluePrimary(double *x_,double *y_,double *z_) const
2242{
2243 *x_=constImage()->chromaticity.blue_primary.x;
2244 *y_=constImage()->chromaticity.blue_primary.y;
2245 *z_=constImage()->chromaticity.blue_primary.z;
2246}
2247
2248void Magick::Image::chromaGreenPrimary(const double x_,const double y_,
2249 const double z_)
2250{
2251 modifyImage();
2252 image()->chromaticity.green_primary.x=x_;
2253 image()->chromaticity.green_primary.y=y_;
2254 image()->chromaticity.green_primary.z=z_;
2255}
2256
2257void Magick::Image::chromaGreenPrimary(double *x_,double *y_,double *z_) const
2258{
2259 *x_=constImage()->chromaticity.green_primary.x;
2260 *y_=constImage()->chromaticity.green_primary.y;
2261 *z_=constImage()->chromaticity.green_primary.z;
2262}
2263
2264void Magick::Image::chromaRedPrimary(const double x_,const double y_,
2265 const double z_)
2266{
2267 modifyImage();
2268 image()->chromaticity.red_primary.x=x_;
2269 image()->chromaticity.red_primary.y=y_;
2270 image()->chromaticity.red_primary.z=z_;
2271}
2272
2273void Magick::Image::chromaRedPrimary(double *x_,double *y_,double *z_) const
2274{
2275 *x_=constImage()->chromaticity.red_primary.x;
2276 *y_=constImage()->chromaticity.red_primary.y;
2277 *z_=constImage()->chromaticity.red_primary.z;
2278}
2279
2280void Magick::Image::chromaWhitePoint(const double x_,const double y_,
2281 const double z_)
2282{
2283 modifyImage();
2284 image()->chromaticity.white_point.x=x_;
2285 image()->chromaticity.white_point.y=y_;
2286 image()->chromaticity.white_point.z=z_;
2287}
2288
2289void Magick::Image::chromaWhitePoint(double *x_,double *y_,double *z_) const
2290{
2291 *x_=constImage()->chromaticity.white_point.x;
2292 *y_=constImage()->chromaticity.white_point.y;
2293 *z_=constImage()->chromaticity.white_point.z;
2294}
2295
2296void Magick::Image::clamp(void)
2297{
2298 modifyImage();
2299 GetPPException;
2300 ClampImage(image(),exceptionInfo);
2301 ThrowImageException;
2302}
2303
2304void Magick::Image::clampChannel(const ChannelType channel_)
2305{
2306 modifyImage();
2307 GetPPException;
2308 GetAndSetPPChannelMask(channel_);
2309 ClampImage(image(),exceptionInfo);
2310 RestorePPChannelMask;
2311 ThrowImageException;
2312}
2313
2314void Magick::Image::clip(void)
2315{
2316 modifyImage();
2317 GetPPException;
2318 ClipImage(image(),exceptionInfo);
2319 ThrowImageException;
2320}
2321
2322void Magick::Image::clipPath(const std::string pathname_,const bool inside_)
2323{
2324 modifyImage();
2325 GetPPException;
2326 ClipImagePath(image(),pathname_.c_str(),(MagickBooleanType) inside_,
2327 exceptionInfo);
2328 ThrowImageException;
2329}
2330
2331void Magick::Image::clut(const Image &clutImage_,
2332 const PixelInterpolateMethod method)
2333{
2334 modifyImage();
2335 GetPPException;
2336 ClutImage(image(),clutImage_.constImage(),method,exceptionInfo);
2337 ThrowImageException;
2338}
2339
2340void Magick::Image::clutChannel(const ChannelType channel_,
2341 const Image &clutImage_,const PixelInterpolateMethod method)
2342{
2343 modifyImage();
2344 GetPPException;
2345 GetAndSetPPChannelMask(channel_);
2346 ClutImage(image(),clutImage_.constImage(),method,exceptionInfo);
2347 RestorePPChannelMask;
2348 ThrowImageException;
2349}
2350
2351void Magick::Image::colorize(const unsigned int alpha_,const Color &penColor_)
2352{
2353 colorize(alpha_,alpha_,alpha_,penColor_);
2354}
2355
2356void Magick::Image::colorize(const unsigned int alphaRed_,
2357 const unsigned int alphaGreen_,const unsigned int alphaBlue_,
2358 const Color &penColor_)
2359{
2360 char
2361 blend[MagickPathExtent];
2362
2363 MagickCore::Image
2364 *newImage;
2365
2366 PixelInfo
2367 target;
2368
2369 if (!penColor_.isValid())
2370 throwExceptionExplicit(MagickCore::OptionError,
2371 "Pen color argument is invalid");
2372
2373 FormatLocaleString(blend,MagickPathExtent,"%u/%u/%u",alphaRed_,alphaGreen_,
2374 alphaBlue_);
2375
2376 target=static_cast<PixelInfo>(penColor_);
2377 GetPPException;
2378 newImage=ColorizeImage(image(),blend,&target,exceptionInfo);
2379 replaceImage(newImage);
2380 ThrowImageException;
2381}
2382
2383void Magick::Image::colorMap(const size_t index_,const Color &color_)
2384{
2385 MagickCore::Image
2386 *imageptr;
2387
2388 imageptr=image();
2389
2390 if (index_ > (MaxColormapSize-1))
2391 throwExceptionExplicit(MagickCore::OptionError,
2392 "Colormap index must be less than MaxColormapSize");
2393
2394 if (!color_.isValid())
2395 throwExceptionExplicit(MagickCore::OptionError,
2396 "Color argument is invalid");
2397
2398 modifyImage();
2399
2400 // Ensure that colormap size is large enough
2401 if (colorMapSize() < (index_+1))
2402 colorMapSize(index_+1);
2403
2404 // Set color at index in colormap
2405 (imageptr->colormap)[index_]=color_;
2406}
2407
2408Magick::Color Magick::Image::colorMap(const size_t index_) const
2409{
2410 if (!constImage()->colormap)
2411 {
2412 throwExceptionExplicit(MagickCore::OptionError,
2413 "Image does not contain a colormap");
2414 return(Color());
2415 }
2416
2417 if (index_ > constImage()->colors-1)
2418 throwExceptionExplicit(MagickCore::OptionError,"Index out of range");
2419
2420 return(Magick::Color((constImage()->colormap)[index_]));
2421}
2422
2423void Magick::Image::colorMatrix(const size_t order_,
2424 const double *color_matrix_)
2425{
2426 KernelInfo
2427 *kernel_info;
2428
2429 GetPPException;
2430 kernel_info=AcquireKernelInfo((const char *) NULL,exceptionInfo);
2431 if (kernel_info != (KernelInfo *) NULL)
2432 {
2433 kernel_info->width=order_;
2434 kernel_info->height=order_;
2435 kernel_info->values=(MagickRealType *) AcquireAlignedMemory(order_,
2436 order_*sizeof(*kernel_info->values));
2437 if (kernel_info->values != (MagickRealType *) NULL)
2438 {
2439 MagickCore::Image
2440 *newImage;
2441
2442 for (ssize_t i=0; i < (ssize_t) (order_*order_); i++)
2443 kernel_info->values[i]=color_matrix_[i];
2444 newImage=ColorMatrixImage(image(),kernel_info,exceptionInfo);
2445 replaceImage(newImage);
2446 }
2447 kernel_info=DestroyKernelInfo(kernel_info);
2448 }
2449 ThrowImageException;
2450}
2451
2452bool Magick::Image::compare(const Image &reference_) const
2453{
2454 bool
2455 status;
2456
2457 Image
2458 ref=reference_;
2459
2460 GetPPException;
2461 status=static_cast<bool>(IsImagesEqual(constImage(),ref.constImage(),
2462 exceptionInfo));
2463 ThrowImageException;
2464 return(status);
2465}
2466
2467double Magick::Image::compare(const Image &reference_,const MetricType metric_)
2468{
2469 double
2470 distortion=0.0;
2471
2472 GetPPException;
2473 GetImageDistortion(image(),reference_.constImage(),metric_,&distortion,
2474 exceptionInfo);
2475 ThrowImageException;
2476 return(distortion);
2477}
2478
2479double Magick::Image::compareChannel(const ChannelType channel_,
2480 const Image &reference_,const MetricType metric_)
2481{
2482 double
2483 distortion=0.0;
2484
2485 GetPPException;
2486 GetAndSetPPChannelMask(channel_);
2487 GetImageDistortion(image(),reference_.constImage(),metric_,&distortion,
2488 exceptionInfo);
2489 RestorePPChannelMask;
2490 ThrowImageException;
2491 return(distortion);
2492}
2493
2494Magick::Image Magick::Image::compare(const Image &reference_,
2495 const MetricType metric_,double *distortion)
2496{
2497 MagickCore::Image
2498 *newImage;
2499
2500 GetPPException;
2501 newImage=CompareImages(image(),reference_.constImage(),metric_,distortion,
2502 exceptionInfo);
2503 ThrowImageException;
2504 if (newImage == (MagickCore::Image *) NULL)
2505 return(Magick::Image());
2506 else
2507 return(Magick::Image(newImage));
2508}
2509
2510Magick::Image Magick::Image::compareChannel(const ChannelType channel_,
2511 const Image &reference_,const MetricType metric_,double *distortion)
2512{
2513 MagickCore::Image
2514 *newImage;
2515
2516 GetPPException;
2517 GetAndSetPPChannelMask(channel_);
2518 newImage=CompareImages(image(),reference_.constImage(),metric_,distortion,
2519 exceptionInfo);
2520 RestorePPChannelMask;
2521 ThrowImageException;
2522 if (newImage == (MagickCore::Image *) NULL)
2523 return(Magick::Image());
2524 else
2525 return(Magick::Image(newImage));
2526}
2527
2528void Magick::Image::composite(const Image &compositeImage_,
2529 const Geometry &offset_,const CompositeOperator compose_)
2530{
2531 size_t
2532 height=rows(),
2533 width=columns();
2534
2535 ssize_t
2536 x=offset_.xOff(),
2537 y=offset_.yOff();
2538
2539 ParseMetaGeometry(static_cast<std::string>(offset_).c_str(),&x,&y,&width,
2540 &height);
2541
2542 modifyImage();
2543 GetPPException;
2544 CompositeImage(image(),compositeImage_.constImage(),compose_,MagickTrue,
2545 x,y,exceptionInfo);
2546 ThrowImageException;
2547}
2548
2549void Magick::Image::composite(const Image &compositeImage_,
2550 const GravityType gravity_,const CompositeOperator compose_)
2551{
2552 RectangleInfo
2553 geometry;
2554
2555 modifyImage();
2556 SetGeometry(compositeImage_.constImage(),&geometry);
2557 GravityAdjustGeometry(columns(),rows(),gravity_,&geometry);
2558
2559 GetPPException;
2560 CompositeImage(image(),compositeImage_.constImage(),compose_,MagickTrue,
2561 geometry.x,geometry.y,exceptionInfo);
2562 ThrowImageException;
2563}
2564
2565void Magick::Image::composite(const Image &compositeImage_,
2566 const ssize_t xOffset_,const ssize_t yOffset_,
2567 const CompositeOperator compose_)
2568{
2569 // Image supplied as compositeImage is composited with current image and
2570 // results in updating current image.
2571 modifyImage();
2572 GetPPException;
2573 CompositeImage(image(),compositeImage_.constImage(),compose_,MagickTrue,
2574 xOffset_,yOffset_,exceptionInfo);
2575 ThrowImageException;
2576}
2577
2578void Magick::Image::connectedComponents(const size_t connectivity_)
2579{
2580 MagickCore::Image
2581 *newImage;
2582
2583 GetPPException;
2584 newImage=ConnectedComponentsImage(constImage(),connectivity_,
2585 (CCObjectInfo **) NULL,exceptionInfo);
2586 replaceImage(newImage);
2587 ThrowImageException;
2588}
2589
2590void Magick::Image::contrast(const bool sharpen_)
2591{
2592 modifyImage();
2593 GetPPException;
2594 ContrastImage(image(),(MagickBooleanType) sharpen_,exceptionInfo);
2595 ThrowImageException;
2596}
2597
2598void Magick::Image::contrastStretch(const double blackPoint_,
2599 const double whitePoint_)
2600{
2601 modifyImage();
2602 GetPPException;
2603 ContrastStretchImage(image(),blackPoint_,whitePoint_,exceptionInfo);
2604 ThrowImageException;
2605}
2606
2607void Magick::Image::contrastStretchChannel(const ChannelType channel_,
2608 const double blackPoint_,const double whitePoint_)
2609{
2610 modifyImage();
2611 GetPPException;
2612 GetAndSetPPChannelMask(channel_);
2613 ContrastStretchImage(image(),blackPoint_,whitePoint_,exceptionInfo);
2614 RestorePPChannelMask;
2615 ThrowImageException;
2616}
2617
2618void Magick::Image::convolve(const size_t order_,const double *kernel_)
2619{
2620 KernelInfo
2621 *kernel_info;
2622
2623 GetPPException;
2624 kernel_info=AcquireKernelInfo((const char *) NULL,exceptionInfo);
2625 kernel_info->width=order_;
2626 kernel_info->height=order_;
2627 kernel_info->x=(ssize_t) (order_-1)/2;
2628 kernel_info->y=(ssize_t) (order_-1)/2;
2629 kernel_info->values=(MagickRealType *) AcquireAlignedMemory(order_,
2630 order_*sizeof(*kernel_info->values));
2631 if (kernel_info->values != (MagickRealType *) NULL)
2632 {
2633 MagickCore::Image
2634 *newImage;
2635
2636 for (ssize_t i=0; i < (ssize_t) (order_*order_); i++)
2637 kernel_info->values[i]=kernel_[i];
2638 newImage=ConvolveImage(image(),kernel_info,exceptionInfo);
2639 replaceImage(newImage);
2640 }
2641 kernel_info=DestroyKernelInfo(kernel_info);
2642 ThrowImageException;
2643}
2644
2645void Magick::Image::copyPixels(const Image &source_,const Geometry &geometry_,
2646 const Offset &offset_)
2647{
2648 const OffsetInfo
2649 offset=offset_;
2650
2651 const RectangleInfo
2652 geometry=geometry_;
2653
2654 GetPPException;
2655 (void) CopyImagePixels(image(),source_.constImage(),&geometry,&offset,
2656 exceptionInfo);
2657 ThrowImageException;
2658}
2659
2660void Magick::Image::crop(const Geometry &geometry_)
2661{
2662 MagickCore::Image
2663 *newImage;
2664
2665 RectangleInfo
2666 cropInfo=geometry_;
2667
2668 GetPPException;
2669 newImage=CropImage(constImage(),&cropInfo,exceptionInfo);
2670 replaceImage(newImage);
2671 ThrowImageException;
2672}
2673
2674void Magick::Image::cycleColormap(const ssize_t amount_)
2675{
2676 modifyImage();
2677 GetPPException;
2678 CycleColormapImage(image(),amount_,exceptionInfo);
2679 ThrowImageException;
2680}
2681
2682void Magick::Image::decipher(const std::string &passphrase_)
2683{
2684 modifyImage();
2685 GetPPException;
2686 DecipherImage(image(),passphrase_.c_str(),exceptionInfo);
2687 ThrowImageException;
2688}
2689
2690void Magick::Image::defineSet(const std::string &magick_,
2691 const std::string &key_,bool flag_)
2692{
2693 std::string
2694 definition;
2695
2696 modifyImage();
2697 definition=magick_ + ":" + key_;
2698 if (flag_)
2699 (void) SetImageOption(imageInfo(),definition.c_str(),"");
2700 else
2701 DeleteImageOption(imageInfo(),definition.c_str());
2702}
2703
2704bool Magick::Image::defineSet(const std::string &magick_,
2705 const std::string &key_ ) const
2706{
2707 const char
2708 *option;
2709
2710 std::string
2711 key;
2712
2713 key=magick_ + ":" + key_;
2714 option=GetImageOption(constImageInfo(),key.c_str());
2715 if (option)
2716 return(true);
2717 return(false);
2718}
2719
2720void Magick::Image::defineValue(const std::string &magick_,
2721 const std::string &key_,const std::string &value_)
2722{
2723 std::string
2724 format,
2725 option;
2726
2727 modifyImage();
2728 format=magick_ + ":" + key_;
2729 option=value_;
2730 (void) SetImageOption(imageInfo(),format.c_str(),option.c_str());
2731}
2732
2733std::string Magick::Image::defineValue(const std::string &magick_,
2734 const std::string &key_) const
2735{
2736 const char
2737 *option;
2738
2739 std::string
2740 definition;
2741
2742 definition=magick_ + ":" + key_;
2743 option=GetImageOption(constImageInfo(),definition.c_str());
2744 if (option)
2745 return(std::string(option));
2746 return(std::string());
2747}
2748
2749void Magick::Image::deskew(const double threshold_)
2750{
2751 MagickCore::Image
2752 *newImage;
2753
2754 GetPPException;
2755 newImage=DeskewImage(constImage(),threshold_,exceptionInfo);
2756 replaceImage(newImage);
2757 ThrowImageException;
2758}
2759
2760void Magick::Image::despeckle(void)
2761{
2762 MagickCore::Image
2763 *newImage;
2764
2765 GetPPException;
2766 newImage=DespeckleImage(constImage(),exceptionInfo);
2767 replaceImage(newImage);
2768 ThrowImageException;
2769}
2770
2771void Magick::Image::display(void)
2772{
2773 GetPPException;
2774 DisplayImages(imageInfo(),image(),exceptionInfo);
2775 ThrowImageException;
2776}
2777
2778void Magick::Image::distort(const DistortMethod method_,
2779 const size_t numberArguments_,const double *arguments_,const bool bestfit_)
2780{
2781 MagickCore::Image
2782 *newImage;
2783
2784 GetPPException;
2785 newImage=DistortImage(constImage(), method_,numberArguments_,arguments_,
2786 bestfit_ == true ? MagickTrue : MagickFalse,exceptionInfo);
2787 replaceImage(newImage);
2788 ThrowImageException;
2789}
2790
2791void Magick::Image::draw(const Magick::Drawable &drawable_)
2792{
2793 DrawingWand
2794 *wand;
2795
2796 modifyImage();
2797
2798 wand=AcquireDrawingWand(options()->drawInfo(),image());
2799
2800 if(wand)
2801 {
2802 drawable_.operator()(wand);
2803
2804 DrawRender(wand);
2805
2806 ClonePPDrawException(wand);
2807 wand=DestroyDrawingWand(wand);
2808 ThrowPPDrawException(quiet());
2809 }
2810}
2811
2812void Magick::Image::draw(const std::vector<Magick::Drawable> &drawable_)
2813{
2814 DrawingWand
2815 *wand;
2816
2817 modifyImage();
2818
2819 wand= AcquireDrawingWand(options()->drawInfo(),image());
2820
2821 if(wand)
2822 {
2823 for (std::vector<Magick::Drawable>::const_iterator p = drawable_.begin();
2824 p != drawable_.end(); p++ )
2825 {
2826 p->operator()(wand);
2827 if (DrawGetExceptionType(wand) != MagickCore::UndefinedException)
2828 break;
2829 }
2830
2831 if (DrawGetExceptionType(wand) == MagickCore::UndefinedException)
2832 DrawRender(wand);
2833
2834 ClonePPDrawException(wand);
2835 wand=DestroyDrawingWand(wand);
2836 ThrowPPDrawException(quiet());
2837 }
2838}
2839
2840void Magick::Image::edge(const double radius_)
2841{
2842 MagickCore::Image
2843 *newImage;
2844
2845 GetPPException;
2846 newImage=EdgeImage(constImage(),radius_,exceptionInfo);
2847 replaceImage(newImage);
2848 ThrowImageException;
2849}
2850
2851void Magick::Image::emboss(const double radius_,const double sigma_)
2852{
2853 MagickCore::Image
2854 *newImage;
2855
2856 GetPPException;
2857 newImage=EmbossImage(constImage(),radius_,sigma_,exceptionInfo);
2858 replaceImage(newImage);
2859 ThrowImageException;
2860}
2861
2862void Magick::Image::encipher(const std::string &passphrase_)
2863{
2864 modifyImage();
2865 GetPPException;
2866 EncipherImage(image(),passphrase_.c_str(),exceptionInfo);
2867 ThrowImageException;
2868}
2869
2870void Magick::Image::enhance(void)
2871{
2872 MagickCore::Image
2873 *newImage;
2874
2875 GetPPException;
2876 newImage=EnhanceImage(constImage(),exceptionInfo);
2877 replaceImage(newImage);
2878 ThrowImageException;
2879}
2880
2881void Magick::Image::equalize(void)
2882{
2883 modifyImage();
2884 GetPPException;
2885 EqualizeImage(image(),exceptionInfo);
2886 ThrowImageException;
2887}
2888
2889void Magick::Image::erase(void)
2890{
2891 modifyImage();
2892 GetPPException;
2893 (void) SetImageBackgroundColor(image(),exceptionInfo);
2894 ThrowImageException;
2895}
2896
2897void Magick::Image::evaluate(const ChannelType channel_,
2898 const MagickEvaluateOperator operator_,double rvalue_)
2899{
2900 GetPPException;
2901 GetAndSetPPChannelMask(channel_);
2902 EvaluateImage(image(),operator_,rvalue_,exceptionInfo);
2903 RestorePPChannelMask;
2904 ThrowImageException;
2905}
2906
2907void Magick::Image::evaluate(const ChannelType channel_,
2908 const MagickFunction function_,const size_t number_parameters_,
2909 const double *parameters_)
2910{
2911 GetPPException;
2912 GetAndSetPPChannelMask(channel_);
2913 FunctionImage(image(),function_,number_parameters_,parameters_,
2914 exceptionInfo);
2915 RestorePPChannelMask;
2916 ThrowImageException;
2917}
2918
2919void Magick::Image::evaluate(const ChannelType channel_,const ssize_t x_,
2920 const ssize_t y_,const size_t columns_,const size_t rows_,
2921 const MagickEvaluateOperator operator_,const double rvalue_)
2922{
2923 RectangleInfo
2924 geometry;
2925
2926 MagickCore::Image
2927 *cropImage;
2928
2929 geometry.width = columns_;
2930 geometry.height = rows_;
2931 geometry.x = x_;
2932 geometry.y = y_;
2933
2934 GetPPException;
2935 cropImage=CropImage(image(),&geometry,exceptionInfo);
2936 GetAndSetPPChannelMask(channel_);
2937 EvaluateImage(cropImage,operator_,rvalue_,exceptionInfo);
2938 RestorePPChannelMask;
2939 (void) CompositeImage(image(),cropImage,image()->alpha_trait ==
2940 BlendPixelTrait ? OverCompositeOp : CopyCompositeOp,MagickFalse,
2941 geometry.x,geometry.y,exceptionInfo );
2942 cropImage=DestroyImageList(cropImage);
2943 ThrowImageException;
2944}
2945
2946void Magick::Image::extent(const Geometry &geometry_ )
2947{
2948 MagickCore::Image
2949 *newImage;
2950
2951 RectangleInfo
2952 extentInfo=geometry_;
2953
2954 modifyImage();
2955 extentInfo.x=geometry_.xOff();
2956 extentInfo.y=geometry_.yOff();
2957 GetPPException;
2958 newImage=ExtentImage(image(),&extentInfo,exceptionInfo);
2959 replaceImage(newImage);
2960 ThrowImageException;
2961}
2962
2963void Magick::Image::extent(const Geometry &geometry_,
2964 const Color &backgroundColor_)
2965{
2966 backgroundColor(backgroundColor_);
2967 extent(geometry_);
2968}
2969
2970void Magick::Image::extent(const Geometry &geometry_,
2971 const Color &backgroundColor_,const GravityType gravity_)
2972{
2973 backgroundColor(backgroundColor_);
2974 extent(geometry_,gravity_);
2975}
2976
2977void Magick::Image::extent(const Geometry &geometry_,
2978 const GravityType gravity_)
2979{
2980 RectangleInfo
2981 geometry;
2982
2983 SetGeometry(image(),&geometry);
2984 geometry.width=geometry_.width();
2985 geometry.height=geometry_.height();
2986 GravityAdjustGeometry(image()->columns,image()->rows,gravity_,&geometry);
2987 extent(geometry);
2988}
2989
2990void Magick::Image::flip(void)
2991{
2992 MagickCore::Image
2993 *newImage;
2994
2995 GetPPException;
2996 newImage=FlipImage(constImage(),exceptionInfo);
2997 replaceImage(newImage);
2998 ThrowImageException;
2999}
3000
3001void Magick::Image::floodFillAlpha(const ssize_t x_,const ssize_t y_,
3002 const unsigned int alpha_,const bool invert_)
3003{
3004 PixelInfo
3005 target;
3006
3007 modifyImage();
3008
3009 target=static_cast<PixelInfo>(pixelColor(x_,y_));
3010 target.alpha=alpha_;
3011 GetPPException;
3012 GetAndSetPPChannelMask(AlphaChannel);
3013 FloodfillPaintImage(image(),options()->drawInfo(),&target,x_,y_,
3014 (MagickBooleanType)invert_,exceptionInfo);
3015 RestorePPChannelMask;
3016 ThrowImageException;
3017}
3018
3019void Magick::Image::floodFillAlpha(const ssize_t x_,const ssize_t y_,
3020 const unsigned int alpha_,const Color &target_,const bool invert_)
3021{
3022 PixelInfo
3023 target;
3024
3025 modifyImage();
3026
3027 target=static_cast<PixelInfo>(target_);
3028 target.alpha=alpha_;
3029 GetPPException;
3030 GetAndSetPPChannelMask(AlphaChannel);
3031 FloodfillPaintImage(image(),options()->drawInfo(),&target,x_,y_,
3032 (MagickBooleanType)invert_,exceptionInfo);
3033 RestorePPChannelMask;
3034 ThrowImageException;
3035}
3036
3037void Magick::Image::floodFillColor(const Geometry &point_,
3038 const Magick::Color &fillColor_,const bool invert_)
3039{
3040 floodFillColor(point_.xOff(),point_.yOff(),fillColor_,invert_);
3041}
3042
3043void Magick::Image::floodFillColor(const ssize_t x_,const ssize_t y_,
3044 const Magick::Color &fillColor_,const bool invert_)
3045{
3046 PixelInfo
3047 pixel;
3048
3049 modifyImage();
3050
3051 pixel=static_cast<PixelInfo>(pixelColor(x_,y_));
3052 floodFill(x_,y_,(Magick::Image *)NULL,fillColor_,&pixel,invert_);
3053}
3054
3055void Magick::Image::floodFillColor(const Geometry &point_,
3056 const Magick::Color &fillColor_,const Magick::Color &borderColor_,
3057 const bool invert_)
3058{
3059 floodFillColor(point_.xOff(),point_.yOff(),fillColor_,borderColor_,invert_);
3060}
3061
3062void Magick::Image::floodFillColor(const ssize_t x_,const ssize_t y_,
3063 const Magick::Color &fillColor_,const Magick::Color &borderColor_,
3064 const bool invert_)
3065{
3066 PixelInfo
3067 pixel;
3068
3069 modifyImage();
3070
3071 pixel=static_cast<PixelInfo>(borderColor_);
3072 floodFill(x_,y_,(Magick::Image *)NULL,fillColor_,&pixel,invert_);
3073}
3074
3075void Magick::Image::floodFillTexture(const Magick::Geometry &point_,
3076 const Magick::Image &texture_,const bool invert_)
3077{
3078 floodFillTexture(point_.xOff(),point_.yOff(),texture_,invert_);
3079}
3080
3081void Magick::Image::floodFillTexture(const ssize_t x_,const ssize_t y_,
3082 const Magick::Image &texture_,const bool invert_)
3083{
3084 PixelInfo
3085 pixel;
3086
3087 modifyImage();
3088
3089 pixel=static_cast<PixelInfo>(pixelColor(x_,y_));
3090 floodFill(x_,y_,&texture_,Magick::Color(),&pixel,invert_);
3091}
3092
3093void Magick::Image::floodFillTexture(const Magick::Geometry &point_,
3094 const Magick::Image &texture_,const Magick::Color &borderColor_,
3095 const bool invert_)
3096{
3097 floodFillTexture(point_.xOff(),point_.yOff(),texture_,borderColor_,invert_);
3098}
3099
3100void Magick::Image::floodFillTexture(const ssize_t x_,const ssize_t y_,
3101 const Magick::Image &texture_,const Magick::Color &borderColor_,
3102 const bool invert_)
3103{
3104 PixelInfo
3105 pixel;
3106
3107 modifyImage();
3108
3109 pixel=static_cast<PixelInfo>(borderColor_);
3110 floodFill(x_,y_,&texture_,Magick::Color(),&pixel,invert_);
3111}
3112
3113void Magick::Image::flop(void)
3114{
3115 MagickCore::Image
3116 *newImage;
3117
3118 GetPPException;
3119 newImage=FlopImage(constImage(),exceptionInfo);
3120 replaceImage(newImage);
3121 ThrowImageException;
3122}
3123
3124void Magick::Image::fontTypeMetrics(const std::string &text_,
3125 TypeMetric *metrics)
3126{
3127 DrawInfo
3128 *drawInfo;
3129
3130 drawInfo=options()->drawInfo();
3131 drawInfo->text=DestroyString(drawInfo->text);
3132 drawInfo->text=const_cast<char *>(text_.c_str());
3133 GetPPException;
3134 GetTypeMetrics(image(),drawInfo,&(metrics->_typeMetric),exceptionInfo);
3135 drawInfo->text=(char *) NULL;
3136 ThrowImageException;
3137}
3138
3139void Magick::Image::fontTypeMetricsMultiline(const std::string &text_,
3140 TypeMetric *metrics)
3141{
3142 DrawInfo
3143 *drawInfo;
3144
3145 drawInfo=options()->drawInfo();
3146 drawInfo->text=DestroyString(drawInfo->text);
3147 drawInfo->text=const_cast<char *>(text_.c_str());
3148 GetPPException;
3149 (void) GetMultilineTypeMetrics(image(),drawInfo,&(metrics->_typeMetric),
3150 exceptionInfo);
3151 drawInfo->text=(char *) NULL;
3152 ThrowImageException;
3153}
3154
3155void Magick::Image::frame(const Geometry &geometry_)
3156{
3157 FrameInfo
3158 info;
3159
3160 MagickCore::Image
3161 *newImage;
3162
3163 info.x=static_cast<ssize_t>(geometry_.width());
3164 info.y=static_cast<ssize_t>(geometry_.height());
3165 info.width=columns() + (static_cast<size_t>(info.x) << 1);
3166 info.height=rows() + (static_cast<size_t>(info.y) << 1);
3167 info.outer_bevel=geometry_.xOff();
3168 info.inner_bevel=geometry_.yOff();
3169
3170 GetPPException;
3171 newImage=FrameImage(constImage(),&info,image()->compose,exceptionInfo);
3172 replaceImage(newImage);
3173 ThrowImageException;
3174}
3175
3176void Magick::Image::frame(const size_t width_,const size_t height_,
3177 const ssize_t innerBevel_,const ssize_t outerBevel_)
3178{
3179 FrameInfo
3180 info;
3181
3182 MagickCore::Image
3183 *newImage;
3184
3185 info.x=static_cast<ssize_t>(width_);
3186 info.y=static_cast<ssize_t>(height_);
3187 info.width=columns() + (static_cast<size_t>(info.x) << 1);
3188 info.height=rows() + (static_cast<size_t>(info.y) << 1);
3189 info.outer_bevel=static_cast<ssize_t>(outerBevel_);
3190 info.inner_bevel=static_cast<ssize_t>(innerBevel_);
3191
3192 GetPPException;
3193 newImage=FrameImage(constImage(),&info,image()->compose,exceptionInfo);
3194 replaceImage(newImage);
3195 ThrowImageException;
3196}
3197
3198void Magick::Image::fx(const std::string expression_)
3199{
3200 MagickCore::Image
3201 *newImage;
3202
3203 GetPPException;
3204 newImage=FxImage(constImage(),expression_.c_str(),exceptionInfo);
3205 replaceImage(newImage);
3206 ThrowImageException;
3207}
3208
3209void Magick::Image::fx(const std::string expression_,
3210 const Magick::ChannelType channel_)
3211{
3212 MagickCore::Image
3213 *newImage;
3214
3215 GetPPException;
3216 GetAndSetPPChannelMask(channel_);
3217 newImage=FxImage(constImage(),expression_.c_str(),exceptionInfo);
3218 RestorePPChannelMask;
3219 replaceImage(newImage);
3220 ThrowImageException;
3221}
3222
3223void Magick::Image::gamma(const double gamma_)
3224{
3225 modifyImage();
3226 GetPPException;
3227 GammaImage(image(),gamma_,exceptionInfo);
3228 ThrowImageException;
3229}
3230
3231void Magick::Image::gamma(const double gammaRed_,const double gammaGreen_,
3232 const double gammaBlue_)
3233{
3234 modifyImage();
3235 GetPPException;
3236 GetAndSetPPChannelMask(RedChannel);
3237 (void) GammaImage(image(),gammaRed_,exceptionInfo);
3238 SetPPChannelMask(GreenChannel);
3239 (void) GammaImage(image(),gammaGreen_,exceptionInfo);
3240 SetPPChannelMask(BlueChannel);
3241 (void) GammaImage(image(),gammaBlue_,exceptionInfo);
3242 RestorePPChannelMask;
3243 ThrowImageException;
3244}
3245
3246void Magick::Image::gaussianBlur(const double radius_,const double sigma_)
3247{
3248 MagickCore::Image
3249 *newImage;
3250
3251 GetPPException;
3252 newImage=GaussianBlurImage(constImage(),radius_,sigma_,exceptionInfo);
3253 replaceImage(newImage);
3254 ThrowImageException;
3255}
3256
3257void Magick::Image::gaussianBlurChannel(const ChannelType channel_,
3258 const double radius_,const double sigma_)
3259{
3260 MagickCore::Image
3261 *newImage;
3262
3263 GetPPException;
3264 GetAndSetPPChannelMask(channel_);
3265 newImage=GaussianBlurImage(constImage(),radius_,sigma_,exceptionInfo);
3266 RestorePPChannelMask;
3267 replaceImage(newImage);
3268 ThrowImageException;
3269}
3270
3271const Magick::Quantum *Magick::Image::getConstPixels(const ssize_t x_,
3272 const ssize_t y_,const size_t columns_,const size_t rows_) const
3273{
3274 const Quantum
3275 *p;
3276
3277 GetPPException;
3278 p=GetVirtualPixels(constImage(),x_, y_,columns_, rows_,exceptionInfo);
3279 ThrowImageException;
3280 return(p);
3281}
3282
3283const void *Magick::Image::getConstMetacontent(void) const
3284{
3285 const void
3286 *result;
3287
3288 result=GetVirtualMetacontent(constImage());
3289
3290 if(!result)
3291 throwExceptionExplicit(MagickCore::OptionError,
3292 "Unable to retrieve meta content.");
3293
3294 return(result);
3295}
3296
3297void *Magick::Image::getMetacontent(void )
3298{
3299 void
3300 *result;
3301
3302 result=GetAuthenticMetacontent(image());
3303
3304 if(!result)
3305 throwExceptionExplicit(MagickCore::OptionError,
3306 "Unable to retrieve meta content.");
3307
3308 return(result);
3309}
3310
3311Magick::Quantum *Magick::Image::getPixels(const ssize_t x_,const ssize_t y_,
3312 const size_t columns_,const size_t rows_)
3313{
3314 Quantum
3315 *result;
3316
3317 modifyImage();
3318 GetPPException;
3319 result=GetAuthenticPixels(image(),x_, y_,columns_,rows_,exceptionInfo);
3320 ThrowImageException;
3321
3322 return(result);
3323}
3324
3325void Magick::Image::grayscale(const PixelIntensityMethod method_)
3326{
3327 modifyImage();
3328 GetPPException;
3329 (void) GrayscaleImage(image(),method_,exceptionInfo);
3330 ThrowImageException;
3331}
3332
3333void Magick::Image::haldClut(const Image &clutImage_)
3334{
3335 modifyImage();
3336 GetPPException;
3337 (void) HaldClutImage(image(),clutImage_.constImage(),exceptionInfo);
3338 ThrowImageException;
3339}
3340
3341void Magick::Image::houghLine(const size_t width_,const size_t height_,
3342 const size_t threshold_)
3343{
3344 MagickCore::Image
3345 *newImage;
3346
3347 GetPPException;
3348 newImage=HoughLineImage(constImage(),width_,height_,threshold_,
3349 exceptionInfo);
3350 replaceImage(newImage);
3351 ThrowImageException;
3352}
3353
3354Magick::ImageType Magick::Image::identifyType(void) const
3355{
3356 ImageType
3357 image_type;
3358
3359 GetPPException;
3360 image_type=IdentifyImageType(constImage(),exceptionInfo);
3361 ThrowImageException;
3362 return(image_type);
3363}
3364
3365void Magick::Image::implode(const double factor_)
3366{
3367 MagickCore::Image
3368 *newImage;
3369
3370 GetPPException;
3371 newImage=ImplodeImage(constImage(),factor_,image()->interpolate,
3372 exceptionInfo);
3373 replaceImage(newImage);
3374 ThrowImageException;
3375}
3376
3377void Magick::Image::inverseFourierTransform(const Image &phase_)
3378{
3379 inverseFourierTransform(phase_,true);
3380}
3381
3382void Magick::Image::inverseFourierTransform(const Image &phase_,
3383 const bool magnitude_)
3384{
3385 MagickCore::Image
3386 *newImage;
3387
3388 GetPPException;
3389 newImage=InverseFourierTransformImage(constImage(),phase_.constImage(),
3390 magnitude_ == true ? MagickTrue : MagickFalse,exceptionInfo);
3391 replaceImage(newImage);
3392 ThrowImageException;
3393}
3394
3395void Magick::Image::kuwahara(const double radius_,const double sigma_)
3396{
3397 MagickCore::Image
3398 *newImage;
3399
3400 GetPPException;
3401 newImage=KuwaharaImage(constImage(),radius_,sigma_,exceptionInfo);
3402 replaceImage(newImage);
3403 ThrowImageException;
3404}
3405
3406void Magick::Image::kuwaharaChannel(const ChannelType channel_,
3407 const double radius_,const double sigma_)
3408{
3409 MagickCore::Image
3410 *newImage;
3411
3412 GetPPException;
3413 GetAndSetPPChannelMask(channel_);
3414 newImage=KuwaharaImage(constImage(),radius_,sigma_,exceptionInfo);
3415 replaceImage(newImage);
3416 RestorePPChannelMask;
3417 ThrowImageException;
3418}
3419
3420void Magick::Image::level(const double blackPoint_,const double whitePoint_,
3421 const double gamma_)
3422{
3423 modifyImage();
3424 GetPPException;
3425 (void) LevelImage(image(),blackPoint_,whitePoint_,gamma_,exceptionInfo);
3426 ThrowImageException;
3427}
3428
3429void Magick::Image::levelChannel(const ChannelType channel_,
3430 const double blackPoint_,const double whitePoint_,const double gamma_)
3431{
3432 modifyImage();
3433 GetPPException;
3434 GetAndSetPPChannelMask(channel_);
3435 (void) LevelImage(image(),blackPoint_,whitePoint_,gamma_,exceptionInfo);
3436 RestorePPChannelMask;
3437 ThrowImageException;
3438}
3439
3440void Magick::Image::levelColors(const Color &blackColor_,
3441 const Color &whiteColor_,const bool invert_)
3442{
3443 PixelInfo
3444 black,
3445 white;
3446
3447 modifyImage();
3448
3449 black=static_cast<PixelInfo>(blackColor_);
3450 white=static_cast<PixelInfo>(whiteColor_);
3451 GetPPException;
3452 (void) LevelImageColors(image(),&black,&white,invert_ == true ?
3453 MagickTrue : MagickFalse,exceptionInfo);
3454 ThrowImageException;
3455}
3456
3457void Magick::Image::levelColorsChannel(const ChannelType channel_,
3458 const Color &blackColor_,const Color &whiteColor_,const bool invert_)
3459{
3460 PixelInfo
3461 black,
3462 white;
3463
3464 modifyImage();
3465
3466 black=static_cast<PixelInfo>(blackColor_);
3467 white=static_cast<PixelInfo>(whiteColor_);
3468 GetPPException;
3469 GetAndSetPPChannelMask(channel_);
3470 (void) LevelImageColors(image(),&black,&white,invert_ == true ?
3471 MagickTrue : MagickFalse,exceptionInfo);
3472 RestorePPChannelMask;
3473 ThrowImageException;
3474}
3475
3476void Magick::Image::levelize(const double blackPoint_,const double whitePoint_,
3477 const double gamma_)
3478{
3479 modifyImage();
3480 GetPPException;
3481 (void) LevelizeImage(image(),blackPoint_,whitePoint_,gamma_,exceptionInfo);
3482 ThrowImageException;
3483}
3484
3485void Magick::Image::levelizeChannel(const ChannelType channel_,
3486 const double blackPoint_,const double whitePoint_,const double gamma_)
3487{
3488 modifyImage();
3489 GetPPException;
3490 GetAndSetPPChannelMask(channel_);
3491 (void) LevelizeImage(image(),blackPoint_,whitePoint_,gamma_,exceptionInfo);
3492 RestorePPChannelMask;
3493 ThrowImageException;
3494}
3495
3496void Magick::Image::linearStretch(const double blackPoint_,
3497 const double whitePoint_)
3498{
3499 modifyImage();
3500 GetPPException;
3501 LinearStretchImage(image(),blackPoint_,whitePoint_,exceptionInfo);
3502 ThrowImageException;
3503}
3504
3505void Magick::Image::liquidRescale(const Geometry &geometry_)
3506{
3507 MagickCore::Image
3508 *newImage;
3509
3510 size_t
3511 height=rows(),
3512 width=columns();
3513
3514 ssize_t
3515 x=0,
3516 y=0;
3517
3518 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
3519 &height);
3520
3521 GetPPException;
3522 newImage=LiquidRescaleImage(image(),width,height,(double) x,(double) y,exceptionInfo);
3523 replaceImage(newImage);
3524 ThrowImageException;
3525}
3526
3527void Magick::Image::localContrast(const double radius_,const double strength_)
3528{
3529 MagickCore::Image
3530 *newImage;
3531
3532 GetPPException;
3533 newImage=LocalContrastImage(constImage(),radius_,strength_,exceptionInfo);
3534 replaceImage(newImage);
3535 ThrowImageException;
3536}
3537
3538void Magick::Image::localContrastChannel(const ChannelType channel_,
3539 const double radius_,const double strength_)
3540{
3541 MagickCore::Image
3542 *newImage;
3543
3544 GetPPException;
3545 GetAndSetPPChannelMask(channel_);
3546 newImage=LocalContrastImage(constImage(),radius_,strength_,exceptionInfo);
3547 RestorePPChannelMask;
3548 replaceImage(newImage);
3549 ThrowImageException;
3550}
3551
3552void Magick::Image::magnify(void)
3553{
3554 MagickCore::Image
3555 *newImage;
3556
3557 GetPPException;
3558 newImage=MagnifyImage(constImage(),exceptionInfo);
3559 replaceImage(newImage);
3560 ThrowImageException;
3561}
3562
3563void Magick::Image::map(const Image &mapImage_,const bool dither_)
3564{
3565 map(mapImage_, dither_ ? RiemersmaDitherMethod : NoDitherMethod);
3566}
3567
3568void Magick::Image::map(const Image &mapImage_,const DitherMethod ditherMethod_)
3569{
3570 modifyImage();
3571 GetPPException;
3572 options()->quantizeDither(ditherMethod_);
3573 RemapImage(options()->quantizeInfo(),image(),mapImage_.constImage(),
3574 exceptionInfo);
3575 ThrowImageException;
3576}
3577
3578void Magick::Image::meanShift(const size_t width_,const size_t height_,
3579 const double color_distance_)
3580{
3581 MagickCore::Image
3582 *newImage;
3583
3584 GetPPException;
3585 newImage=MeanShiftImage(constImage(),width_,height_,color_distance_,
3586 exceptionInfo);
3587 replaceImage(newImage);
3588 ThrowImageException;
3589}
3590
3591void Magick::Image::medianFilter(const double radius_)
3592{
3593 MagickCore::Image
3594 *newImage;
3595
3596 GetPPException;
3597 newImage=StatisticImage(image(),MedianStatistic,(size_t) radius_,
3598 (size_t) radius_,exceptionInfo);
3599 replaceImage(newImage);
3600 ThrowImageException;
3601}
3602
3603void Magick::Image::minify(void)
3604{
3605 MagickCore::Image
3606 *newImage;
3607
3608 GetPPException;
3609 newImage=MinifyImage(constImage(),exceptionInfo);
3610 replaceImage(newImage);
3611 ThrowImageException;
3612}
3613
3614void Magick::Image::modulate(const double brightness_,const double saturation_,
3615 const double hue_)
3616{
3617 char
3618 modulate[MagickPathExtent + 1];
3619
3620 FormatLocaleString(modulate,MagickPathExtent,"%3.6f,%3.6f,%3.6f",brightness_,
3621 saturation_,hue_);
3622
3623 modifyImage();
3624 GetPPException;
3625 ModulateImage(image(),modulate,exceptionInfo);
3626 ThrowImageException;
3627}
3628
3629Magick::ImageMoments Magick::Image::moments(void) const
3630{
3631 return(ImageMoments(*this));
3632}
3633
3634void Magick::Image::morphology(const MorphologyMethod method_,
3635 const std::string kernel_,const ssize_t iterations_)
3636{
3637 KernelInfo
3638 *kernel;
3639
3640 MagickCore::Image
3641 *newImage;
3642
3643 GetPPException;
3644 kernel=AcquireKernelInfo(kernel_.c_str(),exceptionInfo);
3645 if (kernel == (KernelInfo *) NULL)
3646 throwExceptionExplicit(MagickCore::OptionError,"Unable to parse kernel.");
3647 newImage=MorphologyImage(constImage(),method_,iterations_,kernel,
3648 exceptionInfo);
3649 replaceImage(newImage);
3650 kernel=DestroyKernelInfo(kernel);
3651 ThrowImageException;
3652}
3653
3654void Magick::Image::morphology(const MorphologyMethod method_,
3655 const KernelInfoType kernel_,const std::string arguments_,
3656 const ssize_t iterations_)
3657{
3658 const char
3659 *option;
3660
3661 std::string
3662 kernel;
3663
3664 option=CommandOptionToMnemonic(MagickKernelOptions,kernel_);
3665 if (option == (const char *)NULL)
3666 {
3667 throwExceptionExplicit(MagickCore::OptionError,
3668 "Unable to determine kernel type.");
3669 return;
3670 }
3671 kernel=std::string(option);
3672 if (!arguments_.empty())
3673 kernel+=":"+arguments_;
3674
3675 morphology(method_,kernel,iterations_);
3676}
3677
3678void Magick::Image::morphologyChannel(const ChannelType channel_,
3679 const MorphologyMethod method_,const std::string kernel_,
3680 const ssize_t iterations_)
3681{
3682 KernelInfo
3683 *kernel;
3684
3685 MagickCore::Image
3686 *newImage;
3687
3688
3689 GetPPException;
3690 kernel=AcquireKernelInfo(kernel_.c_str(),exceptionInfo);
3691 if (kernel == (KernelInfo *)NULL)
3692 {
3693 throwExceptionExplicit(MagickCore::OptionError,
3694 "Unable to parse kernel.");
3695 return;
3696 }
3697 GetAndSetPPChannelMask(channel_);
3698 newImage=MorphologyImage(constImage(),method_,iterations_,kernel,
3699 exceptionInfo);
3700 RestorePPChannelMask;
3701 replaceImage(newImage);
3702 kernel=DestroyKernelInfo(kernel);
3703 ThrowImageException;
3704}
3705
3706void Magick::Image::morphologyChannel(const ChannelType channel_,
3707 const MorphologyMethod method_,const KernelInfoType kernel_,
3708 const std::string arguments_,const ssize_t iterations_)
3709{
3710 const char
3711 *option;
3712
3713 std::string
3714 kernel;
3715
3716 option=CommandOptionToMnemonic(MagickKernelOptions,kernel_);
3717 if (option == (const char *)NULL)
3718 {
3719 throwExceptionExplicit(MagickCore::OptionError,
3720 "Unable to determine kernel type.");
3721 return;
3722 }
3723
3724 kernel=std::string(option);
3725 if (!arguments_.empty())
3726 kernel+=":"+arguments_;
3727
3728 morphologyChannel(channel_,method_,kernel,iterations_);
3729}
3730
3731void Magick::Image::motionBlur(const double radius_,const double sigma_,
3732 const double angle_)
3733{
3734 MagickCore::Image
3735 *newImage;
3736
3737 GetPPException;
3738 newImage=MotionBlurImage(constImage(),radius_,sigma_,angle_,exceptionInfo);
3739 replaceImage(newImage);
3740 ThrowImageException;
3741}
3742
3743void Magick::Image::negate(const bool grayscale_)
3744{
3745 modifyImage();
3746 GetPPException;
3747 NegateImage(image(),(MagickBooleanType) grayscale_,exceptionInfo);
3748 ThrowImageException;
3749}
3750
3751void Magick::Image::negateChannel(const ChannelType channel_,
3752 const bool grayscale_)
3753{
3754 modifyImage();
3755 GetPPException;
3756 GetAndSetPPChannelMask(channel_);
3757 NegateImage(image(),(MagickBooleanType) grayscale_,exceptionInfo);
3758 RestorePPChannelMask;
3759 ThrowImageException;
3760}
3761
3762void Magick::Image::normalize(void)
3763{
3764 modifyImage();
3765 GetPPException;
3766 NormalizeImage(image(),exceptionInfo);
3767 ThrowImageException;
3768}
3769
3770void Magick::Image::oilPaint(const double radius_,const double sigma_)
3771{
3772 MagickCore::Image
3773 *newImage;
3774
3775 GetPPException;
3776 newImage=OilPaintImage(constImage(),radius_,sigma_,exceptionInfo);
3777 replaceImage(newImage);
3778 ThrowImageException;
3779}
3780
3781void Magick::Image::opaque(const Color &opaqueColor_,const Color &penColor_,
3782 const bool invert_)
3783{
3784 std::string
3785 opaqueColor,
3786 penColor;
3787
3788 PixelInfo
3789 opaque,
3790 pen;
3791
3792 if (!opaqueColor_.isValid())
3793 throwExceptionExplicit(MagickCore::OptionError,
3794 "Opaque color argument is invalid");
3795
3796 if (!penColor_.isValid())
3797 throwExceptionExplicit(MagickCore::OptionError,
3798 "Pen color argument is invalid");
3799
3800 modifyImage();
3801 opaqueColor=opaqueColor_;
3802 penColor=penColor_;
3803
3804 GetPPException;
3805 (void) QueryColorCompliance(opaqueColor.c_str(),AllCompliance,&opaque,
3806 exceptionInfo);
3807 (void) QueryColorCompliance(penColor.c_str(),AllCompliance,&pen,
3808 exceptionInfo);
3809 OpaquePaintImage(image(),&opaque,&pen,invert_ ? MagickTrue : MagickFalse,
3810 exceptionInfo);
3811 ThrowImageException;
3812}
3813
3814void Magick::Image::orderedDither(std::string thresholdMap_)
3815{
3816 modifyImage();
3817 GetPPException;
3818 (void) OrderedDitherImage(image(),thresholdMap_.c_str(),exceptionInfo);
3819 ThrowImageException;
3820}
3821
3822void Magick::Image::orderedDitherChannel(const ChannelType channel_,
3823 std::string thresholdMap_)
3824{
3825 modifyImage();
3826 GetPPException;
3827 GetAndSetPPChannelMask(channel_);
3828 (void)OrderedDitherImage(image(),thresholdMap_.c_str(),exceptionInfo);
3829 RestorePPChannelMask;
3830 ThrowImageException;
3831}
3832
3833void Magick::Image::perceptible(const double epsilon_)
3834{
3835 modifyImage();
3836 GetPPException;
3837 PerceptibleImage(image(),epsilon_,exceptionInfo);
3838 ThrowImageException;
3839}
3840
3841void Magick::Image::perceptibleChannel(const ChannelType channel_,
3842 const double epsilon_)
3843{
3844 modifyImage();
3845 GetPPException;
3846 GetAndSetPPChannelMask(channel_);
3847 PerceptibleImage(image(),epsilon_,exceptionInfo);
3848 RestorePPChannelMask;
3849 ThrowImageException;
3850}
3851
3852 Magick::ImagePerceptualHash Magick::Image::perceptualHash() const
3853{
3854 return(ImagePerceptualHash(*this));
3855}
3856
3857void Magick::Image::ping(const std::string &imageSpec_)
3858{
3859 MagickCore::Image
3860 *newImage;
3861
3862 GetPPException;
3863 options()->fileName(imageSpec_);
3864 newImage=PingImage(imageInfo(),exceptionInfo);
3865 read(newImage,exceptionInfo);
3866}
3867
3868void Magick::Image::ping(const Blob& blob_)
3869{
3870 MagickCore::Image
3871 *newImage;
3872
3873 GetPPException;
3874 newImage=PingBlob(imageInfo(),blob_.data(),blob_.length(),exceptionInfo);
3875 read(newImage,exceptionInfo);
3876}
3877
3878void Magick::Image::pixelColor(const ssize_t x_,const ssize_t y_,
3879 const Color &color_)
3880{
3881 PixelInfo
3882 packet;
3883
3884 Quantum
3885 *pixel;
3886
3887 // Test arguments to ensure they are within the image.
3888 if (y_ > (ssize_t) rows() || x_ > (ssize_t) columns())
3889 throwExceptionExplicit(MagickCore::OptionError,
3890 "Access outside of image boundary");
3891
3892 modifyImage();
3893
3894 // Set image to DirectClass
3895 classType(DirectClass );
3896
3897 // Get pixel view
3898 Pixels pixels(*this);
3899 // Set pixel value
3900 pixel=pixels.get(x_, y_, 1, 1 );
3901 packet=color_;
3902 MagickCore::SetPixelViaPixelInfo(constImage(),&packet,pixel);
3903 // Tell ImageMagick that pixels have been updated
3904 pixels.sync();
3905}
3906
3907Magick::Color Magick::Image::pixelColor(const ssize_t x_,
3908 const ssize_t y_) const
3909{
3910 const Quantum
3911 *pixel;
3912
3913 pixel=getConstPixels(x_,y_,1,1);
3914 if (pixel)
3915 {
3916 PixelInfo
3917 packet;
3918
3919 MagickCore::GetPixelInfoPixel(constImage(),pixel,&packet);
3920 return(Color(packet));
3921 }
3922
3923 return(Color()); // invalid
3924}
3925
3926void Magick::Image::polaroid(const std::string &caption_,const double angle_,
3927 const PixelInterpolateMethod method_)
3928{
3929 MagickCore::Image
3930 *newImage;
3931
3932 GetPPException;
3933 newImage=PolaroidImage(constImage(),options()->drawInfo(),caption_.c_str(),
3934 angle_,method_,exceptionInfo);
3935 replaceImage(newImage);
3936 ThrowImageException;
3937}
3938
3939void Magick::Image::posterize(const size_t levels_,const DitherMethod method_)
3940{
3941 modifyImage();
3942 GetPPException;
3943 PosterizeImage(image(),levels_,method_,exceptionInfo);
3944 ThrowImageException;
3945}
3946
3947void Magick::Image::posterizeChannel(const ChannelType channel_,
3948 const size_t levels_,const DitherMethod method_)
3949{
3950 modifyImage();
3951 GetPPException;
3952 GetAndSetPPChannelMask(channel_);
3953 PosterizeImage(image(),levels_,method_,exceptionInfo);
3954 RestorePPChannelMask;
3955 ThrowImageException;
3956}
3957
3958void Magick::Image::process(std::string name_,const ssize_t argc,
3959 const char **argv)
3960{
3961 modifyImage();
3962
3963 GetPPException;
3964 (void) InvokeDynamicImageFilter(name_.c_str(),&image(),(int) argc,argv,
3965 exceptionInfo);
3966 ThrowImageException;
3967}
3968
3969void Magick::Image::profile(const std::string name_,
3970 const Magick::Blob &profile_)
3971{
3972 modifyImage();
3973 GetPPException;
3974 (void) ProfileImage(image(),name_.c_str(),(unsigned char *)profile_.data(),
3975 profile_.length(),exceptionInfo);
3976 ThrowImageException;
3977}
3978
3979Magick::Blob Magick::Image::profile(const std::string name_) const
3980{
3981 const StringInfo
3982 *profile;
3983
3984 profile=GetImageProfile(constImage(),name_.c_str());
3985
3986 if (profile == (StringInfo *) NULL)
3987 return(Blob());
3988 return(Blob((void*) GetStringInfoDatum(profile),GetStringInfoLength(
3989 profile)));
3990}
3991
3992void Magick::Image::quantize(const bool measureError_)
3993{
3994 modifyImage();
3995
3996 if (measureError_)
3997 options()->quantizeInfo()->measure_error=MagickTrue;
3998 else
3999 options()->quantizeInfo()->measure_error=MagickFalse;
4000
4001 GetPPException;
4002 QuantizeImage(options()->quantizeInfo(),image(),exceptionInfo);
4003 ThrowImageException;
4004}
4005
4006void Magick::Image::raise(const Geometry &geometry_,const bool raisedFlag_)
4007{
4008 RectangleInfo
4009 raiseInfo=geometry_;
4010
4011 GetPPException;
4012 modifyImage();
4013 RaiseImage(image(),&raiseInfo,raisedFlag_ == true ? MagickTrue : MagickFalse,
4014 exceptionInfo);
4015 ThrowImageException;
4016}
4017
4018void Magick::Image::randomThreshold(const double low_,const double high_)
4019{
4020 GetPPException;
4021 (void) RandomThresholdImage(image(),low_,high_,exceptionInfo);
4022 ThrowImageException;
4023}
4024
4025void Magick::Image::randomThresholdChannel(const ChannelType channel_,
4026 const double low_,const double high_)
4027{
4028 modifyImage();
4029 GetPPException;
4030 GetAndSetPPChannelMask(channel_);
4031 (void) RandomThresholdImage(image(),low_,high_,exceptionInfo);
4032 RestorePPChannelMask;
4033 ThrowImageException;
4034}
4035
4036void Magick::Image::read(const Blob &blob_)
4037{
4038 MagickCore::Image
4039 *newImage;
4040
4041 GetPPException;
4042 newImage=BlobToImage(imageInfo(),static_cast<const void *>(blob_.data()),
4043 blob_.length(),exceptionInfo);
4044 read(newImage,exceptionInfo);
4045}
4046
4047void Magick::Image::read(const Blob &blob_,const Geometry &size_)
4048{
4049 size(size_);
4050 read(blob_);
4051}
4052
4053void Magick::Image::read(const Blob &blob_,const Geometry &size_,
4054 const size_t depth_)
4055{
4056 size(size_);
4057 depth(depth_);
4058 read(blob_);
4059}
4060
4061void Magick::Image::read(const Blob &blob_,const Geometry &size_,
4062 const size_t depth_,const std::string &magick_)
4063{
4064 size(size_);
4065 depth(depth_);
4066 magick(magick_);
4067 // Set explicit image format
4068 fileName(magick_ + ':');
4069 read(blob_);
4070}
4071
4072void Magick::Image::read(const Blob &blob_,const Geometry &size_,
4073 const std::string &magick_)
4074{
4075 size(size_);
4076 magick(magick_);
4077 // Set explicit image format
4078 fileName(magick_ + ':');
4079 read(blob_);
4080}
4081
4082void Magick::Image::read(const Geometry &size_,const std::string &imageSpec_)
4083{
4084 size(size_);
4085 read(imageSpec_);
4086}
4087
4088void Magick::Image::read(const size_t width_,const size_t height_,
4089 const std::string &map_,const StorageType type_,const void *pixels_)
4090{
4091 MagickCore::Image
4092 *newImage;
4093
4094 GetPPException;
4095 newImage=ConstituteImage(width_,height_,map_.c_str(),type_, pixels_,
4096 exceptionInfo);
4097 replaceImage(newImage);
4098 ThrowImageException;
4099}
4100
4101void Magick::Image::read(const std::string &imageSpec_)
4102{
4103 MagickCore::Image
4104 *newImage;
4105
4106 GetPPException;
4107 options()->fileName(imageSpec_);
4108 newImage=ReadImage(imageInfo(),exceptionInfo);
4109 read(newImage,exceptionInfo);
4110}
4111
4112void Magick::Image::readMask(const Magick::Image &mask_)
4113{
4114 mask(mask_,ReadPixelMask);
4115}
4116
4117Magick::Image Magick::Image::readMask(void) const
4118{
4119 return(mask(ReadPixelMask));
4120}
4121
4122void Magick::Image::readPixels(const Magick::QuantumType quantum_,
4123 const unsigned char *source_)
4124{
4125 QuantumInfo
4126 *quantum_info;
4127
4128 quantum_info=AcquireQuantumInfo(imageInfo(),image());
4129 GetPPException;
4130 ImportQuantumPixels(image(),(MagickCore::CacheView *) NULL,quantum_info,
4131 quantum_,source_,exceptionInfo);
4132 quantum_info=DestroyQuantumInfo(quantum_info);
4133 ThrowImageException;
4134}
4135
4136void Magick::Image::reduceNoise(void)
4137{
4138 reduceNoise(3);
4139}
4140
4141void Magick::Image::reduceNoise(const size_t order_)
4142{
4143 MagickCore::Image
4144 *newImage;
4145
4146 GetPPException;
4147 newImage=StatisticImage(constImage(),NonpeakStatistic,order_,
4148 order_,exceptionInfo);
4149 replaceImage(newImage);
4150 ThrowImageException;
4151}
4152
4153void Magick::Image::repage()
4154{
4155 modifyImage();
4156 options()->page(Geometry());
4157 image()->page.width = 0;
4158 image()->page.height = 0;
4159 image()->page.x = 0;
4160 image()->page.y = 0;
4161}
4162
4163void Magick::Image::resample(const Point &density_)
4164{
4165 MagickCore::Image
4166 *newImage;
4167
4168 GetPPException;
4169 newImage=ResampleImage(constImage(),density_.x(),density_.y(),
4170 image()->filter,exceptionInfo);
4171 replaceImage(newImage);
4172 ThrowImageException;
4173}
4174
4175void Magick::Image::resize(const Geometry &geometry_)
4176{
4177 MagickCore::Image
4178 *newImage;
4179
4180 size_t
4181 height=rows(),
4182 width=columns();
4183
4184 ssize_t
4185 x=0,
4186 y=0;
4187
4188 // Calculate new size. This code should be supported using binary arguments
4189 // in the ImageMagick library.
4190 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
4191 &height);
4192
4193 GetPPException;
4194 newImage=ResizeImage(constImage(),width,height,image()->filter,
4195 exceptionInfo);
4196 replaceImage(newImage);
4197 ThrowImageException;
4198}
4199
4200void Magick::Image::roll(const Geometry &roll_)
4201{
4202 MagickCore::Image
4203 *newImage;
4204
4205 GetPPException;
4206 newImage=RollImage(constImage(),roll_.xOff(),roll_.yOff(),exceptionInfo);
4207 replaceImage(newImage);
4208 ThrowImageException;
4209}
4210
4211void Magick::Image::roll(const ssize_t columns_,const ssize_t rows_)
4212{
4213 MagickCore::Image
4214 *newImage;
4215
4216 GetPPException;
4217 newImage=RollImage(constImage(),columns_, rows_,exceptionInfo);
4218 replaceImage(newImage);
4219 ThrowImageException;
4220}
4221
4222void Magick::Image::rotate(const double degrees_)
4223{
4224 MagickCore::Image
4225 *newImage;
4226
4227 GetPPException;
4228 newImage=RotateImage(constImage(),degrees_,exceptionInfo);
4229 replaceImage(newImage);
4230 ThrowImageException;
4231}
4232
4233void Magick::Image::rotationalBlur(const double angle_)
4234{
4235 MagickCore::Image
4236 *newImage;
4237
4238 GetPPException;
4239 newImage=RotationalBlurImage(constImage(),angle_,exceptionInfo);
4240 replaceImage(newImage);
4241 ThrowImageException;
4242}
4243
4244void Magick::Image::rotationalBlurChannel(const ChannelType channel_,
4245 const double angle_)
4246{
4247 MagickCore::Image
4248 *newImage;
4249
4250 GetPPException;
4251 GetAndSetPPChannelMask(channel_);
4252 newImage=RotationalBlurImage(constImage(),angle_,exceptionInfo);
4253 RestorePPChannelMask;
4254 replaceImage(newImage);
4255 ThrowImageException;
4256}
4257
4258void Magick::Image::sample(const Geometry &geometry_)
4259{
4260 MagickCore::Image
4261 *newImage;
4262
4263 size_t
4264 height=rows(),
4265 width=columns();
4266
4267 ssize_t
4268 x=0,
4269 y=0;
4270
4271 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
4272 &height);
4273
4274 GetPPException;
4275 newImage=SampleImage(constImage(),width,height,exceptionInfo);
4276 replaceImage(newImage);
4277 ThrowImageException;
4278}
4279
4280void Magick::Image::scale(const Geometry &geometry_)
4281{
4282 MagickCore::Image
4283 *newImage;
4284
4285 size_t
4286 height=rows(),
4287 width=columns();
4288
4289 ssize_t
4290 x=0,
4291 y=0;
4292
4293 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
4294 &height);
4295
4296 GetPPException;
4297 newImage=ScaleImage(constImage(),width,height,exceptionInfo);
4298 replaceImage(newImage);
4299 ThrowImageException;
4300}
4301
4302void Magick::Image::segment(const double clusterThreshold_,
4303 const double smoothingThreshold_)
4304{
4305 modifyImage();
4306 GetPPException;
4307 SegmentImage(image(),options()->quantizeColorSpace(),
4308 (MagickBooleanType) options()->verbose(),clusterThreshold_,
4309 smoothingThreshold_,exceptionInfo);
4310 SyncImage(image(),exceptionInfo);
4311 ThrowImageException;
4312}
4313
4314void Magick::Image::selectiveBlur(const double radius_,const double sigma_,
4315 const double threshold_)
4316{
4317 MagickCore::Image
4318 *newImage;
4319
4320 GetPPException;
4321 newImage=SelectiveBlurImage(constImage(),radius_,sigma_,threshold_,
4322 exceptionInfo);
4323 replaceImage(newImage);
4324 ThrowImageException;
4325}
4326
4327void Magick::Image::selectiveBlurChannel(const ChannelType channel_,
4328 const double radius_,const double sigma_,const double threshold_)
4329{
4330 MagickCore::Image
4331 *newImage;
4332
4333 GetPPException;
4334 GetAndSetPPChannelMask(channel_);
4335 newImage=SelectiveBlurImage(constImage(),radius_,sigma_,threshold_,
4336 exceptionInfo);
4337 RestorePPChannelMask;
4338 replaceImage(newImage);
4339 ThrowImageException;
4340}
4341
4342Magick::Image Magick::Image::separate(const ChannelType channel_) const
4343{
4344 MagickCore::Image
4345 *image;
4346
4347 GetPPException;
4348 image=SeparateImage(constImage(),channel_,exceptionInfo);
4349 ThrowImageException;
4350 if (image == (MagickCore::Image *) NULL)
4351 return(Magick::Image());
4352 else
4353 return(Magick::Image(image));
4354}
4355
4356void Magick::Image::sepiaTone(const double threshold_)
4357{
4358 MagickCore::Image
4359 *newImage;
4360
4361 GetPPException;
4362 newImage=SepiaToneImage(constImage(),threshold_,exceptionInfo);
4363 replaceImage(newImage);
4364 ThrowImageException;
4365}
4366
4367bool Magick::Image::setColorMetric(const Image &reference_)
4368{
4369 bool
4370 status;
4371
4372 Image
4373 ref=reference_;
4374
4375 GetPPException;
4376 modifyImage();
4377 status=static_cast<bool>(SetImageColorMetric(image(),ref.constImage(),
4378 exceptionInfo));
4379 ThrowImageException;
4380 return(status);
4381}
4382
4383Magick::Quantum *Magick::Image::setPixels(const ssize_t x_,const ssize_t y_,
4384 const size_t columns_,const size_t rows_)
4385{
4386 Quantum
4387 *result;
4388
4389 modifyImage();
4390 GetPPException;
4391 result=QueueAuthenticPixels(image(),x_,y_,columns_,rows_,exceptionInfo);
4392 ThrowImageException;
4393 return(result);
4394}
4395
4396void Magick::Image::shade(const double azimuth_,const double elevation_,
4397 const bool colorShading_)
4398{
4399 MagickCore::Image
4400 *newImage;
4401
4402 GetPPException;
4403 newImage=ShadeImage(constImage(),colorShading_ == true ?
4404 MagickTrue : MagickFalse,azimuth_,elevation_,exceptionInfo);
4405 replaceImage(newImage);
4406 ThrowImageException;
4407}
4408
4409void Magick::Image::shadow(const double percent_opacity_,const double sigma_,
4410 const ssize_t x_,const ssize_t y_)
4411{
4412 MagickCore::Image
4413 *newImage;
4414
4415 GetPPException;
4416 newImage=ShadowImage(constImage(),percent_opacity_, sigma_,x_, y_,
4417 exceptionInfo);
4418 replaceImage(newImage);
4419 ThrowImageException;
4420}
4421
4422void Magick::Image::sharpen(const double radius_,const double sigma_)
4423{
4424 MagickCore::Image
4425 *newImage;
4426
4427 GetPPException;
4428 newImage=SharpenImage(constImage(),radius_,sigma_,exceptionInfo);
4429 replaceImage(newImage);
4430 ThrowImageException;
4431}
4432
4433void Magick::Image::sharpenChannel(const ChannelType channel_,
4434 const double radius_,const double sigma_)
4435{
4436 MagickCore::Image
4437 *newImage;
4438
4439 GetPPException;
4440 GetAndSetPPChannelMask(channel_);
4441 newImage=SharpenImage(constImage(),radius_,sigma_,exceptionInfo);
4442 RestorePPChannelMask;
4443 replaceImage(newImage);
4444 ThrowImageException;
4445}
4446
4447void Magick::Image::shave(const Geometry &geometry_)
4448{
4449 MagickCore::Image
4450 *newImage;
4451
4452 RectangleInfo
4453 shaveInfo=geometry_;
4454
4455 GetPPException;
4456 newImage=ShaveImage(constImage(),&shaveInfo,exceptionInfo);
4457 replaceImage(newImage);
4458 ThrowImageException;
4459}
4460
4461void Magick::Image::shear(const double xShearAngle_,const double yShearAngle_)
4462{
4463 MagickCore::Image
4464 *newImage;
4465
4466 GetPPException;
4467 newImage=ShearImage(constImage(),xShearAngle_,yShearAngle_,exceptionInfo);
4468 replaceImage(newImage);
4469 ThrowImageException;
4470}
4471
4472void Magick::Image::sigmoidalContrast(const bool sharpen_,
4473 const double contrast,const double midpoint)
4474{
4475 modifyImage();
4476 GetPPException;
4477 (void) SigmoidalContrastImage(image(),(MagickBooleanType) sharpen_,contrast,
4478 midpoint,exceptionInfo);
4479 ThrowImageException;
4480}
4481
4482std::string Magick::Image::signature(const bool force_) const
4483{
4484 return(_imgRef->signature(force_));
4485}
4486
4487void Magick::Image::sketch(const double radius_,const double sigma_,
4488 const double angle_)
4489{
4490 MagickCore::Image
4491 *newImage;
4492
4493 GetPPException;
4494 newImage=SketchImage(constImage(),radius_,sigma_,angle_,exceptionInfo);
4495 replaceImage(newImage);
4496 ThrowImageException;
4497}
4498
4499void Magick::Image::solarize(const double factor_)
4500{
4501 modifyImage();
4502 GetPPException;
4503 SolarizeImage(image(),factor_,exceptionInfo);
4504 ThrowImageException;
4505}
4506
4507void Magick::Image::sparseColor(const ChannelType channel_,
4508 const SparseColorMethod method_,const size_t numberArguments_,
4509 const double *arguments_)
4510{
4511 MagickCore::Image
4512 *newImage;
4513
4514 GetPPException;
4515 GetAndSetPPChannelMask(channel_);
4516 newImage=SparseColorImage(constImage(),method_,numberArguments_,arguments_,
4517 exceptionInfo);
4518 RestorePPChannelMask;
4519 replaceImage(newImage);
4520 ThrowImageException;
4521}
4522
4523void Magick::Image::splice(const Geometry &geometry_)
4524{
4525 MagickCore::Image
4526 *newImage;
4527
4528 RectangleInfo
4529 spliceInfo=geometry_;
4530
4531 GetPPException;
4532 newImage=SpliceImage(constImage(),&spliceInfo,exceptionInfo);
4533 replaceImage(newImage);
4534 ThrowImageException;
4535}
4536
4537void Magick::Image::splice(const Geometry &geometry_,
4538 const Color &backgroundColor_)
4539{
4540 backgroundColor(backgroundColor_);
4541 splice(geometry_);
4542}
4543
4544void Magick::Image::splice(const Geometry &geometry_,
4545 const Color &backgroundColor_,const GravityType gravity_)
4546{
4547 backgroundColor(backgroundColor_);
4548 image()->gravity=gravity_;
4549 splice(geometry_);
4550}
4551
4552void Magick::Image::spread(const double amount_)
4553{
4554 MagickCore::Image
4555 *newImage;
4556
4557 GetPPException;
4558 newImage=SpreadImage(constImage(),image()->interpolate,amount_,exceptionInfo);
4559 replaceImage(newImage);
4560 ThrowImageException;
4561}
4562
4563Magick::ImageStatistics Magick::Image::statistics() const
4564{
4565 return(ImageStatistics(*this));
4566}
4567
4568void Magick::Image::stegano(const Image &watermark_)
4569{
4570 MagickCore::Image
4571 *newImage;
4572
4573 GetPPException;
4574 newImage=SteganoImage(constImage(),watermark_.constImage(),exceptionInfo);
4575 replaceImage(newImage);
4576 ThrowImageException;
4577}
4578
4579void Magick::Image::stereo(const Image &rightImage_)
4580{
4581 MagickCore::Image
4582 *newImage;
4583
4584 GetPPException;
4585 newImage=StereoImage(constImage(),rightImage_.constImage(),exceptionInfo);
4586 replaceImage(newImage);
4587 ThrowImageException;
4588}
4589
4590void Magick::Image::strip(void)
4591{
4592 modifyImage();
4593 GetPPException;
4594 StripImage(image(),exceptionInfo);
4595 ThrowImageException;
4596}
4597
4598Magick::Image Magick::Image::subImageSearch(const Image &reference_,
4599 const MetricType metric_,Geometry *offset_,double *similarityMetric_,
4600 const double similarityThreshold)
4601{
4602 MagickCore::Image
4603 *newImage;
4604
4605 RectangleInfo
4606 offset;
4607
4608 GetPPException;
4609 newImage=SimilarityImage(image(),reference_.constImage(),metric_,
4610 similarityThreshold,&offset,similarityMetric_,exceptionInfo);
4611 ThrowImageException;
4612 if (offset_ != (Geometry *) NULL)
4613 *offset_=offset;
4614 if (newImage == (MagickCore::Image *) NULL)
4615 return(Magick::Image());
4616 else
4617 return(Magick::Image(newImage));
4618}
4619
4620void Magick::Image::swirl(const double degrees_)
4621{
4622 MagickCore::Image
4623 *newImage;
4624
4625 GetPPException;
4626 newImage=SwirlImage(constImage(),degrees_,image()->interpolate,
4627 exceptionInfo);
4628 replaceImage(newImage);
4629 ThrowImageException;
4630}
4631
4632void Magick::Image::syncPixels(void)
4633{
4634 GetPPException;
4635 (void) SyncAuthenticPixels(image(),exceptionInfo);
4636 ThrowImageException;
4637}
4638
4639void Magick::Image::texture(const Image &texture_)
4640{
4641 modifyImage();
4642 GetPPException;
4643 TextureImage(image(),texture_.constImage(),exceptionInfo);
4644 ThrowImageException;
4645}
4646
4647void Magick::Image::threshold(const double threshold_)
4648{
4649 modifyImage();
4650 GetPPException;
4651 BilevelImage(image(),threshold_,exceptionInfo);
4652 ThrowImageException;
4653}
4654
4655void Magick::Image::thumbnail(const Geometry &geometry_)
4656{
4657 MagickCore::Image
4658 *newImage;
4659
4660 size_t
4661 height=rows(),
4662 width=columns();
4663
4664 ssize_t
4665 x=0,
4666 y=0;
4667
4668 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
4669 &height);
4670
4671 GetPPException;
4672 newImage=ThumbnailImage(constImage(),width,height,exceptionInfo);
4673 replaceImage(newImage);
4674 ThrowImageException;
4675}
4676
4677void Magick::Image::tint(const std::string opacity_)
4678{
4679 MagickCore::Image
4680 *newImage;
4681
4682 PixelInfo
4683 color;
4684
4685 GetPPException;
4686 color=static_cast<PixelInfo>(constOptions()->fillColor());
4687 newImage=TintImage(constImage(),opacity_.c_str(),&color,exceptionInfo);
4688 replaceImage(newImage);
4689 ThrowImageException;
4690}
4691
4692void Magick::Image::transformOrigin(const double x_,const double y_)
4693{
4694 modifyImage();
4695 options()->transformOrigin(x_,y_);
4696}
4697
4698void Magick::Image::transformReset(void)
4699{
4700 modifyImage();
4701 options()->transformReset();
4702}
4703
4704void Magick::Image::transformScale(const double sx_,const double sy_)
4705{
4706 modifyImage();
4707 options()->transformScale(sx_,sy_);
4708}
4709
4710void Magick::Image::transparent(const Color &color_,const bool inverse_)
4711{
4712 PixelInfo
4713 target;
4714
4715 std::string
4716 color;
4717
4718 if (!color_.isValid())
4719 throwExceptionExplicit(MagickCore::OptionError,
4720 "Color argument is invalid");
4721
4722 color=color_;
4723 GetPPException;
4724 (void) QueryColorCompliance(color.c_str(),AllCompliance,&target,
4725 exceptionInfo);
4726 modifyImage();
4727 TransparentPaintImage(image(),&target,TransparentAlpha,
4728 inverse_ == true ? MagickTrue : MagickFalse,exceptionInfo);
4729 ThrowImageException;
4730}
4731
4732void Magick::Image::transparentChroma(const Color &colorLow_,
4733 const Color &colorHigh_)
4734{
4735 std::string
4736 colorHigh,
4737 colorLow;
4738
4739 PixelInfo
4740 targetHigh,
4741 targetLow;
4742
4743 if (!colorLow_.isValid() || !colorHigh_.isValid())
4744 throwExceptionExplicit(MagickCore::OptionError,
4745 "Color argument is invalid");
4746
4747 colorLow=colorLow_;
4748 colorHigh=colorHigh_;
4749
4750 GetPPException;
4751 (void) QueryColorCompliance(colorLow.c_str(),AllCompliance,&targetLow,
4752 exceptionInfo);
4753 (void) QueryColorCompliance(colorHigh.c_str(),AllCompliance,&targetHigh,
4754 exceptionInfo);
4755 modifyImage();
4756 TransparentPaintImageChroma(image(),&targetLow,&targetHigh,TransparentAlpha,
4757 MagickFalse,exceptionInfo);
4758 ThrowImageException;
4759}
4760
4761void Magick::Image::transpose(void)
4762{
4763 MagickCore::Image
4764 *newImage;
4765
4766 GetPPException;
4767 newImage=TransposeImage(constImage(),exceptionInfo);
4768 replaceImage(newImage);
4769 ThrowImageException;
4770}
4771
4772void Magick::Image::transverse(void)
4773{
4774 MagickCore::Image
4775 *newImage;
4776
4777 GetPPException;
4778 newImage=TransverseImage(constImage(),exceptionInfo);
4779 replaceImage(newImage);
4780 ThrowImageException;
4781}
4782
4783void Magick::Image::trim(void)
4784{
4785 MagickCore::Image
4786 *newImage;
4787
4788 GetPPException;
4789 newImage=TrimImage(constImage(),exceptionInfo);
4790 replaceImage(newImage);
4791 ThrowImageException;
4792}
4793
4794Magick::Image Magick::Image::uniqueColors(void) const
4795{
4796 MagickCore::Image
4797 *image;
4798
4799 GetPPException;
4800 image=UniqueImageColors(constImage(),exceptionInfo);
4801 ThrowImageException;
4802 if (image == (MagickCore::Image *) NULL)
4803 return(Magick::Image());
4804 else
4805 return(Magick::Image(image));
4806}
4807
4808void Magick::Image::unsharpmask(const double radius_,const double sigma_,
4809 const double amount_,const double threshold_)
4810{
4811 MagickCore::Image
4812 *newImage;
4813
4814 GetPPException;
4815 newImage=UnsharpMaskImage(constImage(),radius_,sigma_,amount_,threshold_,
4816 exceptionInfo);
4817 replaceImage(newImage);
4818 ThrowImageException;
4819}
4820
4821void Magick::Image::unsharpmaskChannel(const ChannelType channel_,
4822 const double radius_,const double sigma_,const double amount_,
4823 const double threshold_)
4824{
4825 MagickCore::Image
4826 *newImage;
4827
4828 GetPPException;
4829 GetAndSetPPChannelMask(channel_);
4830 newImage=UnsharpMaskImage(constImage(),radius_,sigma_,amount_,threshold_,
4831 exceptionInfo);
4832 RestorePPChannelMask;
4833 replaceImage(newImage);
4834 ThrowImageException;
4835}
4836
4837void Magick::Image::vignette(const double radius_,const double sigma_,
4838 const ssize_t x_,const ssize_t y_)
4839{
4840 MagickCore::Image
4841 *newImage;
4842
4843 GetPPException;
4844 newImage=VignetteImage(constImage(),radius_,sigma_,x_,y_,exceptionInfo);
4845 replaceImage(newImage);
4846 ThrowImageException;
4847}
4848
4849void Magick::Image::wave(const double amplitude_,const double wavelength_)
4850{
4851 MagickCore::Image
4852 *newImage;
4853
4854 GetPPException;
4855 newImage=WaveImage(constImage(),amplitude_,wavelength_,image()->interpolate,
4856 exceptionInfo);
4857 replaceImage(newImage);
4858 ThrowImageException;
4859}
4860
4861void Magick::Image::waveletDenoise(const double threshold_,
4862 const double softness_)
4863{
4864 MagickCore::Image
4865 *newImage;
4866
4867 GetPPException;
4868 newImage=WaveletDenoiseImage(constImage(),threshold_,softness_,
4869 exceptionInfo);
4870 replaceImage(newImage);
4871 ThrowImageException;
4872}
4873
4874void Magick::Image::whiteThreshold(const std::string &threshold_)
4875{
4876 modifyImage();
4877 GetPPException;
4878 WhiteThresholdImage(image(),threshold_.c_str(),exceptionInfo);
4879 ThrowImageException;
4880}
4881
4882void Magick::Image::whiteThresholdChannel(const ChannelType channel_,
4883 const std::string &threshold_)
4884{
4885 modifyImage();
4886 GetPPException;
4887 GetAndSetPPChannelMask(channel_);
4888 WhiteThresholdImage(image(),threshold_.c_str(),exceptionInfo);
4889 RestorePPChannelMask;
4890 ThrowImageException;
4891}
4892
4893void Magick::Image::write(Blob *blob_)
4894{
4895 size_t
4896 length=0;
4897
4898 void
4899 *data;
4900
4901 modifyImage();
4902 GetPPException;
4903 data=ImagesToBlob(constImageInfo(),image(),&length,exceptionInfo);
4904 if (length > 0)
4905 blob_->updateNoCopy(data,length,Blob::MallocAllocator);
4906 else
4907 data=RelinquishMagickMemory(data);
4908 ThrowImageException;
4909}
4910
4911void Magick::Image::write(Blob *blob_,const std::string &magick_)
4912{
4913 size_t
4914 length=0;
4915
4916 void
4917 *data;
4918
4919 modifyImage();
4920 magick(magick_);
4921 GetPPException;
4922 data=ImagesToBlob(constImageInfo(),image(),&length,exceptionInfo);
4923 if (length > 0)
4924 blob_->updateNoCopy(data,length,Blob::MallocAllocator);
4925 else
4926 data=RelinquishMagickMemory(data);
4927 ThrowImageException;
4928}
4929
4930void Magick::Image::write(Blob *blob_,const std::string &magick_,
4931 const size_t depth_)
4932{
4933 size_t
4934 length=0;
4935
4936 void
4937 *data;
4938
4939 modifyImage();
4940 magick(magick_);
4941 depth(depth_);
4942 GetPPException;
4943 data=ImagesToBlob(constImageInfo(),image(),&length,exceptionInfo);
4944 if (length > 0)
4945 blob_->updateNoCopy(data,length,Blob::MallocAllocator);
4946 else
4947 data=RelinquishMagickMemory(data);
4948 ThrowImageException;
4949}
4950
4951void Magick::Image::write(const ssize_t x_,const ssize_t y_,
4952 const size_t columns_,const size_t rows_,const std::string &map_,
4953 const StorageType type_,void *pixels_)
4954{
4955 GetPPException;
4956 ExportImagePixels(image(),x_,y_,columns_,rows_,map_.c_str(),type_,pixels_,
4957 exceptionInfo);
4958 ThrowImageException;
4959}
4960
4961void Magick::Image::write(const std::string &imageSpec_)
4962{
4963 modifyImage();
4964 fileName(imageSpec_);
4965 GetPPException;
4966 WriteImage(constImageInfo(),image(),exceptionInfo);
4967 ThrowImageException;
4968}
4969
4970void Magick::Image::writeMask(const Magick::Image &mask_)
4971{
4972 mask(mask_,WritePixelMask);
4973}
4974
4975Magick::Image Magick::Image::writeMask(void) const
4976{
4977 return(mask(WritePixelMask));
4978}
4979
4980void Magick::Image::writePixels(const Magick::QuantumType quantum_,
4981 unsigned char *destination_)
4982{
4983 QuantumInfo
4984 *quantum_info;
4985
4986 quantum_info=AcquireQuantumInfo(imageInfo(),image());
4987 GetPPException;
4988 ExportQuantumPixels(image(),(MagickCore::CacheView *) NULL,quantum_info,
4989 quantum_,destination_, exceptionInfo);
4990 quantum_info=DestroyQuantumInfo(quantum_info);
4991 ThrowImageException;
4992}
4993
4994void Magick::Image::zoom(const Geometry &geometry_)
4995{
4996 MagickCore::Image
4997 *newImage;
4998
4999 size_t
5000 height=rows(),
5001 width=columns();
5002
5003 ssize_t
5004 x=0,
5005 y=0;
5006
5007 ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
5008 &height);
5009
5010 GetPPException;
5011 newImage=ResizeImage(constImage(),width,height,image()->filter,exceptionInfo);
5012 replaceImage(newImage);
5013 ThrowImageException;
5014}
5015
5016Magick::Image::Image(MagickCore::Image *image_)
5017 : _imgRef(new ImageRef(image_))
5018{
5019}
5020
5021MagickCore::Image *&Magick::Image::image(void)
5022{
5023 return(_imgRef->image());
5024}
5025
5026const MagickCore::Image *Magick::Image::constImage(void) const
5027{
5028 return(_imgRef->image());
5029}
5030
5031MagickCore::ImageInfo *Magick::Image::imageInfo(void)
5032{
5033 return(_imgRef->options()->imageInfo());
5034}
5035
5036const MagickCore::ImageInfo *Magick::Image::constImageInfo(void) const
5037{
5038 return(_imgRef->options()->imageInfo());
5039}
5040
5041Magick::Options *Magick::Image::options(void)
5042{
5043 return(_imgRef->options());
5044}
5045
5046const Magick::Options *Magick::Image::constOptions(void) const
5047{
5048 return(_imgRef->options());
5049}
5050
5051MagickCore::QuantizeInfo *Magick::Image::quantizeInfo(void)
5052{
5053 return(_imgRef->options()->quantizeInfo());
5054}
5055
5056const MagickCore::QuantizeInfo *Magick::Image::constQuantizeInfo(void) const
5057{
5058 return(_imgRef->options()->quantizeInfo());
5059}
5060
5061void Magick::Image::modifyImage(void)
5062{
5063 if (!_imgRef->isShared())
5064 return;
5065
5066 GetPPException;
5067 replaceImage(CloneImage(image(),0,0,MagickTrue,exceptionInfo));
5068 ThrowImageException;
5069}
5070
5071MagickCore::Image *Magick::Image::replaceImage(MagickCore::Image *replacement_)
5072{
5073 MagickCore::Image
5074 *image;
5075
5076 if (replacement_)
5077 image=replacement_;
5078 else
5079 {
5080 GetPPException;
5081 image=AcquireImage(constImageInfo(),exceptionInfo);
5082 ThrowImageException;
5083 }
5084
5085 _imgRef=ImageRef::replaceImage(_imgRef,image);
5086 return(image);
5087}
5088
5089void Magick::Image::read(MagickCore::Image *image,
5090 MagickCore::ExceptionInfo *exceptionInfo)
5091{
5092 // Ensure that multiple image frames were not read.
5093 if (image != (MagickCore::Image *) NULL &&
5094 image->next != (MagickCore::Image *) NULL)
5095 {
5096 MagickCore::Image
5097 *next;
5098
5099 // Destroy any extra image frames
5100 next=image->next;
5101 image->next=(MagickCore::Image *) NULL;
5102 next->previous=(MagickCore::Image *) NULL;
5103 DestroyImageList(next);
5104 }
5105 replaceImage(image);
5106 if (exceptionInfo->severity == MagickCore::UndefinedException &&
5107 image == (MagickCore::Image *) NULL)
5108 {
5109 (void) MagickCore::DestroyExceptionInfo(exceptionInfo);
5110 if (!quiet())
5111 throwExceptionExplicit(MagickCore::ImageWarning,
5112 "No image was loaded.");
5113 return;
5114 }
5115 ThrowImageException;
5116}
5117
5118void Magick::Image::floodFill(const ssize_t x_,const ssize_t y_,
5119 const Magick::Image *fillPattern_,const Magick::Color &fill_,
5120 const MagickCore::PixelInfo *target_,const bool invert_)
5121{
5122 Magick::Color
5123 fillColor;
5124
5125 MagickCore::Image
5126 *fillPattern;
5127
5128 // Set drawing fill pattern or fill color
5129 fillColor=options()->fillColor();
5130 fillPattern=(MagickCore::Image *)NULL;
5131 if (options()->fillPattern() != (MagickCore::Image *)NULL)
5132 {
5133 GetPPException;
5134 fillPattern=CloneImage(options()->fillPattern(),0,0,MagickTrue,
5135 exceptionInfo);
5136 ThrowImageException;
5137 }
5138
5139 if (fillPattern_ == (Magick::Image *)NULL)
5140 {
5141 options()->fillPattern((MagickCore::Image *)NULL);
5142 options()->fillColor(fill_);
5143 }
5144 else
5145 options()->fillPattern(fillPattern_->constImage());
5146
5147 GetPPException;
5148 (void) FloodfillPaintImage(image(),options()->drawInfo(),
5149 target_,static_cast<ssize_t>(x_),static_cast<ssize_t>(y_),
5150 (MagickBooleanType) invert_,exceptionInfo);
5151
5152 options()->fillColor(fillColor);
5153 options()->fillPattern(fillPattern);
5154 ThrowImageException;
5155}
5156
5157void Magick::Image::mask(const Magick::Image &mask_,const PixelMask type)
5158{
5159 modifyImage();
5160
5161 GetPPException;
5162 if (mask_.isValid())
5163 SetImageMask(image(),type,mask_.constImage(),exceptionInfo);
5164 else
5165 SetImageMask(image(),type,(MagickCore::Image *) NULL,exceptionInfo);
5166 ThrowImageException;
5167}
5168
5169Magick::Image Magick::Image::mask(const PixelMask type) const
5170{
5171 MagickCore::Image
5172 *image;
5173
5174 GetPPException;
5175 image = GetImageMask(constImage(),type,exceptionInfo);
5176 ThrowImageException;
5177
5178 if (image == (MagickCore::Image *) NULL)
5179 return(Magick::Image());
5180 else
5181 return(Magick::Image(image));
5182}