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