Image-Magick
view release on metacpan or search on metacpan
{"blur", RealReference } } },
{ "ClipMask", { {"mask", ImageReference} } },
{ "LinearStretch", { {"levels", StringReference},
{"black-point", RealReference},{"white-point", RealReference} } },
{ "ColorMatrix", { {"matrix", ArrayReference} } },
{ "Mask", { {"mask", ImageReference} } },
{ "Polaroid", { {"caption", StringReference}, {"angle", RealReference},
{"font", StringReference}, {"stroke", StringReference},
{"fill", StringReference}, {"strokewidth", RealReference},
{"pointsize", RealReference}, {"gravity", MagickGravityOptions},
{"background", StringReference},
{"interpolate", MagickInterpolateOptions} } },
{ "FloodfillPaint", { {"geometry", StringReference},
{"x", IntegerReference}, {"y", IntegerReference},
{"fill", StringReference}, {"bordercolor", StringReference},
{"fuzz", StringReference}, {"channel", MagickChannelOptions},
{"invert", MagickBooleanOptions} } },
{ "Distort", { {"points", ArrayReference}, {"method", MagickDistortOptions},
{"virtual-pixel", MagickVirtualPixelOptions},
{"best-fit", MagickBooleanOptions} } },
{ "Clut", { {"image", ImageReference},
{"interpolate", MagickInterpolateOptions},
{"channel", MagickChannelOptions} } },
{ "LiquidRescale", { {"geometry", StringReference},
{"width", IntegerReference}, {"height", IntegerReference},
{"delta-x", RealReference}, {"rigidity", RealReference } } },
{ "Encipher", { {"passphrase", StringReference} } },
{ "Decipher", { {"passphrase", StringReference} } },
{ "Deskew", { {"geometry", StringReference},
{"threshold", StringReference} } },
{ "Remap", { {"image", ImageReference},
{"dither-method", MagickDitherOptions} } },
{ "SparseColor", { {"points", ArrayReference},
{"method", MagickSparseColorOptions},
{"virtual-pixel", MagickVirtualPixelOptions},
{"channel", MagickChannelOptions} } },
{ "Function", { {"parameters", ArrayReference},
{"function", MagickFunctionOptions},
{"virtual-pixel", MagickVirtualPixelOptions} } },
{ "SelectiveBlur", { {"geometry", StringReference},
{"radius", RealReference}, {"sigma", RealReference},
{"threshold", RealReference}, {"channel", MagickChannelOptions} } },
{ "HaldClut", { {"image", ImageReference},
{"channel", MagickChannelOptions} } },
{ "BlueShift", { {"factor", StringReference} } },
{ "ForwardFourierTransform", { {"magnitude", MagickBooleanOptions} } },
{ "InverseFourierTransform", { {"magnitude", MagickBooleanOptions} } },
{ "ColorDecisionList", {
{"color-correction-collection", StringReference} } },
{ "AutoGamma", { {"channel", MagickChannelOptions} } },
{ "AutoLevel", { {"channel", MagickChannelOptions} } },
{ "LevelColors", { {"invert", MagickBooleanOptions},
{"black-point", StringReference}, {"white-point", StringReference},
{"channel", MagickChannelOptions}, {"invert", MagickBooleanOptions} } },
{ "Clamp", { {"channel", MagickChannelOptions} } },
{ "BrightnessContrast", { {"levels", StringReference},
{"brightness", RealReference},{"contrast", RealReference},
{"channel", MagickChannelOptions} } },
{ "Morphology", { {"kernel", StringReference},
{"channel", MagickChannelOptions}, {"method", MagickMorphologyOptions},
{"iterations", IntegerReference} } },
{ "Mode", { {"geometry", StringReference},
{"width", IntegerReference},{"height", IntegerReference},
{"channel", MagickChannelOptions} } },
{ "Statistic", { {"geometry", StringReference},
{"width", IntegerReference},{"height", IntegerReference},
{"channel", MagickChannelOptions}, {"type", MagickStatisticOptions} } },
{ "Perceptible", { {"epsilon", RealReference},
{"channel", MagickChannelOptions} } },
{ "Poly", { {"terms", ArrayReference},
{"channel", MagickChannelOptions} } },
{ "Grayscale", { {"method", MagickNoiseOptions} } },
{ "CannyEdge", { {"geometry", StringReference},
{"radius", RealReference}, {"sigma", RealReference},
{"lower-percent", RealReference}, {"upper-percent", RealReference} } },
{ "HoughLine", { {"geometry", StringReference},
{"width", IntegerReference}, {"height", IntegerReference},
{"threshold", IntegerReference} } },
{ "MeanShift", { {"geometry", StringReference},
{"width", IntegerReference}, {"height", IntegerReference},
{"distance", RealReference} } },
{ "Kuwahara", { {"geometry", StringReference}, {"radius", RealReference},
{"sigma", RealReference}, {"channel", MagickChannelOptions} } },
{ "ConnectedComponents", { {"connectivity", IntegerReference} } },
{ "CopyPixels", { {"image", ImageReference}, {"geometry", StringReference},
{"width", IntegerReference}, {"height", IntegerReference},
{"x", IntegerReference}, {"y", IntegerReference},
{"gravity", MagickGravityOptions}, {"offset", StringReference},
{"dx", IntegerReference}, {"dy", IntegerReference} } },
{ "Color", { {"color", StringReference} } },
{ "WaveletDenoise", { {"geometry", StringReference},
{"threshold", RealReference}, {"softness", RealReference},
{"channel", MagickChannelOptions} } },
{ "Colorspace", { {"colorspace", MagickColorspaceOptions} } },
{ "AutoThreshold", { {"method", MagickAutoThresholdOptions} } },
{ "RangeThreshold", { {"geometry", StringReference},
{"low-black", RealReference}, {"low-white", RealReference},
{"high-white", RealReference}, {"high-black", RealReference},
{"channel", MagickChannelOptions} } },
{ "CLAHE", { {"geometry", StringReference}, {"width", IntegerReference},
{"height", IntegerReference}, {"number-bins", IntegerReference},
{"clip-limit", RealReference} } },
{ "Kmeans", { {"geometry", StringReference}, {"colors", IntegerReference},
{"iterations", IntegerReference}, {"tolerance", RealReference} } },
{ "ColorThreshold", { {"start-color", StringReference},
{"stop-color", StringReference}, {"channel", MagickChannelOptions} } },
{ "WhiteBalance", { { (const char *) NULL, NullReference } } },
{ "BilateralBlur", { {"geometry", StringReference},
{"width", IntegerReference}, {"height", IntegerReference},
{"intensity-sigma", RealReference}, {"spatial-sigma", RealReference},
{"channel", MagickChannelOptions} } },
{ "SortPixels", { { (const char *) NULL, NullReference } } },
{ "Integral", { { (const char *) NULL, NullReference } } },
};
static SplayTreeInfo
*magick_registry = (SplayTreeInfo *) NULL;
/*
Forward declarations.
*/
static Image
*SetupList(pTHX_ SV *,struct PackageInfo **,SV ***,ExceptionInfo *);
static ssize_t
strEQcase(const char *,const char *);
/*
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
% %
% %
% C l o n e P a c k a g e I n f o %
% %
% %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% ClonePackageInfo makes a duplicate of the given info, or if info is NULL,
% a new one.
%
% The format of the ClonePackageInfo routine is:
%
% struct PackageInfo *ClonePackageInfo(struct PackageInfo *info,
% exception)
%
% A description of each parameter follows:
%
% o info: a structure of type info.
%
% o exception: Return any errors or warnings in this structure.
%
*/
static struct PackageInfo *ClonePackageInfo(struct PackageInfo *info,
ExceptionInfo *exception)
{
struct PackageInfo
*clone_info;
clone_info=(struct PackageInfo *) AcquireQuantumMemory(1,sizeof(*clone_info));
if (clone_info == (struct PackageInfo *) NULL)
{
ThrowPerlException(exception,ResourceLimitError,
"UnableToClonePackageInfo",PackageName);
if (LocaleCompare(attribute,"green-primary") == 0)
{
for ( ; image; image=image->next)
{
flags=ParseGeometry(SvPV(sval,na),&geometry_info);
image->chromaticity.green_primary.x=geometry_info.rho;
image->chromaticity.green_primary.y=geometry_info.sigma;
if ((flags & SigmaValue) == 0)
image->chromaticity.green_primary.y=
image->chromaticity.green_primary.x;
}
break;
}
if (info)
SetImageOption(info->image_info,attribute,SvPV(sval,na));
for ( ; image; image=image->next)
{
(void) SetImageProperty(image,attribute,SvPV(sval,na),exception);
(void) SetImageArtifact(image,attribute,SvPV(sval,na));
}
break;
}
case 'I':
case 'i':
{
if (LocaleNCompare(attribute,"index",5) == 0)
{
CacheView
*image_view;
int
items;
long
index;
Quantum
*q;
for ( ; image; image=image->next)
{
if (image->storage_class != PseudoClass)
continue;
x=0;
y=0;
items=sscanf(attribute,"%*[^[][%ld%*[,/]%ld",&x,&y);
(void) items;
image_view=AcquireAuthenticCacheView(image,exception);
q=GetCacheViewAuthenticPixels(image_view,x,y,1,1,exception);
if (q != (Quantum *) NULL)
{
items=sscanf(SvPV(sval,na),"%ld",&index);
if ((index >= 0) && (index < (ssize_t) image->colors))
SetPixelIndex(image,index,q);
(void) SyncCacheViewAuthenticPixels(image_view,exception);
}
image_view=DestroyCacheView(image_view);
}
break;
}
if (LocaleCompare(attribute,"iterations") == 0)
{
iterations:
for ( ; image; image=image->next)
image->iterations=(size_t) SvIV(sval);
break;
}
if (LocaleCompare(attribute,"interlace") == 0)
{
sp=SvPOK(sval) ? ParseCommandOption(MagickInterlaceOptions,
MagickFalse,SvPV(sval,na)) : SvIV(sval);
if (sp < 0)
{
ThrowPerlException(exception,OptionError,
"UnrecognizedInterlaceType",SvPV(sval,na));
break;
}
if (info)
info->image_info->interlace=(InterlaceType) sp;
for ( ; image; image=image->next)
image->interlace=(InterlaceType) sp;
break;
}
if (info)
SetImageOption(info->image_info,attribute,SvPV(sval,na));
for ( ; image; image=image->next)
{
(void) SetImageProperty(image,attribute,SvPV(sval,na),exception);
(void) SetImageArtifact(image,attribute,SvPV(sval,na));
}
break;
}
case 'L':
case 'l':
{
if (LocaleCompare(attribute,"label") == 0)
{
for ( ; image; image=image->next)
(void) SetImageProperty(image,"label",InterpretImageProperties(
info ? info->image_info : (ImageInfo *) NULL,image,
SvPV(sval,na),exception),exception);
break;
}
if (LocaleCompare(attribute,"loop") == 0)
goto iterations;
if (info)
SetImageOption(info->image_info,attribute,SvPV(sval,na));
for ( ; image; image=image->next)
{
(void) SetImageProperty(image,attribute,SvPV(sval,na),exception);
(void) SetImageArtifact(image,attribute,SvPV(sval,na));
}
break;
}
case 'M':
case 'm':
{
if (LocaleCompare(attribute,"magick") == 0)
{
if (info)
(void) FormatLocaleString(info->image_info->filename,
MagickPathExtent,"%s:",SvPV(sval,na));
for ( ; image; image=image->next)
(void) CopyMagickString(image->magick,SvPV(sval,na),
MagickPathExtent);
break;
}
if (LocaleCompare(attribute,"map-limit") == 0)
{
MagickSizeType
limit;
limit=MagickResourceInfinity;
if (LocaleCompare(SvPV(sval,na),"unlimited") != 0)
limit=(MagickSizeType) SiPrefixToDoubleInterval(SvPV(sval,na),
100.0);
(void) SetMagickResourceLimit(MapResource,limit);
break;
}
if (LocaleCompare(attribute,"mask") == 0)
{
Image
*mask;
mask=(Image *) NULL;
if (SvPOK(sval))
mask=SetupList(aTHX_ SvRV(sval),&info,(SV ***) NULL,exception);
for ( ; image; image=image->next)
SetImageMask(image,ReadPixelMask,mask,exception);
break;
}
if (LocaleCompare(attribute,"mattecolor") == 0)
{
(void) QueryColorCompliance(SvPV(sval,na),AllCompliance,&target_color,
exception);
if (info)
info->image_info->alpha_color=target_color;
for ( ; image; image=image->next)
image->alpha_color=target_color;
break;
}
if (LocaleCompare(attribute,"matte") == 0)
{
sp=SvPOK(sval) ? ParseCommandOption(MagickBooleanOptions,MagickFalse,
SvPV(sval,na)) : SvIV(sval);
exception);
(void) status;
s=newSViv(id++);
}
PUSHs(s ? sv_2mortal(s) : &sv_undef);
continue;
}
if (LocaleNCompare(attribute,"index",5) == 0)
{
CacheView
*image_view;
char
name[MagickPathExtent];
const Quantum
*p;
int
items;
long
x,
y;
if (image == (Image *) NULL)
break;
if (image->storage_class != PseudoClass)
break;
x=0;
y=0;
items=sscanf(attribute,"%*[^[][%ld%*[,/]%ld",&x,&y);
(void) items;
image_view=AcquireVirtualCacheView(image,exception);
p=GetCacheViewVirtualPixels(image_view,x,y,1,1,exception);
if (p != (const Quantum *) NULL)
{
(void) FormatLocaleString(name,MagickPathExtent,QuantumFormat,
GetPixelIndex(image,p));
s=newSVpv(name,0);
PUSHs(s ? sv_2mortal(s) : &sv_undef);
}
image_view=DestroyCacheView(image_view);
continue;
}
if (LocaleCompare(attribute,"iptc") == 0)
{
if (image != (Image *) NULL)
{
const StringInfo
*profile;
profile=GetImageProfile(image,"iptc");
if (profile != (const StringInfo *) NULL)
s=newSVpv((const char *) GetStringInfoDatum(profile),
GetStringInfoLength(profile));
}
PUSHs(s ? sv_2mortal(s) : &sv_undef);
continue;
}
if (LocaleCompare(attribute,"iterations") == 0) /* same as loop */
{
if (image != (Image *) NULL)
s=newSViv((ssize_t) image->iterations);
PUSHs(s ? sv_2mortal(s) : &sv_undef);
continue;
}
if (LocaleCompare(attribute,"interlace") == 0)
{
j=info ? info->image_info->interlace : image ? image->interlace :
UndefinedInterlace;
if (info)
if (info->image_info->interlace == UndefinedInterlace)
j=image->interlace;
s=newSViv(j);
(void) sv_setpv(s,CommandOptionToMnemonic(MagickInterlaceOptions,
j));
SvIOK_on(s);
PUSHs(s ? sv_2mortal(s) : &sv_undef);
continue;
}
ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
attribute);
break;
}
case 'L':
case 'l':
{
if (LocaleCompare(attribute,"label") == 0)
{
const char
*value;
if (image == (Image *) NULL)
break;
value=GetImageProperty(image,"Label",exception);
if (value != (const char *) NULL)
s=newSVpv(value,0);
PUSHs(s ? sv_2mortal(s) : &sv_undef);
continue;
}
if (LocaleCompare(attribute,"loop") == 0) /* same as iterations */
{
if (image != (Image *) NULL)
s=newSViv((ssize_t) image->iterations);
PUSHs(s ? sv_2mortal(s) : &sv_undef);
continue;
}
ThrowPerlException(exception,OptionError,"UnrecognizedAttribute",
attribute);
break;
}
case 'M':
case 'm':
{
if (LocaleCompare(attribute,"magick") == 0)
{
if (info && *info->image_info->magick)
s=newSVpv(info->image_info->magick,0);
if (image != (Image *) NULL)
s=newSVpv(image->magick,0);
PUSHs(s ? sv_2mortal(s) : &sv_undef);
continue;
}
if (LocaleCompare(attribute,"map") == 0)
{
s=newSViv((MagickOffsetType) GetMagickResource(MapResource));
PUSHs(s ? sv_2mortal(s) : &sv_undef);
continue;
}
if (LocaleCompare(attribute,"maximum-error") == 0)
{
if (image != (Image *) NULL)
s=newSVnv(image->error.normalized_maximum_error);
PUSHs(s ? sv_2mortal(s) : &sv_undef);
continue;
}
if (LocaleCompare(attribute,"memory") == 0)
{
s=newSViv((MagickOffsetType) GetMagickResource(MemoryResource));
PUSHs(s ? sv_2mortal(s) : &sv_undef);
continue;
}
if (LocaleCompare(attribute,"mean-error") == 0)
{
if (image != (Image *) NULL)
s=newSVnv(image->error.normalized_mean_error);
PUSHs(s ? sv_2mortal(s) : &sv_undef);
continue;
}
if (LocaleCompare(attribute,"mime") == 0)
{
if (info && *info->image_info->magick)
s=newSVpv(MagickToMime(info->image_info->magick),0);
if (image != (Image *) NULL)
s=newSVpv(MagickToMime(image->magick),0);
PUSHs(s ? sv_2mortal(s) : &sv_undef);
continue;
}
if (LocaleCompare(attribute,"mattecolor") == 0)
{
if (image == (Image *) NULL)
break;
(void) FormatLocaleString(color,MagickPathExtent,
"%.20g,%.20g,%.20g,%.20g",(double) image->alpha_color.red,
argument_list[1].string_reference,AllCompliance,&black_point,
exception);
if (attribute_flag[2] != 0)
(void) QueryColorCompliance(
argument_list[2].string_reference,AllCompliance,&white_point,
exception);
if (attribute_flag[3] != 0)
channel=(ChannelType) argument_list[3].integer_reference;
channel_mask=SetImageChannelMask(image,channel);
(void) LevelImageColors(image,&black_point,&white_point,
argument_list[0].integer_reference != 0 ? MagickTrue : MagickFalse,
exception);
(void) SetImageChannelMask(image,channel_mask);
break;
}
case 130: /* Clamp */
{
if (attribute_flag[0] != 0)
channel=(ChannelType) argument_list[0].integer_reference;
channel_mask=SetImageChannelMask(image,channel);
(void) ClampImage(image,exception);
(void) SetImageChannelMask(image,channel_mask);
break;
}
case 131: /* BrightnessContrast */
{
double
brightness,
contrast;
brightness=0.0;
contrast=0.0;
if (attribute_flag[0] != 0)
{
flags=ParseGeometry(argument_list[0].string_reference,
&geometry_info);
brightness=geometry_info.rho;
if ((flags & SigmaValue) == 0)
contrast=geometry_info.sigma;
}
if (attribute_flag[1] != 0)
brightness=argument_list[1].real_reference;
if (attribute_flag[2] != 0)
contrast=argument_list[2].real_reference;
if (attribute_flag[4] != 0)
channel=(ChannelType) argument_list[4].integer_reference;
channel_mask=SetImageChannelMask(image,channel);
(void) BrightnessContrastImage(image,brightness,contrast,exception);
(void) SetImageChannelMask(image,channel_mask);
break;
}
case 132: /* Morphology */
{
KernelInfo
*kernel;
MorphologyMethod
method;
ssize_t
iterations;
if (attribute_flag[0] == 0)
break;
kernel=AcquireKernelInfo(argument_list[0].string_reference,exception);
if (kernel == (KernelInfo *) NULL)
break;
if (attribute_flag[1] != 0)
channel=(ChannelType) argument_list[1].integer_reference;
method=UndefinedMorphology;
if (attribute_flag[2] != 0)
method=(MorphologyMethod) argument_list[2].integer_reference;
iterations=1;
if (attribute_flag[3] != 0)
iterations=argument_list[3].integer_reference;
channel_mask=SetImageChannelMask(image,channel);
image=MorphologyImage(image,method,iterations,kernel,exception);
if (image != (Image *) NULL)
(void) SetImageChannelMask(image,channel_mask);
kernel=DestroyKernelInfo(kernel);
break;
}
case 133: /* Mode */
{
if (attribute_flag[0] != 0)
{
flags=ParseGeometry(argument_list[0].string_reference,
&geometry_info);
if ((flags & SigmaValue) == 0)
geometry_info.sigma=1.0;
}
if (attribute_flag[1] != 0)
geometry_info.rho=argument_list[1].real_reference;
if (attribute_flag[2] != 0)
geometry_info.sigma=argument_list[2].real_reference;
if (attribute_flag[3] != 0)
channel=(ChannelType) argument_list[3].integer_reference;
channel_mask=SetImageChannelMask(image,channel);
image=StatisticImage(image,ModeStatistic,(size_t) geometry_info.rho,
(size_t) geometry_info.sigma,exception);
if (image != (Image *) NULL)
(void) SetImageChannelMask(image,channel_mask);
break;
}
case 134: /* Statistic */
{
StatisticType
statistic;
statistic=UndefinedStatistic;
if (attribute_flag[0] != 0)
{
flags=ParseGeometry(argument_list[0].string_reference,
&geometry_info);
if ((flags & SigmaValue) == 0)
geometry_info.sigma=1.0;
}
if (attribute_flag[1] != 0)
geometry_info.rho=argument_list[1].real_reference;
if (attribute_flag[2] != 0)
geometry_info.sigma=argument_list[2].real_reference;
if (attribute_flag[3] != 0)
channel=(ChannelType) argument_list[3].integer_reference;
if (attribute_flag[4] != 0)
statistic=(StatisticType) argument_list[4].integer_reference;
channel_mask=SetImageChannelMask(image,channel);
image=StatisticImage(image,statistic,(size_t) geometry_info.rho,
(size_t) geometry_info.sigma,exception);
if (image != (Image *) NULL)
(void) SetImageChannelMask(image,channel_mask);
break;
}
case 135: /* Perceptible */
{
double
epsilon;
( run in 1.047 second using v1.01-cache-2.11-cpan-71847e10f99 )