You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
5171 lines
114 KiB
5171 lines
114 KiB
// This may look like C code, but it is really -*- C++ -*-
|
|
//
|
|
// Copyright Bob Friesenhahn, 1999, 2000, 2001, 2002, 2003
|
|
// Copyright Dirk Lemstra 2013-2017
|
|
//
|
|
// Implementation of Image
|
|
//
|
|
|
|
#define MAGICKCORE_IMPLEMENTATION 1
|
|
#define MAGICK_PLUSPLUS_IMPLEMENTATION 1
|
|
|
|
#include "Magick++/Include.h"
|
|
#include <cstdlib>
|
|
#include <string>
|
|
#include <string.h>
|
|
#include <errno.h>
|
|
#include <math.h>
|
|
|
|
using namespace std;
|
|
|
|
#include "Magick++/Image.h"
|
|
#include "Magick++/Functions.h"
|
|
#include "Magick++/Pixels.h"
|
|
#include "Magick++/Options.h"
|
|
#include "Magick++/ImageRef.h"
|
|
|
|
#define AbsoluteValue(x) ((x) < 0 ? -(x) : (x))
|
|
#define MagickPI 3.14159265358979323846264338327950288419716939937510
|
|
#define DegreesToRadians(x) (MagickPI*(x)/180.0)
|
|
#define ThrowImageException ThrowPPException(quiet())
|
|
|
|
MagickPPExport const char *Magick::borderGeometryDefault="6x6+0+0";
|
|
MagickPPExport const char *Magick::frameGeometryDefault="25x25+6+6";
|
|
MagickPPExport const char *Magick::raiseGeometryDefault="6x6+0+0";
|
|
|
|
MagickPPExport int Magick::operator == (const Magick::Image &left_,
|
|
const Magick::Image &right_)
|
|
{
|
|
// If image pixels and signature are the same, then the image is identical
|
|
return((left_.rows() == right_.rows()) &&
|
|
(left_.columns() == right_.columns()) &&
|
|
(left_.signature() == right_.signature()));
|
|
}
|
|
|
|
MagickPPExport int Magick::operator != (const Magick::Image &left_,
|
|
const Magick::Image &right_)
|
|
{
|
|
return(!(left_ == right_));
|
|
}
|
|
|
|
MagickPPExport int Magick::operator > (const Magick::Image &left_,
|
|
const Magick::Image &right_)
|
|
{
|
|
return(!(left_ < right_) && (left_ != right_));
|
|
}
|
|
|
|
MagickPPExport int Magick::operator < (const Magick::Image &left_,
|
|
const Magick::Image &right_)
|
|
{
|
|
// If image pixels are less, then image is smaller
|
|
return((left_.rows() * left_.columns()) <
|
|
(right_.rows() * right_.columns()));
|
|
}
|
|
|
|
MagickPPExport int Magick::operator >= (const Magick::Image &left_,
|
|
const Magick::Image &right_)
|
|
{
|
|
return((left_ > right_) || (left_ == right_));
|
|
}
|
|
|
|
MagickPPExport int Magick::operator <= (const Magick::Image &left_,
|
|
const Magick::Image &right_)
|
|
{
|
|
return((left_ < right_) || ( left_ == right_));
|
|
}
|
|
|
|
Magick::Image::Image(void)
|
|
: _imgRef(new ImageRef)
|
|
{
|
|
}
|
|
|
|
Magick::Image::Image(const Blob &blob_)
|
|
: _imgRef(new ImageRef)
|
|
{
|
|
try
|
|
{
|
|
// Initialize, Allocate and Read images
|
|
quiet(true);
|
|
read(blob_);
|
|
quiet(false);
|
|
}
|
|
catch (const Error&)
|
|
{
|
|
// Release resources
|
|
delete _imgRef;
|
|
throw;
|
|
}
|
|
}
|
|
|
|
Magick::Image::Image(const Blob &blob_,const Geometry &size_)
|
|
: _imgRef(new ImageRef)
|
|
{
|
|
try
|
|
{
|
|
// Read from Blob
|
|
quiet(true);
|
|
read(blob_, size_);
|
|
quiet(false);
|
|
}
|
|
catch(const Error&)
|
|
{
|
|
// Release resources
|
|
delete _imgRef;
|
|
throw;
|
|
}
|
|
}
|
|
|
|
Magick::Image::Image(const Blob &blob_,const Geometry &size_,
|
|
const size_t depth_)
|
|
: _imgRef(new ImageRef)
|
|
{
|
|
try
|
|
{
|
|
// Read from Blob
|
|
quiet(true);
|
|
read(blob_,size_,depth_);
|
|
quiet(false);
|
|
}
|
|
catch(const Error&)
|
|
{
|
|
// Release resources
|
|
delete _imgRef;
|
|
throw;
|
|
}
|
|
}
|
|
|
|
Magick::Image::Image(const Blob &blob_,const Geometry &size_,
|
|
const size_t depth_,const std::string &magick_)
|
|
: _imgRef(new ImageRef)
|
|
{
|
|
try
|
|
{
|
|
// Read from Blob
|
|
quiet(true);
|
|
read(blob_,size_,depth_,magick_);
|
|
quiet(false);
|
|
}
|
|
catch(const Error&)
|
|
{
|
|
// Release resources
|
|
delete _imgRef;
|
|
throw;
|
|
}
|
|
}
|
|
|
|
Magick::Image::Image(const Blob &blob_,const Geometry &size_,
|
|
const std::string &magick_)
|
|
: _imgRef(new ImageRef)
|
|
{
|
|
try
|
|
{
|
|
// Read from Blob
|
|
quiet(true);
|
|
read(blob_,size_,magick_);
|
|
quiet(false);
|
|
}
|
|
catch(const Error&)
|
|
{
|
|
// Release resources
|
|
delete _imgRef;
|
|
throw;
|
|
}
|
|
}
|
|
|
|
Magick::Image::Image(const Geometry &size_,const Color &color_)
|
|
: _imgRef(new ImageRef)
|
|
{
|
|
// xc: prefix specifies an X11 color string
|
|
std::string imageSpec("xc:");
|
|
imageSpec+=color_;
|
|
|
|
try
|
|
{
|
|
quiet(true);
|
|
// Set image size
|
|
size(size_);
|
|
|
|
// Initialize, Allocate and Read images
|
|
read(imageSpec);
|
|
quiet(false);
|
|
}
|
|
catch(const Error&)
|
|
{
|
|
// Release resources
|
|
delete _imgRef;
|
|
throw;
|
|
}
|
|
}
|
|
|
|
Magick::Image::Image(const Image &image_)
|
|
: _imgRef(image_._imgRef)
|
|
{
|
|
_imgRef->increase();
|
|
}
|
|
|
|
Magick::Image::Image(const Image &image_,const Geometry &geometry_)
|
|
: _imgRef(new ImageRef)
|
|
{
|
|
const RectangleInfo
|
|
geometry=geometry_;
|
|
|
|
OffsetInfo
|
|
offset;
|
|
|
|
MagickCore::Image
|
|
*image;
|
|
|
|
GetPPException;
|
|
image=CloneImage(image_.constImage(),geometry_.width(),geometry_.height(),
|
|
MagickTrue,exceptionInfo);
|
|
replaceImage(image);
|
|
_imgRef->options(new Options(*image_.constOptions()));
|
|
offset.x=0;
|
|
offset.y=0;
|
|
(void) CopyImagePixels(image,image_.constImage(),&geometry,&offset,
|
|
exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
Magick::Image::Image(const size_t width_,const size_t height_,
|
|
const std::string &map_,const StorageType type_,const void *pixels_)
|
|
: _imgRef(new ImageRef)
|
|
{
|
|
try
|
|
{
|
|
quiet(true);
|
|
read(width_,height_,map_.c_str(),type_,pixels_);
|
|
quiet(false);
|
|
}
|
|
catch(const Error&)
|
|
{
|
|
// Release resources
|
|
delete _imgRef;
|
|
throw;
|
|
}
|
|
}
|
|
|
|
Magick::Image::Image(const std::string &imageSpec_)
|
|
: _imgRef(new ImageRef)
|
|
{
|
|
try
|
|
{
|
|
// Initialize, Allocate and Read images
|
|
quiet(true);
|
|
read(imageSpec_);
|
|
quiet(false);
|
|
}
|
|
catch(const Error&)
|
|
{
|
|
// Release resources
|
|
delete _imgRef;
|
|
throw;
|
|
}
|
|
}
|
|
|
|
Magick::Image::~Image()
|
|
{
|
|
try
|
|
{
|
|
if (_imgRef->decrease() == 0)
|
|
delete _imgRef;
|
|
}
|
|
catch(Magick::Exception&)
|
|
{
|
|
}
|
|
|
|
_imgRef=(Magick::ImageRef *) NULL;
|
|
}
|
|
|
|
Magick::Image& Magick::Image::operator=(const Magick::Image &image_)
|
|
{
|
|
if (this != &image_)
|
|
{
|
|
image_._imgRef->increase();
|
|
if (_imgRef->decrease() == 0)
|
|
delete _imgRef;
|
|
|
|
// Use new image reference
|
|
_imgRef=image_._imgRef;
|
|
}
|
|
return(*this);
|
|
}
|
|
|
|
void Magick::Image::adjoin(const bool flag_)
|
|
{
|
|
modifyImage();
|
|
options()->adjoin(flag_);
|
|
}
|
|
|
|
bool Magick::Image::adjoin(void) const
|
|
{
|
|
return(constOptions()->adjoin());
|
|
}
|
|
|
|
void Magick::Image::alpha(const bool alphaFlag_)
|
|
{
|
|
modifyImage();
|
|
|
|
// If matte channel is requested, but image doesn't already have a
|
|
// matte channel, then create an opaque matte channel. Likewise, if
|
|
// the image already has a matte channel but a matte channel is not
|
|
// desired, then set the matte channel to opaque.
|
|
GetPPException;
|
|
if (bool(alphaFlag_) != bool(constImage()->alpha_trait))
|
|
SetImageAlpha(image(),OpaqueAlpha,exceptionInfo);
|
|
ThrowImageException;
|
|
|
|
image()->alpha_trait=alphaFlag_ ? BlendPixelTrait : UndefinedPixelTrait;
|
|
}
|
|
|
|
bool Magick::Image::alpha(void) const
|
|
{
|
|
if (constImage()->alpha_trait == BlendPixelTrait)
|
|
return(true);
|
|
else
|
|
return(false);
|
|
}
|
|
|
|
void Magick::Image::matteColor(const Color &matteColor_)
|
|
{
|
|
modifyImage();
|
|
|
|
if (matteColor_.isValid())
|
|
{
|
|
image()->matte_color=matteColor_;
|
|
options()->matteColor(matteColor_);
|
|
}
|
|
else
|
|
{
|
|
// Set to default matte color
|
|
Color tmpColor("#BDBDBD");
|
|
image()->matte_color=tmpColor;
|
|
options()->matteColor(tmpColor);
|
|
}
|
|
}
|
|
|
|
Magick::Color Magick::Image::matteColor(void) const
|
|
{
|
|
return(Color(constImage()->matte_color));
|
|
}
|
|
|
|
void Magick::Image::animationDelay(const size_t delay_)
|
|
{
|
|
modifyImage();
|
|
image()->delay=delay_;
|
|
}
|
|
|
|
size_t Magick::Image::animationDelay(void) const
|
|
{
|
|
return(constImage()->delay);
|
|
}
|
|
|
|
void Magick::Image::animationIterations(const size_t iterations_)
|
|
{
|
|
modifyImage();
|
|
image()->iterations=iterations_;
|
|
}
|
|
|
|
size_t Magick::Image::animationIterations(void) const
|
|
{
|
|
return(constImage()->iterations);
|
|
}
|
|
|
|
void Magick::Image::backgroundColor(const Color &backgroundColor_)
|
|
{
|
|
modifyImage();
|
|
|
|
if (backgroundColor_.isValid())
|
|
image()->background_color=backgroundColor_;
|
|
else
|
|
image()->background_color=Color();
|
|
|
|
options()->backgroundColor(backgroundColor_);
|
|
}
|
|
|
|
Magick::Color Magick::Image::backgroundColor(void) const
|
|
{
|
|
return(constOptions()->backgroundColor());
|
|
}
|
|
|
|
void Magick::Image::backgroundTexture(const std::string &backgroundTexture_)
|
|
{
|
|
modifyImage();
|
|
options()->backgroundTexture(backgroundTexture_);
|
|
}
|
|
|
|
std::string Magick::Image::backgroundTexture(void) const
|
|
{
|
|
return(constOptions()->backgroundTexture());
|
|
}
|
|
|
|
size_t Magick::Image::baseColumns(void) const
|
|
{
|
|
return(constImage()->magick_columns);
|
|
}
|
|
|
|
std::string Magick::Image::baseFilename(void) const
|
|
{
|
|
return(std::string(constImage()->magick_filename));
|
|
}
|
|
|
|
size_t Magick::Image::baseRows(void) const
|
|
{
|
|
return(constImage()->magick_rows);
|
|
}
|
|
|
|
void Magick::Image::blackPointCompensation(const bool flag_)
|
|
{
|
|
image()->black_point_compensation=(MagickBooleanType) flag_;
|
|
}
|
|
|
|
bool Magick::Image::blackPointCompensation(void) const
|
|
{
|
|
return(static_cast<bool>(constImage()->black_point_compensation));
|
|
}
|
|
|
|
void Magick::Image::borderColor(const Color &borderColor_)
|
|
{
|
|
modifyImage();
|
|
|
|
if (borderColor_.isValid())
|
|
image()->border_color=borderColor_;
|
|
else
|
|
image()->border_color=Color();
|
|
|
|
options()->borderColor(borderColor_);
|
|
}
|
|
|
|
Magick::Color Magick::Image::borderColor(void) const
|
|
{
|
|
return(constOptions()->borderColor());
|
|
}
|
|
|
|
Magick::Geometry Magick::Image::boundingBox(void) const
|
|
{
|
|
RectangleInfo
|
|
bbox;
|
|
|
|
GetPPException;
|
|
bbox=GetImageBoundingBox(constImage(),exceptionInfo);
|
|
ThrowImageException;
|
|
return(Geometry(bbox));
|
|
}
|
|
|
|
void Magick::Image::boxColor(const Color &boxColor_)
|
|
{
|
|
modifyImage();
|
|
options()->boxColor(boxColor_);
|
|
}
|
|
|
|
Magick::Color Magick::Image::boxColor(void) const
|
|
{
|
|
return(constOptions()->boxColor());
|
|
}
|
|
|
|
void Magick::Image::channelDepth(const ChannelType channel_,
|
|
const size_t depth_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
SetImageDepth(image(),depth_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
size_t Magick::Image::channelDepth(const ChannelType channel_)
|
|
{
|
|
size_t
|
|
channel_depth;
|
|
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
channel_depth=GetImageDepth(constImage(),exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
return(channel_depth);
|
|
}
|
|
|
|
size_t Magick::Image::channels() const
|
|
{
|
|
return(constImage()->number_channels);
|
|
}
|
|
|
|
void Magick::Image::classType(const ClassType class_)
|
|
{
|
|
if (classType() == PseudoClass && class_ == DirectClass)
|
|
{
|
|
// Use SyncImage to synchronize the DirectClass pixels with the
|
|
// color map and then set to DirectClass type.
|
|
modifyImage();
|
|
GetPPException;
|
|
SyncImage(image(),exceptionInfo);
|
|
ThrowImageException;
|
|
image()->colormap=(PixelInfo *)RelinquishMagickMemory(image()->colormap);
|
|
image()->storage_class=static_cast<MagickCore::ClassType>(DirectClass);
|
|
return;
|
|
}
|
|
|
|
if (classType() == DirectClass && class_ == PseudoClass)
|
|
{
|
|
// Quantize to create PseudoClass color map
|
|
modifyImage();
|
|
quantizeColors(MaxColormapSize);
|
|
quantize();
|
|
image()->storage_class=static_cast<MagickCore::ClassType>(PseudoClass);
|
|
}
|
|
}
|
|
|
|
Magick::ClassType Magick::Image::classType(void) const
|
|
{
|
|
return static_cast<Magick::ClassType>(constImage()->storage_class);
|
|
}
|
|
|
|
void Magick::Image::colorFuzz(const double fuzz_)
|
|
{
|
|
modifyImage();
|
|
image()->fuzz=fuzz_;
|
|
options()->colorFuzz(fuzz_);
|
|
}
|
|
|
|
double Magick::Image::colorFuzz(void) const
|
|
{
|
|
return(constOptions()->colorFuzz());
|
|
}
|
|
|
|
void Magick::Image::colorMapSize(const size_t entries_)
|
|
{
|
|
if (entries_ >MaxColormapSize)
|
|
throwExceptionExplicit(MagickCore::OptionError,
|
|
"Colormap entries must not exceed MaxColormapSize");
|
|
|
|
modifyImage();
|
|
GetPPException;
|
|
(void) AcquireImageColormap(image(),entries_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
size_t Magick::Image::colorMapSize(void) const
|
|
{
|
|
if (!constImage()->colormap)
|
|
throwExceptionExplicit(MagickCore::OptionError,
|
|
"Image does not contain a colormap");
|
|
|
|
return(constImage()->colors);
|
|
}
|
|
|
|
void Magick::Image::colorSpace(const ColorspaceType colorSpace_)
|
|
{
|
|
if (image()->colorspace == colorSpace_)
|
|
return;
|
|
|
|
modifyImage();
|
|
GetPPException;
|
|
TransformImageColorspace(image(),colorSpace_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
Magick::ColorspaceType Magick::Image::colorSpace(void) const
|
|
{
|
|
return (constImage()->colorspace);
|
|
}
|
|
|
|
void Magick::Image::colorSpaceType(const ColorspaceType colorSpace_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
SetImageColorspace(image(),colorSpace_,exceptionInfo);
|
|
ThrowImageException;
|
|
options()->colorspaceType(colorSpace_);
|
|
}
|
|
|
|
Magick::ColorspaceType Magick::Image::colorSpaceType(void) const
|
|
{
|
|
return(constOptions()->colorspaceType());
|
|
}
|
|
|
|
size_t Magick::Image::columns(void) const
|
|
{
|
|
return(constImage()->columns);
|
|
}
|
|
|
|
void Magick::Image::comment(const std::string &comment_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
SetImageProperty(image(),"Comment",NULL,exceptionInfo);
|
|
if (comment_.length() > 0)
|
|
SetImageProperty(image(),"Comment",comment_.c_str(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
std::string Magick::Image::comment(void) const
|
|
{
|
|
const char
|
|
*value;
|
|
|
|
GetPPException;
|
|
value=GetImageProperty(constImage(),"Comment",exceptionInfo);
|
|
ThrowImageException;
|
|
|
|
if (value)
|
|
return(std::string(value));
|
|
|
|
return(std::string()); // Intentionally no exception
|
|
}
|
|
|
|
void Magick::Image::compose(const CompositeOperator compose_)
|
|
{
|
|
image()->compose=compose_;
|
|
}
|
|
|
|
Magick::CompositeOperator Magick::Image::compose(void) const
|
|
{
|
|
return(constImage()->compose);
|
|
}
|
|
|
|
void Magick::Image::compressType(const CompressionType compressType_)
|
|
{
|
|
modifyImage();
|
|
image()->compression=compressType_;
|
|
options()->compressType(compressType_);
|
|
}
|
|
|
|
Magick::CompressionType Magick::Image::compressType(void) const
|
|
{
|
|
return(constImage()->compression);
|
|
}
|
|
|
|
void Magick::Image::debug(const bool flag_)
|
|
{
|
|
modifyImage();
|
|
options()->debug(flag_);
|
|
}
|
|
|
|
bool Magick::Image::debug(void) const
|
|
{
|
|
return(constOptions()->debug());
|
|
}
|
|
|
|
void Magick::Image::density(const Point &density_)
|
|
{
|
|
modifyImage();
|
|
options()->density(density_);
|
|
if (density_.isValid())
|
|
{
|
|
image()->resolution.x=density_.x();
|
|
if (density_.y() != 0.0)
|
|
image()->resolution.y=density_.y();
|
|
else
|
|
image()->resolution.y=density_.x();
|
|
}
|
|
else
|
|
{
|
|
// Reset to default
|
|
image()->resolution.x=0.0;
|
|
image()->resolution.y=0.0;
|
|
}
|
|
}
|
|
|
|
Magick::Point Magick::Image::density(void) const
|
|
{
|
|
if (isValid())
|
|
{
|
|
ssize_t
|
|
x_resolution=72,
|
|
y_resolution=72;
|
|
|
|
if (constImage()->resolution.x > 0.0)
|
|
x_resolution=constImage()->resolution.x;
|
|
|
|
if (constImage()->resolution.y > 0.0)
|
|
y_resolution=constImage()->resolution.y;
|
|
|
|
return(Point(x_resolution,y_resolution));
|
|
}
|
|
|
|
return(constOptions()->density());
|
|
}
|
|
|
|
void Magick::Image::depth(const size_t depth_)
|
|
{
|
|
modifyImage();
|
|
image()->depth=depth_;
|
|
options()->depth(depth_);
|
|
}
|
|
|
|
size_t Magick::Image::depth(void) const
|
|
{
|
|
return(constImage()->depth);
|
|
}
|
|
|
|
std::string Magick::Image::directory(void) const
|
|
{
|
|
if (constImage()->directory)
|
|
return(std::string(constImage()->directory));
|
|
|
|
if (!quiet())
|
|
throwExceptionExplicit(MagickCore::CorruptImageWarning,
|
|
"Image does not contain a directory");
|
|
|
|
return(std::string());
|
|
}
|
|
|
|
void Magick::Image::endian(const Magick::EndianType endian_)
|
|
{
|
|
modifyImage();
|
|
options()->endian(endian_);
|
|
image()->endian=endian_;
|
|
}
|
|
|
|
Magick::EndianType Magick::Image::endian(void) const
|
|
{
|
|
return(constImage()->endian);
|
|
}
|
|
|
|
void Magick::Image::exifProfile(const Magick::Blob &exifProfile_)
|
|
{
|
|
modifyImage();
|
|
|
|
if (exifProfile_.data() != 0)
|
|
{
|
|
StringInfo
|
|
*exif_profile;
|
|
|
|
exif_profile=AcquireStringInfo(exifProfile_.length());
|
|
SetStringInfoDatum(exif_profile,(unsigned char *) exifProfile_.data());
|
|
GetPPException;
|
|
(void) SetImageProfile(image(),"exif",exif_profile,exceptionInfo);
|
|
exif_profile=DestroyStringInfo(exif_profile);
|
|
ThrowImageException;
|
|
}
|
|
}
|
|
|
|
Magick::Blob Magick::Image::exifProfile(void) const
|
|
{
|
|
const StringInfo
|
|
*exif_profile;
|
|
|
|
exif_profile=GetImageProfile(constImage(),"exif");
|
|
if (exif_profile == (StringInfo *) NULL)
|
|
return(Blob());
|
|
return(Blob(GetStringInfoDatum(exif_profile),
|
|
GetStringInfoLength(exif_profile)));
|
|
}
|
|
|
|
void Magick::Image::fileName(const std::string &fileName_)
|
|
{
|
|
ssize_t
|
|
max_length;
|
|
|
|
modifyImage();
|
|
|
|
max_length=sizeof(image()->filename)-1;
|
|
fileName_.copy(image()->filename,max_length);
|
|
if ((ssize_t) fileName_.length() > max_length)
|
|
image()->filename[max_length]=0;
|
|
else
|
|
image()->filename[fileName_.length()]=0;
|
|
|
|
options()->fileName(fileName_);
|
|
}
|
|
|
|
std::string Magick::Image::fileName(void) const
|
|
{
|
|
return(constOptions()->fileName());
|
|
}
|
|
|
|
MagickCore::MagickSizeType Magick::Image::fileSize(void) const
|
|
{
|
|
return(GetBlobSize(constImage()));
|
|
}
|
|
|
|
void Magick::Image::fillColor(const Magick::Color &fillColor_)
|
|
{
|
|
modifyImage();
|
|
options()->fillColor(fillColor_);
|
|
}
|
|
|
|
Magick::Color Magick::Image::fillColor(void) const
|
|
{
|
|
return(constOptions()->fillColor());
|
|
}
|
|
|
|
void Magick::Image::fillRule(const Magick::FillRule &fillRule_)
|
|
{
|
|
modifyImage();
|
|
options()->fillRule(fillRule_);
|
|
}
|
|
|
|
Magick::FillRule Magick::Image::fillRule(void) const
|
|
{
|
|
return constOptions()->fillRule();
|
|
}
|
|
|
|
void Magick::Image::fillPattern(const Image &fillPattern_)
|
|
{
|
|
modifyImage();
|
|
if (fillPattern_.isValid())
|
|
options()->fillPattern(fillPattern_.constImage());
|
|
else
|
|
options()->fillPattern(static_cast<MagickCore::Image*>(NULL));
|
|
}
|
|
|
|
Magick::Image Magick::Image::fillPattern(void) const
|
|
{
|
|
// FIXME: This is inordinately innefficient
|
|
const MagickCore::Image
|
|
*tmpTexture;
|
|
|
|
Image
|
|
texture;
|
|
|
|
tmpTexture=constOptions()->fillPattern();
|
|
|
|
if (tmpTexture)
|
|
{
|
|
MagickCore::Image
|
|
*image;
|
|
|
|
GetPPException;
|
|
image=CloneImage(tmpTexture,0,0,MagickTrue,exceptionInfo);
|
|
texture.replaceImage(image);
|
|
ThrowImageException;
|
|
}
|
|
return(texture);
|
|
}
|
|
|
|
void Magick::Image::filterType(const Magick::FilterType filterType_)
|
|
{
|
|
modifyImage();
|
|
image()->filter=filterType_;
|
|
}
|
|
|
|
Magick::FilterType Magick::Image::filterType(void) const
|
|
{
|
|
return(constImage()->filter);
|
|
}
|
|
|
|
void Magick::Image::font(const std::string &font_)
|
|
{
|
|
modifyImage();
|
|
options()->font(font_);
|
|
}
|
|
|
|
std::string Magick::Image::font(void) const
|
|
{
|
|
return(constOptions()->font());
|
|
}
|
|
|
|
void Magick::Image::fontFamily(const std::string &family_)
|
|
{
|
|
modifyImage();
|
|
options()->fontFamily(family_);
|
|
}
|
|
|
|
std::string Magick::Image::fontFamily(void) const
|
|
{
|
|
return(constOptions()->fontFamily());
|
|
}
|
|
|
|
void Magick::Image::fontPointsize(const double pointSize_)
|
|
{
|
|
modifyImage();
|
|
options()->fontPointsize(pointSize_);
|
|
}
|
|
|
|
double Magick::Image::fontPointsize(void) const
|
|
{
|
|
return(constOptions()->fontPointsize());
|
|
}
|
|
|
|
void Magick::Image::fontStyle(const StyleType pointSize_)
|
|
{
|
|
modifyImage();
|
|
options()->fontStyle(pointSize_);
|
|
}
|
|
|
|
Magick::StyleType Magick::Image::fontStyle(void) const
|
|
{
|
|
return(constOptions()->fontStyle());
|
|
}
|
|
|
|
void Magick::Image::fontWeight(const size_t weight_)
|
|
{
|
|
modifyImage();
|
|
options()->fontWeight(weight_);
|
|
}
|
|
|
|
size_t Magick::Image::fontWeight(void) const
|
|
{
|
|
return(constOptions()->fontWeight());
|
|
}
|
|
|
|
std::string Magick::Image::format(void) const
|
|
{
|
|
const MagickInfo
|
|
*magick_info;
|
|
|
|
GetPPException;
|
|
magick_info=GetMagickInfo(constImage()->magick,exceptionInfo);
|
|
ThrowImageException;
|
|
|
|
if ((magick_info != 0) && (*magick_info->description != '\0'))
|
|
return(std::string(magick_info->description));
|
|
|
|
if (!quiet())
|
|
throwExceptionExplicit(MagickCore::CorruptImageWarning,
|
|
"Unrecognized image magick type");
|
|
|
|
return(std::string());
|
|
}
|
|
|
|
std::string Magick::Image::formatExpression(const std::string expression)
|
|
{
|
|
char
|
|
*text;
|
|
|
|
std::string
|
|
text_string;
|
|
|
|
GetPPException;
|
|
modifyImage();
|
|
text=InterpretImageProperties(imageInfo(),image(),expression.c_str(),
|
|
exceptionInfo);
|
|
if (text != (char *) NULL)
|
|
{
|
|
text_string=std::string(text);
|
|
text=DestroyString(text);
|
|
}
|
|
ThrowImageException;
|
|
return(text_string);
|
|
}
|
|
|
|
double Magick::Image::gamma(void) const
|
|
{
|
|
return(constImage()->gamma);
|
|
}
|
|
|
|
Magick::Geometry Magick::Image::geometry(void) const
|
|
{
|
|
if (constImage()->geometry)
|
|
return Geometry(constImage()->geometry);
|
|
|
|
if (!quiet())
|
|
throwExceptionExplicit(MagickCore::OptionWarning,
|
|
"Image does not contain a geometry");
|
|
|
|
return(Geometry());
|
|
}
|
|
|
|
void Magick::Image::gifDisposeMethod(
|
|
const MagickCore::DisposeType disposeMethod_)
|
|
{
|
|
modifyImage();
|
|
image()->dispose=disposeMethod_;
|
|
}
|
|
|
|
MagickCore::DisposeType Magick::Image::gifDisposeMethod(void) const
|
|
{
|
|
return(constImage()->dispose);
|
|
}
|
|
|
|
bool Magick::Image::hasChannel(const PixelChannel channel) const
|
|
{
|
|
if (GetPixelChannelTraits(constImage(),channel) == UndefinedPixelTrait)
|
|
return(false);
|
|
|
|
if (channel == GreenPixelChannel || channel == BluePixelChannel)
|
|
return (GetPixelChannelOffset(constImage(),channel) == (ssize_t)channel);
|
|
|
|
return(true);
|
|
}
|
|
|
|
void Magick::Image::highlightColor(const Color color_)
|
|
{
|
|
std::string
|
|
value;
|
|
|
|
value=color_;
|
|
artifact("compare:highlight-color",value);
|
|
}
|
|
|
|
void Magick::Image::iccColorProfile(const Magick::Blob &colorProfile_)
|
|
{
|
|
profile("icc",colorProfile_);
|
|
}
|
|
|
|
Magick::Blob Magick::Image::iccColorProfile(void) const
|
|
{
|
|
const StringInfo
|
|
*color_profile;
|
|
|
|
color_profile=GetImageProfile(constImage(),"icc");
|
|
if (color_profile == (StringInfo *) NULL)
|
|
return(Blob());
|
|
return(Blob(GetStringInfoDatum(color_profile),GetStringInfoLength(
|
|
color_profile)));
|
|
}
|
|
|
|
void Magick::Image::interlaceType(const Magick::InterlaceType interlace_)
|
|
{
|
|
modifyImage();
|
|
image()->interlace=interlace_;
|
|
options()->interlaceType(interlace_);
|
|
}
|
|
|
|
Magick::InterlaceType Magick::Image::interlaceType(void) const
|
|
{
|
|
return(constImage()->interlace);
|
|
}
|
|
|
|
void Magick::Image::interpolate(const PixelInterpolateMethod interpolate_)
|
|
{
|
|
modifyImage();
|
|
image()->interpolate=interpolate_;
|
|
}
|
|
|
|
Magick::PixelInterpolateMethod Magick::Image::interpolate(void) const
|
|
{
|
|
return constImage()->interpolate;
|
|
}
|
|
|
|
void Magick::Image::iptcProfile(const Magick::Blob &iptcProfile_)
|
|
{
|
|
modifyImage();
|
|
if (iptcProfile_.data() != 0)
|
|
{
|
|
StringInfo
|
|
*iptc_profile;
|
|
|
|
iptc_profile=AcquireStringInfo(iptcProfile_.length());
|
|
SetStringInfoDatum(iptc_profile,(unsigned char *) iptcProfile_.data());
|
|
GetPPException;
|
|
(void) SetImageProfile(image(),"iptc",iptc_profile,exceptionInfo);
|
|
iptc_profile=DestroyStringInfo(iptc_profile);
|
|
ThrowImageException;
|
|
}
|
|
}
|
|
|
|
Magick::Blob Magick::Image::iptcProfile(void) const
|
|
{
|
|
const StringInfo
|
|
*iptc_profile;
|
|
|
|
iptc_profile=GetImageProfile(constImage(),"iptc");
|
|
if (iptc_profile == (StringInfo *) NULL)
|
|
return(Blob());
|
|
return(Blob(GetStringInfoDatum(iptc_profile),GetStringInfoLength(
|
|
iptc_profile)));
|
|
}
|
|
|
|
bool Magick::Image::isOpaque(void) const
|
|
{
|
|
MagickBooleanType
|
|
result;
|
|
|
|
GetPPException;
|
|
result=IsImageOpaque(constImage(),exceptionInfo);
|
|
ThrowImageException;
|
|
return(result != MagickFalse ? true : false);
|
|
}
|
|
|
|
void Magick::Image::isValid(const bool isValid_)
|
|
{
|
|
if (!isValid_)
|
|
{
|
|
delete _imgRef;
|
|
_imgRef=new ImageRef;
|
|
}
|
|
else if (!isValid())
|
|
{
|
|
// Construct with single-pixel black image to make
|
|
// image valid. This is an obvious hack.
|
|
size(Geometry(1,1));
|
|
read("xc:black");
|
|
}
|
|
}
|
|
|
|
bool Magick::Image::isValid(void) const
|
|
{
|
|
return rows() && columns();
|
|
}
|
|
|
|
void Magick::Image::label(const std::string &label_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
(void) SetImageProperty(image(),"Label",NULL,exceptionInfo);
|
|
if (label_.length() > 0)
|
|
(void) SetImageProperty(image(),"Label",label_.c_str(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
std::string Magick::Image::label(void) const
|
|
{
|
|
const char
|
|
*value;
|
|
|
|
GetPPException;
|
|
value=GetImageProperty(constImage(),"Label",exceptionInfo);
|
|
ThrowImageException;
|
|
|
|
if (value)
|
|
return(std::string(value));
|
|
|
|
return(std::string());
|
|
}
|
|
|
|
void Magick::Image::lowlightColor(const Color color_)
|
|
{
|
|
std::string
|
|
value;
|
|
|
|
value=color_;
|
|
artifact("compare:lowlight-color",value);
|
|
}
|
|
|
|
void Magick::Image::magick(const std::string &magick_)
|
|
{
|
|
size_t
|
|
length;
|
|
|
|
modifyImage();
|
|
|
|
length=sizeof(image()->magick)-1;
|
|
if (magick_.length() < length)
|
|
length=magick_.length();
|
|
|
|
if (!magick_.empty())
|
|
magick_.copy(image()->magick,length);
|
|
image()->magick[length]=0;
|
|
|
|
options()->magick(magick_);
|
|
}
|
|
|
|
std::string Magick::Image::magick(void) const
|
|
{
|
|
if (*(constImage()->magick) != '\0')
|
|
return(std::string(constImage()->magick));
|
|
|
|
return(constOptions()->magick());
|
|
}
|
|
|
|
void Magick::Image::masklightColor(const Color color_)
|
|
{
|
|
std::string
|
|
value;
|
|
|
|
value=color_;
|
|
artifact("compare:masklight-color",value);
|
|
}
|
|
|
|
double Magick::Image::meanErrorPerPixel(void) const
|
|
{
|
|
return(constImage()->error.mean_error_per_pixel);
|
|
}
|
|
|
|
void Magick::Image::modulusDepth(const size_t depth_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
SetImageDepth(image(),depth_,exceptionInfo);
|
|
ThrowImageException;
|
|
options()->depth(depth_);
|
|
}
|
|
|
|
size_t Magick::Image::modulusDepth(void) const
|
|
{
|
|
size_t
|
|
depth;
|
|
|
|
GetPPException;
|
|
depth=GetImageDepth(constImage(),exceptionInfo);
|
|
ThrowImageException;
|
|
return(depth);
|
|
}
|
|
|
|
void Magick::Image::monochrome(const bool monochromeFlag_)
|
|
{
|
|
modifyImage();
|
|
options()->monochrome(monochromeFlag_);
|
|
}
|
|
|
|
bool Magick::Image::monochrome(void) const
|
|
{
|
|
return(constOptions()->monochrome());
|
|
}
|
|
|
|
Magick::Geometry Magick::Image::montageGeometry(void) const
|
|
{
|
|
if (constImage()->montage)
|
|
return Magick::Geometry(constImage()->montage);
|
|
|
|
if (!quiet())
|
|
throwExceptionExplicit(MagickCore::CorruptImageWarning,
|
|
"Image does not contain a montage");
|
|
|
|
return(Magick::Geometry());
|
|
}
|
|
|
|
double Magick::Image::normalizedMaxError(void) const
|
|
{
|
|
return(constImage()->error.normalized_maximum_error);
|
|
}
|
|
|
|
double Magick::Image::normalizedMeanError(void) const
|
|
{
|
|
return(constImage()->error.normalized_mean_error);
|
|
}
|
|
|
|
void Magick::Image::orientation(const Magick::OrientationType orientation_)
|
|
{
|
|
modifyImage();
|
|
image()->orientation=orientation_;
|
|
}
|
|
|
|
Magick::OrientationType Magick::Image::orientation(void) const
|
|
{
|
|
return(constImage()->orientation);
|
|
}
|
|
|
|
void Magick::Image::page(const Magick::Geometry &pageSize_)
|
|
{
|
|
modifyImage();
|
|
options()->page(pageSize_);
|
|
image()->page=pageSize_;
|
|
}
|
|
|
|
Magick::Geometry Magick::Image::page(void) const
|
|
{
|
|
return(Geometry(constImage()->page.width,constImage()->page.height,
|
|
constImage()->page.x,constImage()->page.y));
|
|
}
|
|
|
|
void Magick::Image::quality(const size_t quality_)
|
|
{
|
|
modifyImage();
|
|
image()->quality=quality_;
|
|
options()->quality(quality_);
|
|
}
|
|
|
|
size_t Magick::Image::quality(void) const
|
|
{
|
|
return(constImage()->quality);
|
|
}
|
|
|
|
void Magick::Image::quantizeColors(const size_t colors_)
|
|
{
|
|
modifyImage();
|
|
options()->quantizeColors(colors_);
|
|
}
|
|
|
|
size_t Magick::Image::quantizeColors(void) const
|
|
{
|
|
return(constOptions()->quantizeColors());
|
|
}
|
|
|
|
void Magick::Image::quantizeColorSpace(
|
|
const Magick::ColorspaceType colorSpace_)
|
|
{
|
|
modifyImage();
|
|
options()->quantizeColorSpace(colorSpace_);
|
|
}
|
|
|
|
Magick::ColorspaceType Magick::Image::quantizeColorSpace(void) const
|
|
{
|
|
return(constOptions()->quantizeColorSpace());
|
|
}
|
|
|
|
void Magick::Image::quantizeDither(const bool ditherFlag_)
|
|
{
|
|
modifyImage();
|
|
options()->quantizeDither(ditherFlag_);
|
|
}
|
|
|
|
bool Magick::Image::quantizeDither(void) const
|
|
{
|
|
return(constOptions()->quantizeDither());
|
|
}
|
|
|
|
void Magick::Image::quantizeDitherMethod(const DitherMethod ditherMethod_)
|
|
{
|
|
modifyImage();
|
|
options()->quantizeDitherMethod(ditherMethod_);
|
|
}
|
|
|
|
MagickCore::DitherMethod Magick::Image::quantizeDitherMethod(void) const
|
|
{
|
|
return(constOptions()->quantizeDitherMethod());
|
|
}
|
|
|
|
void Magick::Image::quantizeTreeDepth(const size_t treeDepth_)
|
|
{
|
|
modifyImage();
|
|
options()->quantizeTreeDepth(treeDepth_);
|
|
}
|
|
|
|
size_t Magick::Image::quantizeTreeDepth() const
|
|
{
|
|
return(constOptions()->quantizeTreeDepth());
|
|
}
|
|
|
|
void Magick::Image::quiet(const bool quiet_)
|
|
{
|
|
modifyImage();
|
|
options()->quiet(quiet_);
|
|
}
|
|
|
|
bool Magick::Image::quiet(void) const
|
|
{
|
|
return(constOptions()->quiet());
|
|
}
|
|
|
|
void Magick::Image::renderingIntent(
|
|
const Magick::RenderingIntent renderingIntent_)
|
|
{
|
|
modifyImage();
|
|
image()->rendering_intent=renderingIntent_;
|
|
}
|
|
|
|
Magick::RenderingIntent Magick::Image::renderingIntent(void) const
|
|
{
|
|
return(static_cast<Magick::RenderingIntent>(constImage()->rendering_intent));
|
|
}
|
|
|
|
void Magick::Image::resolutionUnits(
|
|
const Magick::ResolutionType resolutionUnits_)
|
|
{
|
|
modifyImage();
|
|
image()->units=resolutionUnits_;
|
|
options()->resolutionUnits(resolutionUnits_);
|
|
}
|
|
|
|
Magick::ResolutionType Magick::Image::resolutionUnits(void) const
|
|
{
|
|
return(static_cast<Magick::ResolutionType>(constImage()->units));
|
|
}
|
|
|
|
size_t Magick::Image::rows(void) const
|
|
{
|
|
return(constImage()->rows);
|
|
}
|
|
|
|
void Magick::Image::scene(const size_t scene_)
|
|
{
|
|
modifyImage();
|
|
image()->scene=scene_;
|
|
}
|
|
|
|
size_t Magick::Image::scene(void) const
|
|
{
|
|
return(constImage()->scene);
|
|
}
|
|
|
|
void Magick::Image::size(const Geometry &geometry_)
|
|
{
|
|
modifyImage();
|
|
options()->size(geometry_);
|
|
image()->rows=geometry_.height();
|
|
image()->columns=geometry_.width();
|
|
}
|
|
|
|
Magick::Geometry Magick::Image::size(void) const
|
|
{
|
|
return(Magick::Geometry(constImage()->columns,constImage()->rows));
|
|
}
|
|
|
|
void Magick::Image::strokeAntiAlias(const bool flag_)
|
|
{
|
|
modifyImage();
|
|
options()->strokeAntiAlias(flag_);
|
|
}
|
|
|
|
bool Magick::Image::strokeAntiAlias(void) const
|
|
{
|
|
return(constOptions()->strokeAntiAlias());
|
|
}
|
|
|
|
void Magick::Image::strokeColor(const Magick::Color &strokeColor_)
|
|
{
|
|
std::string
|
|
value;
|
|
|
|
modifyImage();
|
|
options()->strokeColor(strokeColor_);
|
|
value=strokeColor_;
|
|
artifact("stroke",value);
|
|
}
|
|
|
|
Magick::Color Magick::Image::strokeColor(void) const
|
|
{
|
|
return(constOptions()->strokeColor());
|
|
}
|
|
|
|
void Magick::Image::strokeDashArray(const double *strokeDashArray_)
|
|
{
|
|
modifyImage();
|
|
options()->strokeDashArray(strokeDashArray_);
|
|
}
|
|
|
|
const double* Magick::Image::strokeDashArray(void) const
|
|
{
|
|
return(constOptions()->strokeDashArray());
|
|
}
|
|
|
|
void Magick::Image::strokeDashOffset(const double strokeDashOffset_)
|
|
{
|
|
modifyImage();
|
|
options()->strokeDashOffset(strokeDashOffset_);
|
|
}
|
|
|
|
double Magick::Image::strokeDashOffset(void) const
|
|
{
|
|
return(constOptions()->strokeDashOffset());
|
|
}
|
|
|
|
void Magick::Image::strokeLineCap(const Magick::LineCap lineCap_)
|
|
{
|
|
modifyImage();
|
|
options()->strokeLineCap(lineCap_);
|
|
}
|
|
|
|
Magick::LineCap Magick::Image::strokeLineCap(void) const
|
|
{
|
|
return(constOptions()->strokeLineCap());
|
|
}
|
|
|
|
void Magick::Image::strokeLineJoin(const Magick::LineJoin lineJoin_)
|
|
{
|
|
modifyImage();
|
|
options()->strokeLineJoin(lineJoin_);
|
|
}
|
|
|
|
Magick::LineJoin Magick::Image::strokeLineJoin(void) const
|
|
{
|
|
return(constOptions()->strokeLineJoin());
|
|
}
|
|
|
|
void Magick::Image::strokeMiterLimit(const size_t strokeMiterLimit_)
|
|
{
|
|
modifyImage();
|
|
options()->strokeMiterLimit(strokeMiterLimit_);
|
|
}
|
|
|
|
size_t Magick::Image::strokeMiterLimit(void) const
|
|
{
|
|
return(constOptions()->strokeMiterLimit());
|
|
}
|
|
|
|
void Magick::Image::strokePattern(const Image &strokePattern_)
|
|
{
|
|
modifyImage();
|
|
if(strokePattern_.isValid())
|
|
options()->strokePattern(strokePattern_.constImage());
|
|
else
|
|
options()->strokePattern(static_cast<MagickCore::Image*>(NULL));
|
|
}
|
|
|
|
Magick::Image Magick::Image::strokePattern(void) const
|
|
{
|
|
// FIXME: This is inordinately innefficient
|
|
const MagickCore::Image
|
|
*tmpTexture;
|
|
|
|
Image
|
|
texture;
|
|
|
|
tmpTexture=constOptions()->strokePattern();
|
|
|
|
if (tmpTexture)
|
|
{
|
|
MagickCore::Image
|
|
*image;
|
|
|
|
GetPPException;
|
|
image=CloneImage(tmpTexture,0,0,MagickTrue,exceptionInfo);
|
|
texture.replaceImage(image);
|
|
ThrowImageException;
|
|
}
|
|
return(texture);
|
|
}
|
|
|
|
void Magick::Image::strokeWidth(const double strokeWidth_)
|
|
{
|
|
char
|
|
value[MagickPathExtent];
|
|
|
|
modifyImage();
|
|
options()->strokeWidth(strokeWidth_);
|
|
FormatLocaleString(value,MagickPathExtent,"%.20g",strokeWidth_);
|
|
(void) SetImageArtifact(image(),"strokewidth",value);
|
|
}
|
|
|
|
double Magick::Image::strokeWidth(void) const
|
|
{
|
|
return(constOptions()->strokeWidth());
|
|
}
|
|
|
|
void Magick::Image::subImage(const size_t subImage_)
|
|
{
|
|
modifyImage();
|
|
options()->subImage(subImage_);
|
|
}
|
|
|
|
size_t Magick::Image::subImage(void) const
|
|
{
|
|
return(constOptions()->subImage());
|
|
}
|
|
|
|
void Magick::Image::subRange(const size_t subRange_)
|
|
{
|
|
modifyImage();
|
|
options()->subRange(subRange_);
|
|
}
|
|
|
|
size_t Magick::Image::subRange(void) const
|
|
{
|
|
return(constOptions()->subRange());
|
|
}
|
|
|
|
void Magick::Image::textAntiAlias(const bool flag_)
|
|
{
|
|
modifyImage();
|
|
options()->textAntiAlias(flag_);
|
|
}
|
|
|
|
bool Magick::Image::textAntiAlias(void) const
|
|
{
|
|
return(constOptions()->textAntiAlias());
|
|
}
|
|
|
|
void Magick::Image::textDirection(DirectionType direction_)
|
|
{
|
|
modifyImage();
|
|
options()->textDirection(direction_);
|
|
}
|
|
|
|
Magick::DirectionType Magick::Image::textDirection(void) const
|
|
{
|
|
return(constOptions()->textDirection());
|
|
}
|
|
|
|
void Magick::Image::textEncoding(const std::string &encoding_)
|
|
{
|
|
modifyImage();
|
|
options()->textEncoding(encoding_);
|
|
}
|
|
|
|
std::string Magick::Image::textEncoding(void) const
|
|
{
|
|
return(constOptions()->textEncoding());
|
|
}
|
|
|
|
void Magick::Image::textGravity(GravityType gravity_)
|
|
{
|
|
modifyImage();
|
|
options()->textGravity(gravity_);
|
|
}
|
|
|
|
Magick::GravityType Magick::Image::textGravity(void) const
|
|
{
|
|
return(constOptions()->textGravity());
|
|
}
|
|
|
|
void Magick::Image::textInterlineSpacing(double spacing_)
|
|
{
|
|
modifyImage();
|
|
options()->textInterlineSpacing(spacing_);
|
|
}
|
|
|
|
double Magick::Image::textInterlineSpacing(void) const
|
|
{
|
|
return(constOptions()->textInterlineSpacing());
|
|
}
|
|
|
|
void Magick::Image::textInterwordSpacing(double spacing_)
|
|
{
|
|
modifyImage();
|
|
options()->textInterwordSpacing(spacing_);
|
|
}
|
|
|
|
double Magick::Image::textInterwordSpacing(void) const
|
|
{
|
|
return(constOptions()->textInterwordSpacing());
|
|
}
|
|
|
|
void Magick::Image::textKerning(double kerning_)
|
|
{
|
|
modifyImage();
|
|
options()->textKerning(kerning_);
|
|
}
|
|
|
|
double Magick::Image::textKerning(void) const
|
|
{
|
|
return(constOptions()->textKerning());
|
|
}
|
|
|
|
void Magick::Image::textUnderColor(const Color &underColor_)
|
|
{
|
|
modifyImage();
|
|
options()->textUnderColor(underColor_);
|
|
}
|
|
|
|
Magick::Color Magick::Image::textUnderColor(void) const
|
|
{
|
|
return(constOptions()->textUnderColor());
|
|
}
|
|
|
|
size_t Magick::Image::totalColors(void) const
|
|
{
|
|
size_t
|
|
colors;
|
|
|
|
GetPPException;
|
|
colors=GetNumberColors(constImage(),(FILE *) NULL,exceptionInfo);
|
|
ThrowImageException;
|
|
return colors;
|
|
}
|
|
|
|
void Magick::Image::transformRotation(const double angle_)
|
|
{
|
|
modifyImage();
|
|
options()->transformRotation(angle_);
|
|
}
|
|
|
|
void Magick::Image::transformSkewX(const double skewx_)
|
|
{
|
|
modifyImage();
|
|
options()->transformSkewX(skewx_);
|
|
}
|
|
|
|
void Magick::Image::transformSkewY(const double skewy_)
|
|
{
|
|
modifyImage();
|
|
options()->transformSkewY(skewy_);
|
|
}
|
|
|
|
Magick::ImageType Magick::Image::type(void) const
|
|
{
|
|
if (constOptions()->type() != UndefinedType)
|
|
return(constOptions()->type());
|
|
return(GetImageType(constImage()));
|
|
}
|
|
|
|
void Magick::Image::type(const Magick::ImageType type_)
|
|
{
|
|
modifyImage();
|
|
options()->type(type_);
|
|
GetPPException;
|
|
SetImageType(image(),type_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::verbose(const bool verboseFlag_)
|
|
{
|
|
modifyImage();
|
|
options()->verbose(verboseFlag_);
|
|
}
|
|
|
|
bool Magick::Image::verbose(void) const
|
|
{
|
|
return(constOptions()->verbose());
|
|
}
|
|
|
|
void Magick::Image::virtualPixelMethod(
|
|
const VirtualPixelMethod virtualPixelMethod_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
SetImageVirtualPixelMethod(image(),virtualPixelMethod_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
Magick::VirtualPixelMethod Magick::Image::virtualPixelMethod(void) const
|
|
{
|
|
return(GetImageVirtualPixelMethod(constImage()));
|
|
}
|
|
|
|
void Magick::Image::x11Display(const std::string &display_)
|
|
{
|
|
modifyImage();
|
|
options()->x11Display(display_);
|
|
}
|
|
|
|
std::string Magick::Image::x11Display(void) const
|
|
{
|
|
return(constOptions()->x11Display());
|
|
}
|
|
|
|
double Magick::Image::xResolution(void) const
|
|
{
|
|
return(constImage()->resolution.x);
|
|
}
|
|
|
|
double Magick::Image::yResolution(void) const
|
|
{
|
|
return(constImage()->resolution.y);
|
|
}
|
|
|
|
void Magick::Image::adaptiveBlur(const double radius_,const double sigma_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=AdaptiveBlurImage(constImage(),radius_,sigma_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::adaptiveResize(const Geometry &geometry_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
size_t
|
|
height=rows(),
|
|
width=columns();
|
|
|
|
ssize_t
|
|
x=0,
|
|
y=0;
|
|
|
|
ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
|
|
&height);
|
|
|
|
GetPPException;
|
|
newImage=AdaptiveResizeImage(constImage(),width,height,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::adaptiveSharpen(const double radius_,const double sigma_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=AdaptiveSharpenImage(constImage(),radius_,sigma_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::adaptiveSharpenChannel(const ChannelType channel_,
|
|
const double radius_,const double sigma_ )
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
newImage=AdaptiveSharpenImage(constImage(),radius_,sigma_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::adaptiveThreshold(const size_t width_,const size_t height_,
|
|
const double bias_)
|
|
{
|
|
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=AdaptiveThresholdImage(constImage(),width_,height_,bias_,
|
|
exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::addNoise(const NoiseType noiseType_,const double attenuate_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=AddNoiseImage(constImage(),noiseType_,attenuate_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::addNoiseChannel(const ChannelType channel_,
|
|
const NoiseType noiseType_,const double attenuate_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
newImage=AddNoiseImage(constImage(),noiseType_,attenuate_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::affineTransform(const DrawableAffine &affine_)
|
|
{
|
|
AffineMatrix
|
|
_affine;
|
|
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
_affine.sx=affine_.sx();
|
|
_affine.sy=affine_.sy();
|
|
_affine.rx=affine_.rx();
|
|
_affine.ry=affine_.ry();
|
|
_affine.tx=affine_.tx();
|
|
_affine.ty=affine_.ty();
|
|
|
|
GetPPException;
|
|
newImage=AffineTransformImage(constImage(),&_affine,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::alpha(const unsigned int alpha_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
SetImageAlpha(image(),alpha_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::alphaChannel(AlphaChannelOption alphaOption_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
SetImageAlphaChannel(image(),alphaOption_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::annotate(const std::string &text_,
|
|
const Geometry &location_)
|
|
{
|
|
annotate(text_,location_,NorthWestGravity,0.0);
|
|
}
|
|
|
|
void Magick::Image::annotate(const std::string &text_,
|
|
const Geometry &boundingArea_,const GravityType gravity_)
|
|
{
|
|
annotate(text_,boundingArea_,gravity_,0.0);
|
|
}
|
|
|
|
void Magick::Image::annotate(const std::string &text_,
|
|
const Geometry &boundingArea_,const GravityType gravity_,
|
|
const double degrees_)
|
|
{
|
|
AffineMatrix
|
|
oaffine;
|
|
|
|
char
|
|
boundingArea[MagickPathExtent];
|
|
|
|
DrawInfo
|
|
*drawInfo;
|
|
|
|
modifyImage();
|
|
|
|
drawInfo=options()->drawInfo();
|
|
drawInfo->text=DestroyString(drawInfo->text);
|
|
drawInfo->text=const_cast<char *>(text_.c_str());
|
|
drawInfo->geometry=DestroyString(drawInfo->geometry);
|
|
|
|
if (boundingArea_.isValid())
|
|
{
|
|
if (boundingArea_.width() == 0 || boundingArea_.height() == 0)
|
|
{
|
|
FormatLocaleString(boundingArea,MagickPathExtent,"%+.20g%+.20g",
|
|
(double) boundingArea_.xOff(),(double) boundingArea_.yOff());
|
|
}
|
|
else
|
|
{
|
|
(void) CopyMagickString(boundingArea,
|
|
std::string(boundingArea_).c_str(), MagickPathExtent);
|
|
}
|
|
drawInfo->geometry=boundingArea;
|
|
}
|
|
|
|
drawInfo->gravity=gravity_;
|
|
|
|
oaffine=drawInfo->affine;
|
|
if (degrees_ != 0.0)
|
|
{
|
|
AffineMatrix
|
|
affine,
|
|
current;
|
|
|
|
affine.sx=1.0;
|
|
affine.rx=0.0;
|
|
affine.ry=0.0;
|
|
affine.sy=1.0;
|
|
affine.tx=0.0;
|
|
affine.ty=0.0;
|
|
|
|
current=drawInfo->affine;
|
|
affine.sx=cos(DegreesToRadians(fmod(degrees_,360.0)));
|
|
affine.rx=sin(DegreesToRadians(fmod(degrees_,360.0)));
|
|
affine.ry=(-sin(DegreesToRadians(fmod(degrees_,360.0))));
|
|
affine.sy=cos(DegreesToRadians(fmod(degrees_,360.0)));
|
|
|
|
drawInfo->affine.sx=current.sx*affine.sx+current.ry*affine.rx;
|
|
drawInfo->affine.rx=current.rx*affine.sx+current.sy*affine.rx;
|
|
drawInfo->affine.ry=current.sx*affine.ry+current.ry*affine.sy;
|
|
drawInfo->affine.sy=current.rx*affine.ry+current.sy*affine.sy;
|
|
drawInfo->affine.tx=current.sx*affine.tx+current.ry*affine.ty
|
|
+current.tx;
|
|
}
|
|
|
|
GetPPException;
|
|
AnnotateImage(image(),drawInfo,exceptionInfo);
|
|
|
|
// Restore original values
|
|
drawInfo->affine=oaffine;
|
|
drawInfo->text=(char *) NULL;
|
|
drawInfo->geometry=(char *) NULL;
|
|
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::annotate(const std::string &text_,
|
|
const GravityType gravity_)
|
|
{
|
|
DrawInfo
|
|
*drawInfo;
|
|
|
|
modifyImage();
|
|
|
|
drawInfo=options()->drawInfo();
|
|
drawInfo->text=DestroyString(drawInfo->text);
|
|
drawInfo->text=const_cast<char *>(text_.c_str());
|
|
drawInfo->gravity=gravity_;
|
|
|
|
GetPPException;
|
|
AnnotateImage(image(),drawInfo,exceptionInfo);
|
|
|
|
drawInfo->gravity=NorthWestGravity;
|
|
drawInfo->text=(char *) NULL;
|
|
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::artifact(const std::string &name_,const std::string &value_)
|
|
{
|
|
modifyImage();
|
|
(void) SetImageArtifact(image(),name_.c_str(),value_.c_str());
|
|
}
|
|
|
|
std::string Magick::Image::artifact(const std::string &name_) const
|
|
{
|
|
const char
|
|
*value;
|
|
|
|
value=GetImageArtifact(constImage(),name_.c_str());
|
|
if (value)
|
|
return(std::string(value));
|
|
return(std::string());
|
|
}
|
|
|
|
void Magick::Image::attribute(const std::string name_,const char *value_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
SetImageProperty(image(),name_.c_str(),value_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::attribute(const std::string name_,const std::string value_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
SetImageProperty(image(),name_.c_str(),value_.c_str(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
std::string Magick::Image::attribute(const std::string name_) const
|
|
{
|
|
const char
|
|
*value;
|
|
|
|
GetPPException;
|
|
value=GetImageProperty(constImage(),name_.c_str(),exceptionInfo);
|
|
ThrowImageException;
|
|
|
|
if (value)
|
|
return(std::string(value));
|
|
|
|
return(std::string()); // Intentionally no exception
|
|
}
|
|
|
|
void Magick::Image::autoGamma(void)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
(void) SyncImageSettings(imageInfo(),image(),exceptionInfo);
|
|
(void) AutoGammaImage(image(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::autoGammaChannel(const ChannelType channel_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
(void) SyncImageSettings(imageInfo(),image(),exceptionInfo);
|
|
(void) AutoGammaImage(image(),exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::autoLevel(void)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
(void) AutoLevelImage(image(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::autoLevelChannel(const ChannelType channel_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
(void) AutoLevelImage(image(),exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::autoOrient(void)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
if (image()->orientation == UndefinedOrientation ||
|
|
image()->orientation == TopLeftOrientation)
|
|
return;
|
|
|
|
GetPPException;
|
|
newImage=AutoOrientImage(constImage(),image()->orientation,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::autoThreshold(const AutoThresholdMethod method_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
AutoThresholdImage(image(),method_, exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::blackThreshold(const std::string &threshold_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
BlackThresholdImage(image(),threshold_.c_str(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::blackThresholdChannel(const ChannelType channel_,
|
|
const std::string &threshold_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
BlackThresholdImage(image(),threshold_.c_str(),exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::blueShift(const double factor_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=BlueShiftImage(constImage(),factor_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::blur(const double radius_,const double sigma_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=BlurImage(constImage(),radius_,sigma_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::blurChannel(const ChannelType channel_,
|
|
const double radius_,const double sigma_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
newImage=BlurImage(constImage(),radius_,sigma_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::border(const Geometry &geometry_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
RectangleInfo
|
|
borderInfo=geometry_;
|
|
|
|
GetPPException;
|
|
newImage=BorderImage(constImage(),&borderInfo,image()->compose,
|
|
exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::brightnessContrast(const double brightness_,
|
|
const double contrast_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
BrightnessContrastImage(image(),brightness_,contrast_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::brightnessContrastChannel(const ChannelType channel_,
|
|
const double brightness_,const double contrast_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
BrightnessContrastImage(image(),brightness_,contrast_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::cannyEdge(const double radius_,const double sigma_,
|
|
const double lowerPercent_,const double upperPercent_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
modifyImage();
|
|
GetPPException;
|
|
newImage=CannyEdgeImage(constImage(),radius_,sigma_,lowerPercent_,
|
|
upperPercent_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::cdl(const std::string &cdl_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
(void) ColorDecisionListImage(image(),cdl_.c_str(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::channel(const ChannelType channel_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=SeparateImage(image(),channel_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::charcoal(const double radius_,const double sigma_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=CharcoalImage(image(),radius_,sigma_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::charcoalChannel(const ChannelType channel_,
|
|
const double radius_,const double sigma_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
newImage=CharcoalImage(image(),radius_,sigma_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::chop(const Geometry &geometry_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
RectangleInfo
|
|
chopInfo=geometry_;
|
|
|
|
GetPPException;
|
|
newImage=ChopImage(image(),&chopInfo,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::chromaBluePrimary(const double x_,const double y_,
|
|
const double z_)
|
|
{
|
|
modifyImage();
|
|
image()->chromaticity.blue_primary.x=x_;
|
|
image()->chromaticity.blue_primary.y=y_;
|
|
image()->chromaticity.blue_primary.z=z_;
|
|
}
|
|
|
|
void Magick::Image::chromaBluePrimary(double *x_,double *y_,double *z_) const
|
|
{
|
|
*x_=constImage()->chromaticity.blue_primary.x;
|
|
*y_=constImage()->chromaticity.blue_primary.y;
|
|
*z_=constImage()->chromaticity.blue_primary.z;
|
|
}
|
|
|
|
void Magick::Image::chromaGreenPrimary(const double x_,const double y_,
|
|
const double z_)
|
|
{
|
|
modifyImage();
|
|
image()->chromaticity.green_primary.x=x_;
|
|
image()->chromaticity.green_primary.y=y_;
|
|
image()->chromaticity.green_primary.z=z_;
|
|
}
|
|
|
|
void Magick::Image::chromaGreenPrimary(double *x_,double *y_,double *z_) const
|
|
{
|
|
*x_=constImage()->chromaticity.green_primary.x;
|
|
*y_=constImage()->chromaticity.green_primary.y;
|
|
*z_=constImage()->chromaticity.green_primary.z;
|
|
}
|
|
|
|
void Magick::Image::chromaRedPrimary(const double x_,const double y_,
|
|
const double z_)
|
|
{
|
|
modifyImage();
|
|
image()->chromaticity.red_primary.x=x_;
|
|
image()->chromaticity.red_primary.y=y_;
|
|
image()->chromaticity.red_primary.z=z_;
|
|
}
|
|
|
|
void Magick::Image::chromaRedPrimary(double *x_,double *y_,double *z_) const
|
|
{
|
|
*x_=constImage()->chromaticity.red_primary.x;
|
|
*y_=constImage()->chromaticity.red_primary.y;
|
|
*z_=constImage()->chromaticity.red_primary.z;
|
|
}
|
|
|
|
void Magick::Image::chromaWhitePoint(const double x_,const double y_,
|
|
const double z_)
|
|
{
|
|
modifyImage();
|
|
image()->chromaticity.white_point.x=x_;
|
|
image()->chromaticity.white_point.y=y_;
|
|
image()->chromaticity.white_point.z=z_;
|
|
}
|
|
|
|
void Magick::Image::chromaWhitePoint(double *x_,double *y_,double *z_) const
|
|
{
|
|
*x_=constImage()->chromaticity.white_point.x;
|
|
*y_=constImage()->chromaticity.white_point.y;
|
|
*z_=constImage()->chromaticity.white_point.z;
|
|
}
|
|
|
|
void Magick::Image::clamp(void)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
ClampImage(image(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::clampChannel(const ChannelType channel_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
ClampImage(image(),exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::clip(void)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
ClipImage(image(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::clipPath(const std::string pathname_,const bool inside_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
ClipImagePath(image(),pathname_.c_str(),(MagickBooleanType) inside_,
|
|
exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::clut(const Image &clutImage_,
|
|
const PixelInterpolateMethod method)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
ClutImage(image(),clutImage_.constImage(),method,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::clutChannel(const ChannelType channel_,
|
|
const Image &clutImage_,const PixelInterpolateMethod method)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
ClutImage(image(),clutImage_.constImage(),method,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::colorize(const unsigned int alpha_,const Color &penColor_)
|
|
{
|
|
colorize(alpha_,alpha_,alpha_,penColor_);
|
|
}
|
|
|
|
void Magick::Image::colorize(const unsigned int alphaRed_,
|
|
const unsigned int alphaGreen_,const unsigned int alphaBlue_,
|
|
const Color &penColor_)
|
|
{
|
|
char
|
|
blend[MagickPathExtent];
|
|
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
PixelInfo
|
|
target;
|
|
|
|
if (!penColor_.isValid())
|
|
throwExceptionExplicit(MagickCore::OptionError,
|
|
"Pen color argument is invalid");
|
|
|
|
FormatLocaleString(blend,MagickPathExtent,"%u/%u/%u",alphaRed_,alphaGreen_,
|
|
alphaBlue_);
|
|
|
|
target=static_cast<PixelInfo>(penColor_);
|
|
GetPPException;
|
|
newImage=ColorizeImage(image(),blend,&target,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::colorMap(const size_t index_,const Color &color_)
|
|
{
|
|
MagickCore::Image
|
|
*imageptr;
|
|
|
|
imageptr=image();
|
|
|
|
if (index_ > (MaxColormapSize-1))
|
|
throwExceptionExplicit(MagickCore::OptionError,
|
|
"Colormap index must be less than MaxColormapSize");
|
|
|
|
if (!color_.isValid())
|
|
throwExceptionExplicit(MagickCore::OptionError,
|
|
"Color argument is invalid");
|
|
|
|
modifyImage();
|
|
|
|
// Ensure that colormap size is large enough
|
|
if (colorMapSize() < (index_+1))
|
|
colorMapSize(index_+1);
|
|
|
|
// Set color at index in colormap
|
|
(imageptr->colormap)[index_]=color_;
|
|
}
|
|
|
|
Magick::Color Magick::Image::colorMap(const size_t index_) const
|
|
{
|
|
if (!constImage()->colormap)
|
|
{
|
|
throwExceptionExplicit(MagickCore::OptionError,
|
|
"Image does not contain a colormap");
|
|
return(Color());
|
|
}
|
|
|
|
if (index_ > constImage()->colors-1)
|
|
throwExceptionExplicit(MagickCore::OptionError,"Index out of range");
|
|
|
|
return(Magick::Color((constImage()->colormap)[index_]));
|
|
}
|
|
|
|
void Magick::Image::colorMatrix(const size_t order_,
|
|
const double *color_matrix_)
|
|
{
|
|
KernelInfo
|
|
*kernel_info;
|
|
|
|
GetPPException;
|
|
kernel_info=AcquireKernelInfo((const char *) NULL,exceptionInfo);
|
|
if (kernel_info != (KernelInfo *) NULL)
|
|
{
|
|
kernel_info->width=order_;
|
|
kernel_info->height=order_;
|
|
kernel_info->values=(MagickRealType *) AcquireAlignedMemory(order_,
|
|
order_*sizeof(*kernel_info->values));
|
|
if (kernel_info->values != (MagickRealType *) NULL)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
for (ssize_t i=0; i < (ssize_t) (order_*order_); i++)
|
|
kernel_info->values[i]=color_matrix_[i];
|
|
newImage=ColorMatrixImage(image(),kernel_info,exceptionInfo);
|
|
replaceImage(newImage);
|
|
}
|
|
kernel_info=DestroyKernelInfo(kernel_info);
|
|
}
|
|
ThrowImageException;
|
|
}
|
|
|
|
bool Magick::Image::compare(const Image &reference_) const
|
|
{
|
|
bool
|
|
status;
|
|
|
|
Image
|
|
ref=reference_;
|
|
|
|
GetPPException;
|
|
status=static_cast<bool>(IsImagesEqual(constImage(),ref.constImage(),
|
|
exceptionInfo));
|
|
ThrowImageException;
|
|
return(status);
|
|
}
|
|
|
|
double Magick::Image::compare(const Image &reference_,const MetricType metric_)
|
|
{
|
|
double
|
|
distortion=0.0;
|
|
|
|
GetPPException;
|
|
GetImageDistortion(image(),reference_.constImage(),metric_,&distortion,
|
|
exceptionInfo);
|
|
ThrowImageException;
|
|
return(distortion);
|
|
}
|
|
|
|
double Magick::Image::compareChannel(const ChannelType channel_,
|
|
const Image &reference_,const MetricType metric_)
|
|
{
|
|
double
|
|
distortion=0.0;
|
|
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
GetImageDistortion(image(),reference_.constImage(),metric_,&distortion,
|
|
exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
return(distortion);
|
|
}
|
|
|
|
Magick::Image Magick::Image::compare(const Image &reference_,
|
|
const MetricType metric_,double *distortion)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=CompareImages(image(),reference_.constImage(),metric_,distortion,
|
|
exceptionInfo);
|
|
ThrowImageException;
|
|
if (newImage == (MagickCore::Image *) NULL)
|
|
return(Magick::Image());
|
|
else
|
|
return(Magick::Image(newImage));
|
|
}
|
|
|
|
Magick::Image Magick::Image::compareChannel(const ChannelType channel_,
|
|
const Image &reference_,const MetricType metric_,double *distortion)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
newImage=CompareImages(image(),reference_.constImage(),metric_,distortion,
|
|
exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
if (newImage == (MagickCore::Image *) NULL)
|
|
return(Magick::Image());
|
|
else
|
|
return(Magick::Image(newImage));
|
|
}
|
|
|
|
void Magick::Image::composite(const Image &compositeImage_,
|
|
const Geometry &offset_,const CompositeOperator compose_)
|
|
{
|
|
size_t
|
|
height=rows(),
|
|
width=columns();
|
|
|
|
ssize_t
|
|
x=offset_.xOff(),
|
|
y=offset_.yOff();
|
|
|
|
ParseMetaGeometry(static_cast<std::string>(offset_).c_str(),&x,&y,&width,
|
|
&height);
|
|
|
|
modifyImage();
|
|
GetPPException;
|
|
CompositeImage(image(),compositeImage_.constImage(),compose_,MagickTrue,
|
|
x,y,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::composite(const Image &compositeImage_,
|
|
const GravityType gravity_,const CompositeOperator compose_)
|
|
{
|
|
RectangleInfo
|
|
geometry;
|
|
|
|
modifyImage();
|
|
SetGeometry(compositeImage_.constImage(),&geometry);
|
|
GravityAdjustGeometry(columns(),rows(),gravity_,&geometry);
|
|
|
|
GetPPException;
|
|
CompositeImage(image(),compositeImage_.constImage(),compose_,MagickTrue,
|
|
geometry.x,geometry.y,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::composite(const Image &compositeImage_,
|
|
const ssize_t xOffset_,const ssize_t yOffset_,
|
|
const CompositeOperator compose_)
|
|
{
|
|
// Image supplied as compositeImage is composited with current image and
|
|
// results in updating current image.
|
|
modifyImage();
|
|
GetPPException;
|
|
CompositeImage(image(),compositeImage_.constImage(),compose_,MagickTrue,
|
|
xOffset_,yOffset_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::connectedComponents(const size_t connectivity_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=ConnectedComponentsImage(constImage(),connectivity_,
|
|
(CCObjectInfo **) NULL,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::contrast(const bool sharpen_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
ContrastImage(image(),(MagickBooleanType) sharpen_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::contrastStretch(const double blackPoint_,
|
|
const double whitePoint_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
ContrastStretchImage(image(),blackPoint_,whitePoint_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::contrastStretchChannel(const ChannelType channel_,
|
|
const double blackPoint_,const double whitePoint_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
ContrastStretchImage(image(),blackPoint_,whitePoint_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::convolve(const size_t order_,const double *kernel_)
|
|
{
|
|
KernelInfo
|
|
*kernel_info;
|
|
|
|
GetPPException;
|
|
kernel_info=AcquireKernelInfo((const char *) NULL,exceptionInfo);
|
|
kernel_info->width=order_;
|
|
kernel_info->height=order_;
|
|
kernel_info->x=(ssize_t) (order_-1)/2;
|
|
kernel_info->y=(ssize_t) (order_-1)/2;
|
|
kernel_info->values=(MagickRealType *) AcquireAlignedMemory(order_,
|
|
order_*sizeof(*kernel_info->values));
|
|
if (kernel_info->values != (MagickRealType *) NULL)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
for (ssize_t i=0; i < (ssize_t) (order_*order_); i++)
|
|
kernel_info->values[i]=kernel_[i];
|
|
newImage=ConvolveImage(image(),kernel_info,exceptionInfo);
|
|
replaceImage(newImage);
|
|
}
|
|
kernel_info=DestroyKernelInfo(kernel_info);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::copyPixels(const Image &source_,const Geometry &geometry_,
|
|
const Offset &offset_)
|
|
{
|
|
const OffsetInfo
|
|
offset=offset_;
|
|
|
|
const RectangleInfo
|
|
geometry=geometry_;
|
|
|
|
GetPPException;
|
|
(void) CopyImagePixels(image(),source_.constImage(),&geometry,&offset,
|
|
exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::crop(const Geometry &geometry_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
RectangleInfo
|
|
cropInfo=geometry_;
|
|
|
|
GetPPException;
|
|
newImage=CropImage(constImage(),&cropInfo,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::cycleColormap(const ssize_t amount_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
CycleColormapImage(image(),amount_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::decipher(const std::string &passphrase_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
DecipherImage(image(),passphrase_.c_str(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::defineSet(const std::string &magick_,
|
|
const std::string &key_,bool flag_)
|
|
{
|
|
std::string
|
|
definition;
|
|
|
|
modifyImage();
|
|
definition=magick_ + ":" + key_;
|
|
if (flag_)
|
|
(void) SetImageOption(imageInfo(),definition.c_str(),"");
|
|
else
|
|
DeleteImageOption(imageInfo(),definition.c_str());
|
|
}
|
|
|
|
bool Magick::Image::defineSet(const std::string &magick_,
|
|
const std::string &key_ ) const
|
|
{
|
|
const char
|
|
*option;
|
|
|
|
std::string
|
|
key;
|
|
|
|
key=magick_ + ":" + key_;
|
|
option=GetImageOption(constImageInfo(),key.c_str());
|
|
if (option)
|
|
return(true);
|
|
return(false);
|
|
}
|
|
|
|
void Magick::Image::defineValue(const std::string &magick_,
|
|
const std::string &key_,const std::string &value_)
|
|
{
|
|
std::string
|
|
format,
|
|
option;
|
|
|
|
modifyImage();
|
|
format=magick_ + ":" + key_;
|
|
option=value_;
|
|
(void) SetImageOption(imageInfo(),format.c_str(),option.c_str());
|
|
}
|
|
|
|
std::string Magick::Image::defineValue(const std::string &magick_,
|
|
const std::string &key_) const
|
|
{
|
|
const char
|
|
*option;
|
|
|
|
std::string
|
|
definition;
|
|
|
|
definition=magick_ + ":" + key_;
|
|
option=GetImageOption(constImageInfo(),definition.c_str());
|
|
if (option)
|
|
return(std::string(option));
|
|
return(std::string());
|
|
}
|
|
|
|
void Magick::Image::deskew(const double threshold_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=DeskewImage(constImage(),threshold_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::despeckle(void)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=DespeckleImage(constImage(),exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::display(void)
|
|
{
|
|
GetPPException;
|
|
DisplayImages(imageInfo(),image(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::distort(const DistortMethod method_,
|
|
const size_t numberArguments_,const double *arguments_,const bool bestfit_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=DistortImage(constImage(), method_,numberArguments_,arguments_,
|
|
bestfit_ == true ? MagickTrue : MagickFalse,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::draw(const Magick::Drawable &drawable_)
|
|
{
|
|
DrawingWand
|
|
*wand;
|
|
|
|
modifyImage();
|
|
|
|
wand=AcquireDrawingWand(options()->drawInfo(),image());
|
|
|
|
if(wand)
|
|
{
|
|
drawable_.operator()(wand);
|
|
|
|
DrawRender(wand);
|
|
|
|
ClonePPDrawException(wand);
|
|
wand=DestroyDrawingWand(wand);
|
|
ThrowPPDrawException(quiet());
|
|
}
|
|
}
|
|
|
|
void Magick::Image::draw(const std::vector<Magick::Drawable> &drawable_)
|
|
{
|
|
DrawingWand
|
|
*wand;
|
|
|
|
modifyImage();
|
|
|
|
wand= AcquireDrawingWand(options()->drawInfo(),image());
|
|
|
|
if(wand)
|
|
{
|
|
for (std::vector<Magick::Drawable>::const_iterator p = drawable_.begin();
|
|
p != drawable_.end(); p++ )
|
|
{
|
|
p->operator()(wand);
|
|
if (DrawGetExceptionType(wand) != MagickCore::UndefinedException)
|
|
break;
|
|
}
|
|
|
|
if (DrawGetExceptionType(wand) == MagickCore::UndefinedException)
|
|
DrawRender(wand);
|
|
|
|
ClonePPDrawException(wand);
|
|
wand=DestroyDrawingWand(wand);
|
|
ThrowPPDrawException(quiet());
|
|
}
|
|
}
|
|
|
|
void Magick::Image::edge(const double radius_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=EdgeImage(constImage(),radius_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::emboss(const double radius_,const double sigma_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=EmbossImage(constImage(),radius_,sigma_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::encipher(const std::string &passphrase_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
EncipherImage(image(),passphrase_.c_str(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::enhance(void)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=EnhanceImage(constImage(),exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::equalize(void)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
EqualizeImage(image(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::erase(void)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
(void) SetImageBackgroundColor(image(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::evaluate(const ChannelType channel_,
|
|
const MagickEvaluateOperator operator_,double rvalue_)
|
|
{
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
EvaluateImage(image(),operator_,rvalue_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::evaluate(const ChannelType channel_,
|
|
const MagickFunction function_,const size_t number_parameters_,
|
|
const double *parameters_)
|
|
{
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
FunctionImage(image(),function_,number_parameters_,parameters_,
|
|
exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::evaluate(const ChannelType channel_,const ssize_t x_,
|
|
const ssize_t y_,const size_t columns_,const size_t rows_,
|
|
const MagickEvaluateOperator operator_,const double rvalue_)
|
|
{
|
|
RectangleInfo
|
|
geometry;
|
|
|
|
MagickCore::Image
|
|
*cropImage;
|
|
|
|
geometry.width = columns_;
|
|
geometry.height = rows_;
|
|
geometry.x = x_;
|
|
geometry.y = y_;
|
|
|
|
GetPPException;
|
|
cropImage=CropImage(image(),&geometry,exceptionInfo);
|
|
GetAndSetPPChannelMask(channel_);
|
|
EvaluateImage(cropImage,operator_,rvalue_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
(void) CompositeImage(image(),cropImage,image()->alpha_trait ==
|
|
BlendPixelTrait ? OverCompositeOp : CopyCompositeOp,MagickFalse,
|
|
geometry.x,geometry.y,exceptionInfo );
|
|
cropImage=DestroyImageList(cropImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::extent(const Geometry &geometry_ )
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
RectangleInfo
|
|
extentInfo=geometry_;
|
|
|
|
modifyImage();
|
|
extentInfo.x=geometry_.xOff();
|
|
extentInfo.y=geometry_.yOff();
|
|
GetPPException;
|
|
newImage=ExtentImage(image(),&extentInfo,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::extent(const Geometry &geometry_,
|
|
const Color &backgroundColor_)
|
|
{
|
|
backgroundColor(backgroundColor_);
|
|
extent(geometry_);
|
|
}
|
|
|
|
void Magick::Image::extent(const Geometry &geometry_,
|
|
const Color &backgroundColor_,const GravityType gravity_)
|
|
{
|
|
backgroundColor(backgroundColor_);
|
|
extent(geometry_,gravity_);
|
|
}
|
|
|
|
void Magick::Image::extent(const Geometry &geometry_,
|
|
const GravityType gravity_)
|
|
{
|
|
RectangleInfo
|
|
geometry;
|
|
|
|
SetGeometry(image(),&geometry);
|
|
geometry.width=geometry_.width();
|
|
geometry.height=geometry_.height();
|
|
GravityAdjustGeometry(image()->columns,image()->rows,gravity_,&geometry);
|
|
extent(geometry);
|
|
}
|
|
|
|
void Magick::Image::flip(void)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=FlipImage(constImage(),exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::floodFillAlpha(const ssize_t x_,const ssize_t y_,
|
|
const unsigned int alpha_,const bool invert_)
|
|
{
|
|
PixelInfo
|
|
target;
|
|
|
|
modifyImage();
|
|
|
|
target=static_cast<PixelInfo>(pixelColor(x_,y_));
|
|
target.alpha=alpha_;
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(AlphaChannel);
|
|
FloodfillPaintImage(image(),options()->drawInfo(),&target,x_,y_,
|
|
(MagickBooleanType)invert_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::floodFillAlpha(const ssize_t x_,const ssize_t y_,
|
|
const unsigned int alpha_,const Color &target_,const bool invert_)
|
|
{
|
|
PixelInfo
|
|
target;
|
|
|
|
modifyImage();
|
|
|
|
target=static_cast<PixelInfo>(target_);
|
|
target.alpha=alpha_;
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(AlphaChannel);
|
|
FloodfillPaintImage(image(),options()->drawInfo(),&target,x_,y_,
|
|
(MagickBooleanType)invert_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::floodFillColor(const Geometry &point_,
|
|
const Magick::Color &fillColor_,const bool invert_)
|
|
{
|
|
floodFillColor(point_.xOff(),point_.yOff(),fillColor_,invert_);
|
|
}
|
|
|
|
void Magick::Image::floodFillColor(const ssize_t x_,const ssize_t y_,
|
|
const Magick::Color &fillColor_,const bool invert_)
|
|
{
|
|
PixelInfo
|
|
pixel;
|
|
|
|
modifyImage();
|
|
|
|
pixel=static_cast<PixelInfo>(pixelColor(x_,y_));
|
|
floodFill(x_,y_,(Magick::Image *)NULL,fillColor_,&pixel,invert_);
|
|
}
|
|
|
|
void Magick::Image::floodFillColor(const Geometry &point_,
|
|
const Magick::Color &fillColor_,const Magick::Color &borderColor_,
|
|
const bool invert_)
|
|
{
|
|
floodFillColor(point_.xOff(),point_.yOff(),fillColor_,borderColor_,invert_);
|
|
}
|
|
|
|
void Magick::Image::floodFillColor(const ssize_t x_,const ssize_t y_,
|
|
const Magick::Color &fillColor_,const Magick::Color &borderColor_,
|
|
const bool invert_)
|
|
{
|
|
PixelInfo
|
|
pixel;
|
|
|
|
modifyImage();
|
|
|
|
pixel=static_cast<PixelInfo>(borderColor_);
|
|
floodFill(x_,y_,(Magick::Image *)NULL,fillColor_,&pixel,invert_);
|
|
}
|
|
|
|
void Magick::Image::floodFillTexture(const Magick::Geometry &point_,
|
|
const Magick::Image &texture_,const bool invert_)
|
|
{
|
|
floodFillTexture(point_.xOff(),point_.yOff(),texture_,invert_);
|
|
}
|
|
|
|
void Magick::Image::floodFillTexture(const ssize_t x_,const ssize_t y_,
|
|
const Magick::Image &texture_,const bool invert_)
|
|
{
|
|
PixelInfo
|
|
pixel;
|
|
|
|
modifyImage();
|
|
|
|
pixel=static_cast<PixelInfo>(pixelColor(x_,y_));
|
|
floodFill(x_,y_,&texture_,Magick::Color(),&pixel,invert_);
|
|
}
|
|
|
|
void Magick::Image::floodFillTexture(const Magick::Geometry &point_,
|
|
const Magick::Image &texture_,const Magick::Color &borderColor_,
|
|
const bool invert_)
|
|
{
|
|
floodFillTexture(point_.xOff(),point_.yOff(),texture_,borderColor_,invert_);
|
|
}
|
|
|
|
void Magick::Image::floodFillTexture(const ssize_t x_,const ssize_t y_,
|
|
const Magick::Image &texture_,const Magick::Color &borderColor_,
|
|
const bool invert_)
|
|
{
|
|
PixelInfo
|
|
pixel;
|
|
|
|
modifyImage();
|
|
|
|
pixel=static_cast<PixelInfo>(borderColor_);
|
|
floodFill(x_,y_,&texture_,Magick::Color(),&pixel,invert_);
|
|
}
|
|
|
|
void Magick::Image::flop(void)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=FlopImage(constImage(),exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::fontTypeMetrics(const std::string &text_,
|
|
TypeMetric *metrics)
|
|
{
|
|
DrawInfo
|
|
*drawInfo;
|
|
|
|
drawInfo=options()->drawInfo();
|
|
drawInfo->text=const_cast<char *>(text_.c_str());
|
|
GetPPException;
|
|
GetTypeMetrics(image(),drawInfo,&(metrics->_typeMetric),exceptionInfo);
|
|
drawInfo->text=0;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::fontTypeMetricsMultiline(const std::string &text_,
|
|
TypeMetric *metrics)
|
|
{
|
|
DrawInfo
|
|
*drawInfo;
|
|
|
|
drawInfo=options()->drawInfo();
|
|
drawInfo->text=const_cast<char *>(text_.c_str());
|
|
GetPPException;
|
|
GetMultilineTypeMetrics(image(),drawInfo,&(metrics->_typeMetric),exceptionInfo);
|
|
drawInfo->text=0;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::frame(const Geometry &geometry_)
|
|
{
|
|
FrameInfo
|
|
info;
|
|
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
info.x=static_cast<ssize_t>(geometry_.width());
|
|
info.y=static_cast<ssize_t>(geometry_.height());
|
|
info.width=columns() + (static_cast<size_t>(info.x) << 1);
|
|
info.height=rows() + (static_cast<size_t>(info.y) << 1);
|
|
info.outer_bevel=geometry_.xOff();
|
|
info.inner_bevel=geometry_.yOff();
|
|
|
|
GetPPException;
|
|
newImage=FrameImage(constImage(),&info,image()->compose,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::frame(const size_t width_,const size_t height_,
|
|
const ssize_t innerBevel_,const ssize_t outerBevel_)
|
|
{
|
|
FrameInfo
|
|
info;
|
|
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
info.x=static_cast<ssize_t>(width_);
|
|
info.y=static_cast<ssize_t>(height_);
|
|
info.width=columns() + (static_cast<size_t>(info.x) << 1);
|
|
info.height=rows() + (static_cast<size_t>(info.y) << 1);
|
|
info.outer_bevel=static_cast<ssize_t>(outerBevel_);
|
|
info.inner_bevel=static_cast<ssize_t>(innerBevel_);
|
|
|
|
GetPPException;
|
|
newImage=FrameImage(constImage(),&info,image()->compose,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::fx(const std::string expression_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=FxImage(constImage(),expression_.c_str(),exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::fx(const std::string expression_,
|
|
const Magick::ChannelType channel_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
newImage=FxImage(constImage(),expression_.c_str(),exceptionInfo);
|
|
RestorePPChannelMask;
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::gamma(const double gamma_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
GammaImage(image(),gamma_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::gamma(const double gammaRed_,const double gammaGreen_,
|
|
const double gammaBlue_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(RedChannel);
|
|
(void) GammaImage(image(),gammaRed_,exceptionInfo);
|
|
SetPPChannelMask(GreenChannel);
|
|
(void) GammaImage(image(),gammaGreen_,exceptionInfo);
|
|
SetPPChannelMask(BlueChannel);
|
|
(void) GammaImage(image(),gammaBlue_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::gaussianBlur(const double radius_,const double sigma_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=GaussianBlurImage(constImage(),radius_,sigma_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::gaussianBlurChannel(const ChannelType channel_,
|
|
const double radius_,const double sigma_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
newImage=GaussianBlurImage(constImage(),radius_,sigma_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
const Magick::Quantum *Magick::Image::getConstPixels(const ssize_t x_,
|
|
const ssize_t y_,const size_t columns_,const size_t rows_) const
|
|
{
|
|
const Quantum
|
|
*p;
|
|
|
|
GetPPException;
|
|
p=GetVirtualPixels(constImage(),x_, y_,columns_, rows_,exceptionInfo);
|
|
ThrowImageException;
|
|
return(p);
|
|
}
|
|
|
|
const void *Magick::Image::getConstMetacontent(void) const
|
|
{
|
|
const void
|
|
*result;
|
|
|
|
result=GetVirtualMetacontent(constImage());
|
|
|
|
if(!result)
|
|
throwExceptionExplicit(MagickCore::OptionError,
|
|
"Unable to retrieve meta content.");
|
|
|
|
return(result);
|
|
}
|
|
|
|
void *Magick::Image::getMetacontent(void )
|
|
{
|
|
void
|
|
*result;
|
|
|
|
result=GetAuthenticMetacontent(image());
|
|
|
|
if(!result)
|
|
throwExceptionExplicit(MagickCore::OptionError,
|
|
"Unable to retrieve meta content.");
|
|
|
|
return(result);
|
|
}
|
|
|
|
Magick::Quantum *Magick::Image::getPixels(const ssize_t x_,const ssize_t y_,
|
|
const size_t columns_,const size_t rows_)
|
|
{
|
|
Quantum
|
|
*result;
|
|
|
|
modifyImage();
|
|
GetPPException;
|
|
result=GetAuthenticPixels(image(),x_, y_,columns_,rows_,exceptionInfo);
|
|
ThrowImageException;
|
|
|
|
return(result);
|
|
}
|
|
|
|
void Magick::Image::grayscale(const PixelIntensityMethod method_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
(void) GrayscaleImage(image(),method_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::haldClut(const Image &clutImage_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
(void) HaldClutImage(image(),clutImage_.constImage(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::houghLine(const size_t width_,const size_t height_,
|
|
const size_t threshold_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=HoughLineImage(constImage(),width_,height_,threshold_,
|
|
exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
Magick::ImageType Magick::Image::identifyType(void) const
|
|
{
|
|
ImageType
|
|
image_type;
|
|
|
|
GetPPException;
|
|
image_type=IdentifyImageType(constImage(),exceptionInfo);
|
|
ThrowImageException;
|
|
return(image_type);
|
|
}
|
|
|
|
void Magick::Image::implode(const double factor_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=ImplodeImage(constImage(),factor_,image()->interpolate,
|
|
exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::inverseFourierTransform(const Image &phase_)
|
|
{
|
|
inverseFourierTransform(phase_,true);
|
|
}
|
|
|
|
void Magick::Image::inverseFourierTransform(const Image &phase_,
|
|
const bool magnitude_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=InverseFourierTransformImage(constImage(),phase_.constImage(),
|
|
magnitude_ == true ? MagickTrue : MagickFalse,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::kuwahara(const double radius_,const double sigma_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=KuwaharaImage(constImage(),radius_,sigma_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::kuwaharaChannel(const ChannelType channel_,
|
|
const double radius_,const double sigma_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
newImage=KuwaharaImage(constImage(),radius_,sigma_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::level(const double blackPoint_,const double whitePoint_,
|
|
const double gamma_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
(void) LevelImage(image(),blackPoint_,whitePoint_,gamma_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::levelChannel(const ChannelType channel_,
|
|
const double blackPoint_,const double whitePoint_,const double gamma_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
(void) LevelImage(image(),blackPoint_,whitePoint_,gamma_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::levelColors(const Color &blackColor_,
|
|
const Color &whiteColor_,const bool invert_)
|
|
{
|
|
PixelInfo
|
|
black,
|
|
white;
|
|
|
|
modifyImage();
|
|
|
|
black=static_cast<PixelInfo>(blackColor_);
|
|
white=static_cast<PixelInfo>(whiteColor_);
|
|
GetPPException;
|
|
(void) LevelImageColors(image(),&black,&white,invert_ == true ?
|
|
MagickTrue : MagickFalse,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::levelColorsChannel(const ChannelType channel_,
|
|
const Color &blackColor_,const Color &whiteColor_,const bool invert_)
|
|
{
|
|
PixelInfo
|
|
black,
|
|
white;
|
|
|
|
modifyImage();
|
|
|
|
black=static_cast<PixelInfo>(blackColor_);
|
|
white=static_cast<PixelInfo>(whiteColor_);
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
(void) LevelImageColors(image(),&black,&white,invert_ == true ?
|
|
MagickTrue : MagickFalse,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::levelize(const double blackPoint_,const double whitePoint_,
|
|
const double gamma_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
(void) LevelizeImage(image(),blackPoint_,whitePoint_,gamma_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::levelizeChannel(const ChannelType channel_,
|
|
const double blackPoint_,const double whitePoint_,const double gamma_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
(void) LevelizeImage(image(),blackPoint_,whitePoint_,gamma_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::linearStretch(const double blackPoint_,
|
|
const double whitePoint_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
LinearStretchImage(image(),blackPoint_,whitePoint_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::liquidRescale(const Geometry &geometry_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
size_t
|
|
height=rows(),
|
|
width=columns();
|
|
|
|
ssize_t
|
|
x=0,
|
|
y=0;
|
|
|
|
ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
|
|
&height);
|
|
|
|
GetPPException;
|
|
newImage=LiquidRescaleImage(image(),width,height,x,y,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::localContrast(const double radius_,const double strength_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=LocalContrastImage(constImage(),radius_,strength_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::localContrastChannel(const ChannelType channel_,
|
|
const double radius_,const double strength_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
newImage=LocalContrastImage(constImage(),radius_,strength_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::magnify(void)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=MagnifyImage(constImage(),exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::map(const Image &mapImage_,const bool dither_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
options()->quantizeDither(dither_);
|
|
RemapImage(options()->quantizeInfo(),image(),mapImage_.constImage(),
|
|
exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::meanShift(const size_t width_,const size_t height_,
|
|
const double color_distance_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=MeanShiftImage(constImage(),width_,height_,color_distance_,
|
|
exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::medianFilter(const double radius_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=StatisticImage(image(),MedianStatistic,(size_t) radius_,
|
|
(size_t) radius_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::minify(void)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=MinifyImage(constImage(),exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::modulate(const double brightness_,const double saturation_,
|
|
const double hue_)
|
|
{
|
|
char
|
|
modulate[MagickPathExtent + 1];
|
|
|
|
FormatLocaleString(modulate,MagickPathExtent,"%3.6f,%3.6f,%3.6f",brightness_,
|
|
saturation_,hue_);
|
|
|
|
modifyImage();
|
|
GetPPException;
|
|
ModulateImage(image(),modulate,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
Magick::ImageMoments Magick::Image::moments(void) const
|
|
{
|
|
return(ImageMoments(*this));
|
|
}
|
|
|
|
void Magick::Image::morphology(const MorphologyMethod method_,
|
|
const std::string kernel_,const ssize_t iterations_)
|
|
{
|
|
KernelInfo
|
|
*kernel;
|
|
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
kernel=AcquireKernelInfo(kernel_.c_str(),exceptionInfo);
|
|
if (kernel == (KernelInfo *) NULL)
|
|
throwExceptionExplicit(MagickCore::OptionError,"Unable to parse kernel.");
|
|
newImage=MorphologyImage(constImage(),method_,iterations_,kernel,
|
|
exceptionInfo);
|
|
replaceImage(newImage);
|
|
kernel=DestroyKernelInfo(kernel);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::morphology(const MorphologyMethod method_,
|
|
const KernelInfoType kernel_,const std::string arguments_,
|
|
const ssize_t iterations_)
|
|
{
|
|
const char
|
|
*option;
|
|
|
|
std::string
|
|
kernel;
|
|
|
|
option=CommandOptionToMnemonic(MagickKernelOptions,kernel_);
|
|
if (option == (const char *)NULL)
|
|
{
|
|
throwExceptionExplicit(MagickCore::OptionError,
|
|
"Unable to determine kernel type.");
|
|
return;
|
|
}
|
|
kernel=std::string(option);
|
|
if (!arguments_.empty())
|
|
kernel+=":"+arguments_;
|
|
|
|
morphology(method_,kernel,iterations_);
|
|
}
|
|
|
|
void Magick::Image::morphologyChannel(const ChannelType channel_,
|
|
const MorphologyMethod method_,const std::string kernel_,
|
|
const ssize_t iterations_)
|
|
{
|
|
KernelInfo
|
|
*kernel;
|
|
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
|
|
GetPPException;
|
|
kernel=AcquireKernelInfo(kernel_.c_str(),exceptionInfo);
|
|
if (kernel == (KernelInfo *)NULL)
|
|
{
|
|
throwExceptionExplicit(MagickCore::OptionError,
|
|
"Unable to parse kernel.");
|
|
return;
|
|
}
|
|
GetAndSetPPChannelMask(channel_);
|
|
newImage=MorphologyImage(constImage(),method_,iterations_,kernel,
|
|
exceptionInfo);
|
|
RestorePPChannelMask;
|
|
replaceImage(newImage);
|
|
kernel=DestroyKernelInfo(kernel);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::morphologyChannel(const ChannelType channel_,
|
|
const MorphologyMethod method_,const KernelInfoType kernel_,
|
|
const std::string arguments_,const ssize_t iterations_)
|
|
{
|
|
const char
|
|
*option;
|
|
|
|
std::string
|
|
kernel;
|
|
|
|
option=CommandOptionToMnemonic(MagickKernelOptions,kernel_);
|
|
if (option == (const char *)NULL)
|
|
{
|
|
throwExceptionExplicit(MagickCore::OptionError,
|
|
"Unable to determine kernel type.");
|
|
return;
|
|
}
|
|
|
|
kernel=std::string(option);
|
|
if (!arguments_.empty())
|
|
kernel+=":"+arguments_;
|
|
|
|
morphologyChannel(channel_,method_,kernel,iterations_);
|
|
}
|
|
|
|
void Magick::Image::motionBlur(const double radius_,const double sigma_,
|
|
const double angle_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=MotionBlurImage(constImage(),radius_,sigma_,angle_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::negate(const bool grayscale_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
NegateImage(image(),(MagickBooleanType) grayscale_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::negateChannel(const ChannelType channel_,
|
|
const bool grayscale_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
NegateImage(image(),(MagickBooleanType) grayscale_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::normalize(void)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
NormalizeImage(image(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::oilPaint(const double radius_,const double sigma_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=OilPaintImage(constImage(),radius_,sigma_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::opaque(const Color &opaqueColor_,const Color &penColor_,
|
|
const bool invert_)
|
|
{
|
|
std::string
|
|
opaqueColor,
|
|
penColor;
|
|
|
|
PixelInfo
|
|
opaque,
|
|
pen;
|
|
|
|
if (!opaqueColor_.isValid())
|
|
throwExceptionExplicit(MagickCore::OptionError,
|
|
"Opaque color argument is invalid");
|
|
|
|
if (!penColor_.isValid())
|
|
throwExceptionExplicit(MagickCore::OptionError,
|
|
"Pen color argument is invalid");
|
|
|
|
modifyImage();
|
|
opaqueColor=opaqueColor_;
|
|
penColor=penColor_;
|
|
|
|
GetPPException;
|
|
(void) QueryColorCompliance(opaqueColor.c_str(),AllCompliance,&opaque,
|
|
exceptionInfo);
|
|
(void) QueryColorCompliance(penColor.c_str(),AllCompliance,&pen,
|
|
exceptionInfo);
|
|
OpaquePaintImage(image(),&opaque,&pen,invert_ ? MagickTrue : MagickFalse,
|
|
exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::orderedDither(std::string thresholdMap_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
(void) OrderedDitherImage(image(),thresholdMap_.c_str(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::orderedDitherChannel(const ChannelType channel_,
|
|
std::string thresholdMap_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
(void)OrderedDitherImage(image(),thresholdMap_.c_str(),exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::perceptible(const double epsilon_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
PerceptibleImage(image(),epsilon_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::perceptibleChannel(const ChannelType channel_,
|
|
const double epsilon_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
PerceptibleImage(image(),epsilon_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
Magick::ImagePerceptualHash Magick::Image::perceptualHash() const
|
|
{
|
|
return(ImagePerceptualHash(*this));
|
|
}
|
|
|
|
void Magick::Image::ping(const std::string &imageSpec_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
options()->fileName(imageSpec_);
|
|
newImage=PingImage(imageInfo(),exceptionInfo);
|
|
read(newImage,exceptionInfo);
|
|
}
|
|
|
|
void Magick::Image::ping(const Blob& blob_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=PingBlob(imageInfo(),blob_.data(),blob_.length(),exceptionInfo);
|
|
read(newImage,exceptionInfo);
|
|
}
|
|
|
|
void Magick::Image::pixelColor(const ssize_t x_,const ssize_t y_,
|
|
const Color &color_)
|
|
{
|
|
PixelInfo
|
|
packet;
|
|
|
|
Quantum
|
|
*pixel;
|
|
|
|
// Test arguments to ensure they are within the image.
|
|
if (y_ > (ssize_t) rows() || x_ > (ssize_t) columns())
|
|
throwExceptionExplicit(MagickCore::OptionError,
|
|
"Access outside of image boundary");
|
|
|
|
modifyImage();
|
|
|
|
// Set image to DirectClass
|
|
classType(DirectClass );
|
|
|
|
// Get pixel view
|
|
Pixels pixels(*this);
|
|
// Set pixel value
|
|
pixel=pixels.get(x_, y_, 1, 1 );
|
|
packet=color_;
|
|
MagickCore::SetPixelViaPixelInfo(constImage(),&packet,pixel);
|
|
// Tell ImageMagick that pixels have been updated
|
|
pixels.sync();
|
|
}
|
|
|
|
Magick::Color Magick::Image::pixelColor(const ssize_t x_,
|
|
const ssize_t y_) const
|
|
{
|
|
const Quantum
|
|
*pixel;
|
|
|
|
pixel=getConstPixels(x_,y_,1,1);
|
|
if (pixel)
|
|
{
|
|
PixelInfo
|
|
packet;
|
|
|
|
MagickCore::GetPixelInfoPixel(constImage(),pixel,&packet);
|
|
return(Color(packet));
|
|
}
|
|
|
|
return(Color()); // invalid
|
|
}
|
|
|
|
void Magick::Image::polaroid(const std::string &caption_,const double angle_,
|
|
const PixelInterpolateMethod method_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=PolaroidImage(constImage(),options()->drawInfo(),caption_.c_str(),
|
|
angle_,method_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::posterize(const size_t levels_,const DitherMethod method_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
PosterizeImage(image(),levels_,method_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::posterizeChannel(const ChannelType channel_,
|
|
const size_t levels_,const DitherMethod method_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
PosterizeImage(image(),levels_,method_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::process(std::string name_,const ssize_t argc,
|
|
const char **argv)
|
|
{
|
|
modifyImage();
|
|
|
|
GetPPException;
|
|
(void) InvokeDynamicImageFilter(name_.c_str(),&image(),argc,argv,
|
|
exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::profile(const std::string name_,
|
|
const Magick::Blob &profile_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
(void) ProfileImage(image(),name_.c_str(),(unsigned char *)profile_.data(),
|
|
profile_.length(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
Magick::Blob Magick::Image::profile(const std::string name_) const
|
|
{
|
|
const StringInfo
|
|
*profile;
|
|
|
|
profile=GetImageProfile(constImage(),name_.c_str());
|
|
|
|
if (profile == (StringInfo *) NULL)
|
|
return(Blob());
|
|
return(Blob((void*) GetStringInfoDatum(profile),GetStringInfoLength(
|
|
profile)));
|
|
}
|
|
|
|
void Magick::Image::quantize(const bool measureError_)
|
|
{
|
|
modifyImage();
|
|
|
|
if (measureError_)
|
|
options()->quantizeInfo()->measure_error=MagickTrue;
|
|
else
|
|
options()->quantizeInfo()->measure_error=MagickFalse;
|
|
|
|
GetPPException;
|
|
QuantizeImage(options()->quantizeInfo(),image(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::raise(const Geometry &geometry_,const bool raisedFlag_)
|
|
{
|
|
RectangleInfo
|
|
raiseInfo=geometry_;
|
|
|
|
GetPPException;
|
|
modifyImage();
|
|
RaiseImage(image(),&raiseInfo,raisedFlag_ == true ? MagickTrue : MagickFalse,
|
|
exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::randomThreshold(const double low_,const double high_)
|
|
{
|
|
GetPPException;
|
|
(void) RandomThresholdImage(image(),low_,high_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::randomThresholdChannel(const ChannelType channel_,
|
|
const double low_,const double high_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
(void) RandomThresholdImage(image(),low_,high_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::read(const Blob &blob_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=BlobToImage(imageInfo(),static_cast<const void *>(blob_.data()),
|
|
blob_.length(),exceptionInfo);
|
|
read(newImage,exceptionInfo);
|
|
}
|
|
|
|
void Magick::Image::read(const Blob &blob_,const Geometry &size_)
|
|
{
|
|
size(size_);
|
|
read(blob_);
|
|
}
|
|
|
|
void Magick::Image::read(const Blob &blob_,const Geometry &size_,
|
|
const size_t depth_)
|
|
{
|
|
size(size_);
|
|
depth(depth_);
|
|
read(blob_);
|
|
}
|
|
|
|
void Magick::Image::read(const Blob &blob_,const Geometry &size_,
|
|
const size_t depth_,const std::string &magick_)
|
|
{
|
|
size(size_);
|
|
depth(depth_);
|
|
magick(magick_);
|
|
// Set explicit image format
|
|
fileName(magick_ + ':');
|
|
read(blob_);
|
|
}
|
|
|
|
void Magick::Image::read(const Blob &blob_,const Geometry &size_,
|
|
const std::string &magick_)
|
|
{
|
|
size(size_);
|
|
magick(magick_);
|
|
// Set explicit image format
|
|
fileName(magick_ + ':');
|
|
read(blob_);
|
|
}
|
|
|
|
void Magick::Image::read(const Geometry &size_,const std::string &imageSpec_)
|
|
{
|
|
size(size_);
|
|
read(imageSpec_);
|
|
}
|
|
|
|
void Magick::Image::read(const size_t width_,const size_t height_,
|
|
const std::string &map_,const StorageType type_,const void *pixels_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=ConstituteImage(width_,height_,map_.c_str(),type_, pixels_,
|
|
exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::read(const std::string &imageSpec_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
options()->fileName(imageSpec_);
|
|
newImage=ReadImage(imageInfo(),exceptionInfo);
|
|
read(newImage,exceptionInfo);
|
|
}
|
|
|
|
void Magick::Image::readMask(const Magick::Image &mask_)
|
|
{
|
|
mask(mask_,ReadPixelMask);
|
|
}
|
|
|
|
Magick::Image Magick::Image::readMask(void) const
|
|
{
|
|
return(mask(ReadPixelMask));
|
|
}
|
|
|
|
void Magick::Image::readPixels(const Magick::QuantumType quantum_,
|
|
const unsigned char *source_)
|
|
{
|
|
QuantumInfo
|
|
*quantum_info;
|
|
|
|
quantum_info=AcquireQuantumInfo(imageInfo(),image());
|
|
GetPPException;
|
|
ImportQuantumPixels(image(),(MagickCore::CacheView *) NULL,quantum_info,
|
|
quantum_,source_,exceptionInfo);
|
|
quantum_info=DestroyQuantumInfo(quantum_info);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::reduceNoise(void)
|
|
{
|
|
reduceNoise(3);
|
|
}
|
|
|
|
void Magick::Image::reduceNoise(const size_t order_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=StatisticImage(constImage(),NonpeakStatistic,order_,
|
|
order_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::repage()
|
|
{
|
|
modifyImage();
|
|
options()->page(Geometry());
|
|
image()->page.width = 0;
|
|
image()->page.height = 0;
|
|
image()->page.x = 0;
|
|
image()->page.y = 0;
|
|
}
|
|
|
|
void Magick::Image::resample(const Point &density_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=ResampleImage(constImage(),density_.x(),density_.y(),
|
|
image()->filter,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::resize(const Geometry &geometry_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
size_t
|
|
height=rows(),
|
|
width=columns();
|
|
|
|
ssize_t
|
|
x=0,
|
|
y=0;
|
|
|
|
// Calculate new size. This code should be supported using binary arguments
|
|
// in the ImageMagick library.
|
|
ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
|
|
&height);
|
|
|
|
GetPPException;
|
|
newImage=ResizeImage(constImage(),width,height,image()->filter,
|
|
exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::roll(const Geometry &roll_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=RollImage(constImage(),roll_.xOff(),roll_.yOff(),exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::roll(const size_t columns_,const size_t rows_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=RollImage(constImage(),static_cast<ssize_t>(columns_),
|
|
static_cast<ssize_t>(rows_),exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::rotate(const double degrees_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=RotateImage(constImage(),degrees_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::rotationalBlur(const double angle_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=RotationalBlurImage(constImage(),angle_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::rotationalBlurChannel(const ChannelType channel_,
|
|
const double angle_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
newImage=RotationalBlurImage(constImage(),angle_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::sample(const Geometry &geometry_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
size_t
|
|
height=rows(),
|
|
width=columns();
|
|
|
|
ssize_t
|
|
x=0,
|
|
y=0;
|
|
|
|
ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
|
|
&height);
|
|
|
|
GetPPException;
|
|
newImage=SampleImage(constImage(),width,height,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::scale(const Geometry &geometry_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
size_t
|
|
height=rows(),
|
|
width=columns();
|
|
|
|
ssize_t
|
|
x=0,
|
|
y=0;
|
|
|
|
ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
|
|
&height);
|
|
|
|
GetPPException;
|
|
newImage=ScaleImage(constImage(),width,height,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::segment(const double clusterThreshold_,
|
|
const double smoothingThreshold_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
SegmentImage(image(),options()->quantizeColorSpace(),
|
|
(MagickBooleanType) options()->verbose(),clusterThreshold_,
|
|
smoothingThreshold_,exceptionInfo);
|
|
SyncImage(image(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::selectiveBlur(const double radius_,const double sigma_,
|
|
const double threshold_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=SelectiveBlurImage(constImage(),radius_,sigma_,threshold_,
|
|
exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::selectiveBlurChannel(const ChannelType channel_,
|
|
const double radius_,const double sigma_,const double threshold_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
newImage=SelectiveBlurImage(constImage(),radius_,sigma_,threshold_,
|
|
exceptionInfo);
|
|
RestorePPChannelMask;
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
Magick::Image Magick::Image::separate(const ChannelType channel_) const
|
|
{
|
|
MagickCore::Image
|
|
*image;
|
|
|
|
GetPPException;
|
|
image=SeparateImage(constImage(),channel_,exceptionInfo);
|
|
ThrowImageException;
|
|
if (image == (MagickCore::Image *) NULL)
|
|
return(Magick::Image());
|
|
else
|
|
return(Magick::Image(image));
|
|
}
|
|
|
|
void Magick::Image::sepiaTone(const double threshold_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=SepiaToneImage(constImage(),threshold_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
bool Magick::Image::setColorMetric(const Image &reference_)
|
|
{
|
|
bool
|
|
status;
|
|
|
|
Image
|
|
ref=reference_;
|
|
|
|
GetPPException;
|
|
modifyImage();
|
|
status=static_cast<bool>(SetImageColorMetric(image(),ref.constImage(),
|
|
exceptionInfo));
|
|
ThrowImageException;
|
|
return(status);
|
|
}
|
|
|
|
Magick::Quantum *Magick::Image::setPixels(const ssize_t x_,const ssize_t y_,
|
|
const size_t columns_,const size_t rows_)
|
|
{
|
|
Quantum
|
|
*result;
|
|
|
|
modifyImage();
|
|
GetPPException;
|
|
result=QueueAuthenticPixels(image(),x_,y_,columns_,rows_,exceptionInfo);
|
|
ThrowImageException;
|
|
return(result);
|
|
}
|
|
|
|
void Magick::Image::shade(const double azimuth_,const double elevation_,
|
|
const bool colorShading_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=ShadeImage(constImage(),colorShading_ == true ?
|
|
MagickTrue : MagickFalse,azimuth_,elevation_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::shadow(const double percent_opacity_,const double sigma_,
|
|
const ssize_t x_,const ssize_t y_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=ShadowImage(constImage(),percent_opacity_, sigma_,x_, y_,
|
|
exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::sharpen(const double radius_,const double sigma_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=SharpenImage(constImage(),radius_,sigma_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::sharpenChannel(const ChannelType channel_,
|
|
const double radius_,const double sigma_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
newImage=SharpenImage(constImage(),radius_,sigma_,exceptionInfo);
|
|
RestorePPChannelMask;
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::shave(const Geometry &geometry_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
RectangleInfo
|
|
shaveInfo=geometry_;
|
|
|
|
GetPPException;
|
|
newImage=ShaveImage(constImage(),&shaveInfo,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::shear(const double xShearAngle_,const double yShearAngle_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=ShearImage(constImage(),xShearAngle_,yShearAngle_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::sigmoidalContrast(const bool sharpen_,
|
|
const double contrast,const double midpoint)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
(void) SigmoidalContrastImage(image(),(MagickBooleanType) sharpen_,contrast,
|
|
midpoint,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
std::string Magick::Image::signature(const bool force_) const
|
|
{
|
|
return(_imgRef->signature(force_));
|
|
}
|
|
|
|
void Magick::Image::sketch(const double radius_,const double sigma_,
|
|
const double angle_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=SketchImage(constImage(),radius_,sigma_,angle_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::solarize(const double factor_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
SolarizeImage(image(),factor_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::sparseColor(const ChannelType channel_,
|
|
const SparseColorMethod method_,const size_t numberArguments_,
|
|
const double *arguments_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
newImage=SparseColorImage(constImage(),method_,numberArguments_,arguments_,
|
|
exceptionInfo);
|
|
RestorePPChannelMask;
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::splice(const Geometry &geometry_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
RectangleInfo
|
|
spliceInfo=geometry_;
|
|
|
|
GetPPException;
|
|
newImage=SpliceImage(constImage(),&spliceInfo,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::splice(const Geometry &geometry_,
|
|
const Color &backgroundColor_)
|
|
{
|
|
backgroundColor(backgroundColor_);
|
|
splice(geometry_);
|
|
}
|
|
|
|
void Magick::Image::splice(const Geometry &geometry_,
|
|
const Color &backgroundColor_,const GravityType gravity_)
|
|
{
|
|
backgroundColor(backgroundColor_);
|
|
image()->gravity=gravity_;
|
|
splice(geometry_);
|
|
}
|
|
|
|
void Magick::Image::spread(const double amount_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=SpreadImage(constImage(),image()->interpolate,amount_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
Magick::ImageStatistics Magick::Image::statistics() const
|
|
{
|
|
return(ImageStatistics(*this));
|
|
}
|
|
|
|
void Magick::Image::stegano(const Image &watermark_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=SteganoImage(constImage(),watermark_.constImage(),exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::stereo(const Image &rightImage_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=StereoImage(constImage(),rightImage_.constImage(),exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::strip(void)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
StripImage(image(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
Magick::Image Magick::Image::subImageSearch(const Image &reference_,
|
|
const MetricType metric_,Geometry *offset_,double *similarityMetric_,
|
|
const double similarityThreshold)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
RectangleInfo
|
|
offset;
|
|
|
|
GetPPException;
|
|
newImage=SimilarityImage(image(),reference_.constImage(),metric_,
|
|
similarityThreshold,&offset,similarityMetric_,exceptionInfo);
|
|
ThrowImageException;
|
|
if (offset_ != (Geometry *) NULL)
|
|
*offset_=offset;
|
|
if (newImage == (MagickCore::Image *) NULL)
|
|
return(Magick::Image());
|
|
else
|
|
return(Magick::Image(newImage));
|
|
}
|
|
|
|
void Magick::Image::swirl(const double degrees_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=SwirlImage(constImage(),degrees_,image()->interpolate,
|
|
exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::syncPixels(void)
|
|
{
|
|
GetPPException;
|
|
(void) SyncAuthenticPixels(image(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::texture(const Image &texture_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
TextureImage(image(),texture_.constImage(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::threshold(const double threshold_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
BilevelImage(image(),threshold_,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::thumbnail(const Geometry &geometry_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
size_t
|
|
height=rows(),
|
|
width=columns();
|
|
|
|
ssize_t
|
|
x=0,
|
|
y=0;
|
|
|
|
ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
|
|
&height);
|
|
|
|
GetPPException;
|
|
newImage=ThumbnailImage(constImage(),width,height,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::tint(const std::string opacity_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
PixelInfo
|
|
color;
|
|
|
|
GetPPException;
|
|
color=static_cast<PixelInfo>(constOptions()->fillColor());
|
|
newImage=TintImage(constImage(),opacity_.c_str(),&color,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::transformOrigin(const double x_,const double y_)
|
|
{
|
|
modifyImage();
|
|
options()->transformOrigin(x_,y_);
|
|
}
|
|
|
|
void Magick::Image::transformReset(void)
|
|
{
|
|
modifyImage();
|
|
options()->transformReset();
|
|
}
|
|
|
|
void Magick::Image::transformScale(const double sx_,const double sy_)
|
|
{
|
|
modifyImage();
|
|
options()->transformScale(sx_,sy_);
|
|
}
|
|
|
|
void Magick::Image::transparent(const Color &color_,const bool inverse_)
|
|
{
|
|
PixelInfo
|
|
target;
|
|
|
|
std::string
|
|
color;
|
|
|
|
if (!color_.isValid())
|
|
throwExceptionExplicit(MagickCore::OptionError,
|
|
"Color argument is invalid");
|
|
|
|
color=color_;
|
|
GetPPException;
|
|
(void) QueryColorCompliance(color.c_str(),AllCompliance,&target,
|
|
exceptionInfo);
|
|
modifyImage();
|
|
TransparentPaintImage(image(),&target,TransparentAlpha,
|
|
inverse_ == true ? MagickTrue : MagickFalse,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::transparentChroma(const Color &colorLow_,
|
|
const Color &colorHigh_)
|
|
{
|
|
std::string
|
|
colorHigh,
|
|
colorLow;
|
|
|
|
PixelInfo
|
|
targetHigh,
|
|
targetLow;
|
|
|
|
if (!colorLow_.isValid() || !colorHigh_.isValid())
|
|
throwExceptionExplicit(MagickCore::OptionError,
|
|
"Color argument is invalid");
|
|
|
|
colorLow=colorLow_;
|
|
colorHigh=colorHigh_;
|
|
|
|
GetPPException;
|
|
(void) QueryColorCompliance(colorLow.c_str(),AllCompliance,&targetLow,
|
|
exceptionInfo);
|
|
(void) QueryColorCompliance(colorHigh.c_str(),AllCompliance,&targetHigh,
|
|
exceptionInfo);
|
|
modifyImage();
|
|
TransparentPaintImageChroma(image(),&targetLow,&targetHigh,TransparentAlpha,
|
|
MagickFalse,exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::transpose(void)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=TransposeImage(constImage(),exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::transverse(void)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=TransverseImage(constImage(),exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::trim(void)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=TrimImage(constImage(),exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
Magick::Image Magick::Image::uniqueColors(void) const
|
|
{
|
|
MagickCore::Image
|
|
*image;
|
|
|
|
GetPPException;
|
|
image=UniqueImageColors(constImage(),exceptionInfo);
|
|
ThrowImageException;
|
|
if (image == (MagickCore::Image *) NULL)
|
|
return(Magick::Image());
|
|
else
|
|
return(Magick::Image(image));
|
|
}
|
|
|
|
void Magick::Image::unsharpmask(const double radius_,const double sigma_,
|
|
const double amount_,const double threshold_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=UnsharpMaskImage(constImage(),radius_,sigma_,amount_,threshold_,
|
|
exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::unsharpmaskChannel(const ChannelType channel_,
|
|
const double radius_,const double sigma_,const double amount_,
|
|
const double threshold_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
newImage=UnsharpMaskImage(constImage(),radius_,sigma_,amount_,threshold_,
|
|
exceptionInfo);
|
|
RestorePPChannelMask;
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::vignette(const double radius_,const double sigma_,
|
|
const ssize_t x_,const ssize_t y_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=VignetteImage(constImage(),radius_,sigma_,x_,y_,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::wave(const double amplitude_,const double wavelength_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=WaveImage(constImage(),amplitude_,wavelength_,image()->interpolate,
|
|
exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::waveletDenoise(const double threshold_,
|
|
const double softness_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
GetPPException;
|
|
newImage=WaveletDenoiseImage(constImage(),threshold_,softness_,
|
|
exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::whiteThreshold(const std::string &threshold_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
WhiteThresholdImage(image(),threshold_.c_str(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::whiteThresholdChannel(const ChannelType channel_,
|
|
const std::string &threshold_)
|
|
{
|
|
modifyImage();
|
|
GetPPException;
|
|
GetAndSetPPChannelMask(channel_);
|
|
WhiteThresholdImage(image(),threshold_.c_str(),exceptionInfo);
|
|
RestorePPChannelMask;
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::write(Blob *blob_)
|
|
{
|
|
size_t
|
|
length=0;
|
|
|
|
void
|
|
*data;
|
|
|
|
modifyImage();
|
|
GetPPException;
|
|
data=ImagesToBlob(constImageInfo(),image(),&length,exceptionInfo);
|
|
if (length > 0)
|
|
blob_->updateNoCopy(data,length,Blob::MallocAllocator);
|
|
else
|
|
data=RelinquishMagickMemory(data);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::write(Blob *blob_,const std::string &magick_)
|
|
{
|
|
size_t
|
|
length=0;
|
|
|
|
void
|
|
*data;
|
|
|
|
modifyImage();
|
|
magick(magick_);
|
|
GetPPException;
|
|
data=ImagesToBlob(constImageInfo(),image(),&length,exceptionInfo);
|
|
if (length > 0)
|
|
blob_->updateNoCopy(data,length,Blob::MallocAllocator);
|
|
else
|
|
data=RelinquishMagickMemory(data);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::write(Blob *blob_,const std::string &magick_,
|
|
const size_t depth_)
|
|
{
|
|
size_t
|
|
length=0;
|
|
|
|
void
|
|
*data;
|
|
|
|
modifyImage();
|
|
magick(magick_);
|
|
depth(depth_);
|
|
GetPPException;
|
|
data=ImagesToBlob(constImageInfo(),image(),&length,exceptionInfo);
|
|
if (length > 0)
|
|
blob_->updateNoCopy(data,length,Blob::MallocAllocator);
|
|
else
|
|
data=RelinquishMagickMemory(data);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::write(const ssize_t x_,const ssize_t y_,
|
|
const size_t columns_,const size_t rows_,const std::string &map_,
|
|
const StorageType type_,void *pixels_)
|
|
{
|
|
GetPPException;
|
|
ExportImagePixels(image(),x_,y_,columns_,rows_,map_.c_str(),type_,pixels_,
|
|
exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::write(const std::string &imageSpec_)
|
|
{
|
|
modifyImage();
|
|
fileName(imageSpec_);
|
|
GetPPException;
|
|
WriteImage(constImageInfo(),image(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::writeMask(const Magick::Image &mask_)
|
|
{
|
|
mask(mask_,WritePixelMask);
|
|
}
|
|
|
|
Magick::Image Magick::Image::writeMask(void) const
|
|
{
|
|
return(mask(WritePixelMask));
|
|
}
|
|
|
|
void Magick::Image::writePixels(const Magick::QuantumType quantum_,
|
|
unsigned char *destination_)
|
|
{
|
|
QuantumInfo
|
|
*quantum_info;
|
|
|
|
quantum_info=AcquireQuantumInfo(imageInfo(),image());
|
|
GetPPException;
|
|
ExportQuantumPixels(image(),(MagickCore::CacheView *) NULL,quantum_info,
|
|
quantum_,destination_, exceptionInfo);
|
|
quantum_info=DestroyQuantumInfo(quantum_info);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::zoom(const Geometry &geometry_)
|
|
{
|
|
MagickCore::Image
|
|
*newImage;
|
|
|
|
size_t
|
|
height=rows(),
|
|
width=columns();
|
|
|
|
ssize_t
|
|
x=0,
|
|
y=0;
|
|
|
|
ParseMetaGeometry(static_cast<std::string>(geometry_).c_str(),&x,&y,&width,
|
|
&height);
|
|
|
|
GetPPException;
|
|
newImage=ResizeImage(constImage(),width,height,image()->filter,exceptionInfo);
|
|
replaceImage(newImage);
|
|
ThrowImageException;
|
|
}
|
|
|
|
Magick::Image::Image(MagickCore::Image *image_)
|
|
: _imgRef(new ImageRef(image_))
|
|
{
|
|
}
|
|
|
|
MagickCore::Image *&Magick::Image::image(void)
|
|
{
|
|
return(_imgRef->image());
|
|
}
|
|
|
|
const MagickCore::Image *Magick::Image::constImage(void) const
|
|
{
|
|
return(_imgRef->image());
|
|
}
|
|
|
|
MagickCore::ImageInfo *Magick::Image::imageInfo(void)
|
|
{
|
|
return(_imgRef->options()->imageInfo());
|
|
}
|
|
|
|
const MagickCore::ImageInfo *Magick::Image::constImageInfo(void) const
|
|
{
|
|
return(_imgRef->options()->imageInfo());
|
|
}
|
|
|
|
Magick::Options *Magick::Image::options(void)
|
|
{
|
|
return(_imgRef->options());
|
|
}
|
|
|
|
const Magick::Options *Magick::Image::constOptions(void) const
|
|
{
|
|
return(_imgRef->options());
|
|
}
|
|
|
|
MagickCore::QuantizeInfo *Magick::Image::quantizeInfo(void)
|
|
{
|
|
return(_imgRef->options()->quantizeInfo());
|
|
}
|
|
|
|
const MagickCore::QuantizeInfo *Magick::Image::constQuantizeInfo(void) const
|
|
{
|
|
return(_imgRef->options()->quantizeInfo());
|
|
}
|
|
|
|
void Magick::Image::modifyImage(void)
|
|
{
|
|
if (!_imgRef->isShared())
|
|
return;
|
|
|
|
GetPPException;
|
|
replaceImage(CloneImage(image(),0,0,MagickTrue,exceptionInfo));
|
|
ThrowImageException;
|
|
}
|
|
|
|
MagickCore::Image *Magick::Image::replaceImage(MagickCore::Image *replacement_)
|
|
{
|
|
MagickCore::Image
|
|
*image;
|
|
|
|
if (replacement_)
|
|
image=replacement_;
|
|
else
|
|
{
|
|
GetPPException;
|
|
image=AcquireImage(constImageInfo(),exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
_imgRef=ImageRef::replaceImage(_imgRef,image);
|
|
return(image);
|
|
}
|
|
|
|
void Magick::Image::read(MagickCore::Image *image,
|
|
MagickCore::ExceptionInfo *exceptionInfo)
|
|
{
|
|
// Ensure that multiple image frames were not read.
|
|
if (image != (MagickCore::Image *) NULL &&
|
|
image->next != (MagickCore::Image *) NULL)
|
|
{
|
|
MagickCore::Image
|
|
*next;
|
|
|
|
// Destroy any extra image frames
|
|
next=image->next;
|
|
image->next=(MagickCore::Image *) NULL;
|
|
next->previous=(MagickCore::Image *) NULL;
|
|
DestroyImageList(next);
|
|
}
|
|
replaceImage(image);
|
|
if (exceptionInfo->severity == MagickCore::UndefinedException &&
|
|
image == (MagickCore::Image *) NULL)
|
|
{
|
|
(void) MagickCore::DestroyExceptionInfo(exceptionInfo);
|
|
if (!quiet())
|
|
throwExceptionExplicit(MagickCore::ImageWarning,
|
|
"No image was loaded.");
|
|
return;
|
|
}
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::floodFill(const ssize_t x_,const ssize_t y_,
|
|
const Magick::Image *fillPattern_,const Magick::Color &fill_,
|
|
const MagickCore::PixelInfo *target_,const bool invert_)
|
|
{
|
|
Magick::Color
|
|
fillColor;
|
|
|
|
MagickCore::Image
|
|
*fillPattern;
|
|
|
|
// Set drawing fill pattern or fill color
|
|
fillColor=options()->fillColor();
|
|
fillPattern=(MagickCore::Image *)NULL;
|
|
if (options()->fillPattern() != (MagickCore::Image *)NULL)
|
|
{
|
|
GetPPException;
|
|
fillPattern=CloneImage(options()->fillPattern(),0,0,MagickTrue,
|
|
exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
if (fillPattern_ == (Magick::Image *)NULL)
|
|
{
|
|
options()->fillPattern((MagickCore::Image *)NULL);
|
|
options()->fillColor(fill_);
|
|
}
|
|
else
|
|
options()->fillPattern(fillPattern_->constImage());
|
|
|
|
GetPPException;
|
|
(void) FloodfillPaintImage(image(),options()->drawInfo(),
|
|
target_,static_cast<ssize_t>(x_),static_cast<ssize_t>(y_),
|
|
(MagickBooleanType) invert_,exceptionInfo);
|
|
|
|
options()->fillColor(fillColor);
|
|
options()->fillPattern(fillPattern);
|
|
ThrowImageException;
|
|
}
|
|
|
|
void Magick::Image::mask(const Magick::Image &mask_,const PixelMask type)
|
|
{
|
|
modifyImage();
|
|
|
|
GetPPException;
|
|
if (mask_.isValid())
|
|
SetImageMask(image(),type,mask_.constImage(),exceptionInfo);
|
|
else
|
|
SetImageMask(image(),type,(MagickCore::Image *) NULL,
|
|
exceptionInfo);
|
|
ThrowImageException;
|
|
}
|
|
|
|
Magick::Image Magick::Image::mask(const PixelMask type) const
|
|
{
|
|
MagickCore::Image
|
|
*image;
|
|
|
|
GetPPException;
|
|
image = GetImageMask(constImage(),type,exceptionInfo);
|
|
ThrowImageException;
|
|
|
|
if (image == (MagickCore::Image *) NULL)
|
|
return(Magick::Image());
|
|
else
|
|
return(Magick::Image(image));
|
|
}
|