⚠️ 这是一个非官方翻译网站,与 ImageMagick Studio LLC 无关。准确信息请参阅原文(https://imagemagick.org/perl-magick/)

安装 • 概述 • 示例脚本 • 读取或写入图像 • 操作图像 • 设置图像属性 • 获取图像属性 • 将图像与其重构进行比较 • 创建图像蒙太奇 • 处理 Blob • 直接访问图像像素 • 其他方法 • 异常处理 • 常量

PerlMagick 是 ImageMagick 的面向对象 Perl 接口。使用该模块可以在 Perl 脚本中读取、操作或写入图像或图像序列。这使它非常适合 Web CGI 脚本。要正确构建 PerlMagick,系统上必须安装 ImageMagick 6.5.5 或以上版本以及 Perl 5.005_02 或更高版本。

有许多有用的脚本可以向您展示 PerlMagick 的价值。您可以使用 MagickStudio 进行基于 Web 的图像操作和转换,或使用 L-systems 通过数学构造创建植物图像,最后还可以使用 WebMagick Image Navigator 浏览缩略图集合并选择要查看的图像。

您可以在 Web 浏览器中通过 ImageMagick Studio 试用 PerlMagick。或者,您可以查看精选 PerlMagick 函数的 示例

安装

UNIX

PerlMagick 可以从您系统的 RPM 仓库中获取吗?例如,在我们的 CentOS 系统上,我们这样安装 PerlMagick:

yum install ImageMagick-perl

如果不能,您必须从 ImageMagick 源代码发行版安装 PerlMagick。下载最新的 源代码 发行版。

使用以下命令解包发行版:

tar xvzf ImageMagick.tar.gz

接下来配置并编译 ImageMagick:

cd ImageMagick-7.1.2-25
./configure -with-perl
make

如果 ImageMagick / PerlMagick 配置和编译都没有报错,您就可以将其安装到系统上了。安装需要管理员权限。要安装,请输入:

sudo make install

您可能需要配置动态链接器的运行时绑定:

sudo ldconfig /usr/local/lib

最后,要验证 PerlMagick 是否正确安装,请输入:

perl -MImage::Magick -le 'print Image::Magick->QuantumDepth'

恭喜,您已拥有可用的 ImageMagick 发行版,并准备好使用 PerlMagick 来 转换、合成或编辑 您的图像。

Windows XP / Windows 2000

系统上必须已经安装 ImageMagick。此外,还需要适用于 Windows 2000 的 ImageMagick 源代码发行版。您还必须拥有 Visual C++ 或 J++ 开发环境中的 nmake。将 \bin\IMagick.dll 和 \bin\X11.dll 复制到动态加载路径中的某个目录,例如 c:\perl\site\5.00502。

接下来,输入:

cd PerlMagick
perl Makefile.nt
nmake
nmake install

运行回归测试

要验证安装是否正确,请输入:

make test

在 Windows 下使用 nmake test。有几个演示脚本可以测试 PerlMagick 能够执行的许多功能。

要从构建文件夹运行测试,请使用 prove 工具:

prove --blib blib -I `pwd` -bv ./t/read.t



cd demo
make

现在您已准备好在 Perl 脚本中使用 PerlMagick 方法了。

概述

任何想要使用 PerlMagick 方法的脚本都必须首先在其命名空间内定义这些方法并实例化一个图像对象。可以这样做:

use Image::Magick;

$image = Image::Magick->new;

PerlMagick 能够感知量子(quantum)。实例化图像对象时,您可以请求特定的量子深度:

use Image::Magick::Q16;

$image = Image::Magick::Q16->new;

new() 方法采用与 SetAttribute 相同的参数。例如,

$image = Image::Magick->new(size=>'384x256');

接下来,您会想要读取一个图像或图像序列,对其进行操作,然后显示或写入它。PerlMagick 的输入和输出方法在“读取或写入图像”中定义。影响图像读取或写入方式的方法请参见“设置图像属性”。变换图像的方法列表请参见“操作图像”。“获取图像属性”说明如何检索图像的某个属性。在背景上将图像平铺为缩略图的细节请参见“创建图像蒙太奇”。最后,有些方法不能很好地归入上述任何类别。这些方法的列表请查看“其他方法”。

一旦您用完某个 PerlMagick 对象,就应该考虑销毁它。图像序列中的每个图像都存储在虚拟内存中。这可能累积到数兆字节(mebibyte)的内存。销毁 PerlMagick 对象后,内存将被释放供其他 Perl 方法使用。销毁对象的推荐方式是使用 undef:

undef $image;

要删除所有图像但保留 Image::Magick 对象,请使用

@$image = ();

最后,要从多图像序列中删除单个图像,请使用

undef $image->[$x];

下一节将说明如何使用各种 PerlMagick 方法来操作图像序列。

某些 PerlMagick 方法需要外部程序,例如 Ghostscript。这可能需要在您的 PATH 环境变量中指定明确的路径才能正常工作。例如(在 Linux 中),

$ENV{PATH}' . "='/../bin:/usr/bin:/usr/local/bin';

示例脚本

这是一个帮助您入门的示例脚本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/usr/local/bin/perl
use Image::Magick;

my($image, $x);

$image = Image::Magick->new;
$x = $image->Read('girl.png', 'logo.png', 'rose.png');
warn "$x" if "$x";

$x = $image->Crop(geometry=>'100x100+100+100');
warn "$x" if "$x";

$x = $image->Write('x.png');
warn "$x" if "$x";

该脚本读取三个图像,将它们裁剪,并写入单个图像作为 GIF 动画序列。在许多情况下,您可能想要访问序列中的单个图像。下一个示例说明如何做到这一点:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/local/bin/perl
use Image::Magick;

my($image, $p, $q);

$image = new Image::Magick;
$image->Read('x1.png');
$image->Read('j*.jpg');
$image->Read('k.miff[1, 5, 3]');
$image->Contrast();
for ($x = 0; $image->[$x]; $x++)
{
  $image->[$x]->Frame('100x200') if $image->[$x]->Get('magick') eq 'GIF';
  undef $image->[$x] if $image->[$x]->Get('columns') < 100;
}
$p = $image->[1];
$p->Draw(stroke=>'red', primitive=>'rectangle', points=>20,20 100,100');
$q = $p->Montage();
undef $image;
$q->Write('x.miff');

假设您想从一块 100 x 100 像素的白色画布开始,中心有一个红色像素。尝试

$image = Image::Magick->new;
$image->Set(size=>'100x100');
$image->ReadImage('canvas:white');
$image->Set('pixel[49,49]'=>'red');

这里我们将 (1,1) 处红色分量的强度减半:

@pixels = $image->GetPixel(x=>1,y=>1);
$pixels[0]*=0.5;
$image->SetPixel(x=>1,y=>1,color=>\@pixels);

或者假设您想将彩色图像转换为灰度:

$image->Quantize(colorspace=>'gray');

让我们用台北 TrueType 字体为图像添加注释:

$text = 'Works like magick!';
$image->Annotate(font=>'kai.ttf', pointsize=>40, fill=>'green', text=>$text);

也许您想从图像中提取所有像素强度并将它们写入 STDOUT:

@pixels = $image->GetPixels(map=>'I', height=>$height, width=>$width, normalize=>true);
binmode STDOUT;
print pack('B*',join('',@pixels));

使用 PerlMagick 对象还可以做的其他巧妙的事情包括

$i = $#$p"+1";   # return the number of images associated with object p
push(@$q, @$p);  # push the images from object p onto object q
@$p = ();        # delete the images but not the object p
$p->Convolve([1, 2, 1, 2, 4, 2, 1, 2, 1]);   # 3x3 Gaussian kernel

读取或写入图像

使用下列方法来读取、写入或显示图像或图像序列:

读取或写入方法 方法 参数 返回值 说明
Read one or more filenames the number of images read 读取图像或图像序列
Write filename the number of images written 写入图像或图像序列
Display server name the number of images displayed 将图像或图像序列显示到 X 服务器
Animate server name the number of images animated 将图像序列以动画形式显示到 X 服务器

为方便起见,Write()、Display() 和 Animate() 方法可以采用 SetAttribute 知道的任何参数。例如,

$image->Write(filename=>'image.png', compression=>'None');

将 - 用作 Read() 方法的文件名以从标准输入读取,或用作 Write() 方法的文件名以写入标准输出:

binmode STDOUT;
$image->Write('png:-');

要从 PERL 文件句柄读取 GIF 格式的图像,请使用:

$image = Image::Magick->new;
open(IMAGE, 'image.gif');
$image->Read(file=>\*IMAGE);
close(IMAGE);

要将 PNG 格式的图像写入 PERL 文件句柄,请使用:

$filename = "image.png";
open(IMAGE, ">$filename");
$image->Write(file=>\*IMAGE, filename=>$filename);
close(IMAGE);

请注意,如果 ImageMagick 与 ActiveState Perl 发行版之间的 C 运行时库版本不同,或者某个 DLL 是使用 /MT 选项链接的,那么在 Windows 上从 Perl 文件句柄读取或写入可能会失败。说明请参见 Potential Errors Passing CRT Objects Across DLL Boundaries

如果文件名中出现 %0Nd、%0No 或 %0Nx,它将被解释为 printf 格式说明,并且该说明会被替换为场景编号的指定十进制、八进制或十六进制编码。例如,

image%03d.miff

会转换文件 image000.miff、image001.miff 等等。

您可以选择性地为任何方法名添加 Image。例如,ReadImage() 是 Read() 方法的别名。

操作图像

一旦您(例如用 ReadImage() 方法)创建了图像,您可能想要对其进行操作。下面是 PerlMagick 提供给您的所有图像操作方法的列表。有精选 PerlMagick 方法的 示例。这是一个调用图像操作方法的示例:

$image->Crop(geometry=>'100x100+10+20');
$image->[$x]->Frame("100x200");

下面是您可以调用的其他图像操作方法的列表:

图像操作方法 方法 参数 说明
AdaptiveBlur geometry=>geometry , radius=>double , sigma=>double , bias=>double , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 使用给定半径和标准差(sigma)的高斯算子自适应地模糊图像。在边缘附近减弱效果。
AdaptiveResize geometry=>geometry , width=>integer , height=>integer , filter=>{Point, Box, Triangle, Hermite, Hanning, Hamming, Blackman, Gaussian, Quadratic, Cubic, Catrom, Mitchell, Lanczos, Bessel, Sinc}, support=>double , blur=>double 使用数据相关的三角剖分自适应地调整图像尺寸。模糊指定 blur > 1,锐利指定 < 1。
AdaptiveSharpen geometry=>geometry , radius=>double , sigma=>double , bias=>double , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 使用给定半径和标准差(sigma)的高斯算子自适应地锐化图像。在边缘附近增强效果。
AdaptiveThreshold geometry=>geometry , width=>integer , height=>integer , bias=>double 局部自适应阈值处理。
AddNoise noise=>{Uniform, Gaussian, Multiplicative, Impulse, Laplacian, Poisson}, attenuate=>double , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 向图像添加噪声
AffineTransform affine=>array of float values , translate=>float, float , scale=> float, float , rotate=>float , skewX=>float , skewY=>float , interpolate={Average, Bicubic, Bilinear, Filter, Integer, Mesh, NearestNeighbor}, background=>color name 对图像进行仿射变换
Affinity image=>image-handle , method=>{None, FloydSteinberg, Riemersma} 从该图像中选择一组特定的颜色
Annotate text=>string , font=>string , family=>string , style=>{Normal, Italic, Oblique, Any}, stretch=>{Normal, UltraCondensed, ExtraCondensed, Condensed, SemiCondensed, SemiExpanded, Expanded, ExtraExpanded, UltraExpanded}, weight=>integer , pointsize=>integer , density=>geometry , stroke=>color name , strokewidth=>integer , fill=>color name , undercolor=>color name , kerning=>float , geometry=>geometry , gravity=>{NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast}, antialias=>{true, false}, x=>integer , y=>integer , affine=>array of float values , translate=>float, float , scale=>float, float , rotate=>float. skewX=>float , skewY=> float , align=>{Left, Center, Right}, encoding=>{UTF-8}, interline-spacing=>double , interword-spacing=>double , direction=>{right-to-left, left-to-right}, decorate=>{none, underline, overline, line-through}, word-break=>{normal, break-word} 用文本为图像添加注释。要在不渲染任何文本的情况下获取字体度量,请参见 QueryFontMetrics。
AutoGamma channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 自动调整图像的伽马级别
AutoLevel channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 自动调整图像的色阶
AutoOrient 调整图像方向使其适合查看(即左上方向)
AutoThreshold method=>{Kapur, OTSU, Triangle} 自动执行图像阈值处理
BilateralSmoothing geometry=>geometry , width=>integer , height=>integer , intensity-sigma=>double , spatial-sigma=>double , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 一种非线性、保边且降噪的平滑滤波器。它用附近像素强度值的加权平均替换每个像素的强度。该权重基于高斯分布。权重不仅取决于像素的欧几里得距离,还取决于辐射差异(例如色彩强度、深度距离等的范围差异)。这能保留锐利边缘。intensity 和 spatial 的 sigma 的默认值分别为直径的 2 倍和 0.5 倍。
BlackThreshold threshold=>color , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 将所有低于阈值强度的像素强制变为黑色
BlueShift factor=>double , 模拟月光下的夜间场景。从 factor 1.5 开始。
Blur geometry=>geometry , radius=>double , sigma=>double , bias=>double , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 使用给定半径和标准差(sigma)的高斯算子减少图像噪声并降低细节级别。
Border geometry=>geometry , width=>integer , height=>integer , bordercolor=>color name , compose=>{Undefined, Add, Atop, Blend, Bumpmap, Clear, ColorBurn, ColorDodge, Colorize, CopyBlack, CopyBlue, CopyCMYK, Cyan, CopyGreen, Copy, CopyMagenta, CopyAlpha, CopyRed, RGB, CopyYellow, Darken, Dst, Difference, Displace, Dissolve, DstAtop, DstIn, DstOut, DstOver, Dst, Exclusion, HardLight, Hue, In, Lighten, Luminize, Minus, Modulate, Multiply, None, Out, Overlay, Over, Plus, ReplaceCompositeOp, Saturate, Screen, SoftLight, Src, SrcAtop, SrcIn, SrcOut, SrcOver, Src, Subtract, Threshold, Xor }, 用某种颜色的边框环绕图像
CannyEdge geometry=>geometry , radius=>double , sigma=>double , 'lower-percent'=>double , 'upper-percent'=>double 使用多级算法检测图像中大范围的边缘(例如 CannyEdge('0x1+10%+40%'))。
Charcoal geometry=>geometry , radius=>double , sigma=>double 模拟木炭画
Chop geometry=>geometry , width=>integer , height=>integer , x=>integer , y=>integer , gravity=>{NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast} 切除图像的一部分
CLAHE geometry=>geometry , width=>integer , height=>integer , number-bins=>integer , clip-limit=>double 对比度受限的自适应直方图均衡化。width、height 将图像划分为若干小块。number-bins 是每个小块的直方图箱数(最小 2,最大 256)。clip-limit 是局部对比度变化的对比度限制。clip-limit 取 2 到 3 是不错的起点。
Clamp channel=>{Red, RGB, All, etc.} 将值低于零的每个像素设为零,将值高于量子范围的像素设为量子范围(例如 65535),否则像素值保持不变。
Clip id=>name , inside=>{true, false} , 沿 8BIM 配置文件中的命名路径应用。
ClipMask mask=>image-handle 按图像蒙版定义的方式裁剪图像
Clut image=>image-handle , interpolate={Average, Bicubic, Bilinear, Filter, Integer, Mesh, NearestNeighbor}, channel=>{Red, RGB, All, etc.} 对图像序列应用颜色查找表
Color color=>color name 将整个图像设为该颜色。
ColorDecisionList filename=>string , 使用颜色决策列表进行色彩校正。
Colorize fill=>color name , blend=>string 用 fill 颜色为图像着色
ColorMatrix matrix=>array of float values 对图像应用色彩校正。虽然可以使用可变大小的矩阵,但通常对 RGBA 图像使用 5 x 5,对 CMYKA 使用 6x6。偏移量需要 6x6 矩阵(用归一化值填充最后一列)。
Colorspace colorspace=>{RGB, Gray, Transparent, OHTA, XYZ, YCbCr, YCC, YIQ, YPbPr, YUV, CMYK} 设置图像色彩空间
Comment string 为图像添加注释
ColorThreshold start-color=>color , stop-color=>color , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 将所有低于阈值强度的像素强制变为黑色
CompareLayers method=>{any, clear, overlay} 将序列中的每个图像与下一个图像进行比较,并返回它发现的任何像素差异的最小边界区域。图像不必大小相同,不过最好所有图像都经过 coalesce(所有图像大小相同,位于一块平坦的画布上,从而精确表示某个特定帧应有的样子)。
Composite image=>image-handle , compose=>{Undefined, Add, Atop, Blend, Bumpmap, Clear, ColorBurn, ColorDodge, Colorize, CopyBlack, CopyBlue, CopyCMYK, Cyan, CopyGreen, Copy, CopyMagenta, CopyAlpha, CopyRed, RGB, CopyYellow, Darken, Dst, Difference, Displace, Dissolve, DstAtop, DstIn, DstOut, DstOver, Dst, Exclusion, HardLight, Hue, In, Lighten, Luminize, Minus, Modulate, Multiply, None, Out, Overlay, Over, Plus, ReplaceCompositeOp, Saturate, Screen, SoftLight, Src, SrcAtop, SrcIn, SrcOut, SrcOver, Src, Subtract, Threshold, Xor }, mask=>image-handle , geometry=>geometry , x=>integer , y=>integer , gravity=>{NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast}, opacity=>integer , tile=>{True, False}, rotate=>double , color=>color name , blend=>geometry , interpolate=>{undefined, average, bicubic, bilinear, filter, integer, mesh, nearest-neighbor, spline}, clip-to-self=>{True, False} 将一个图像合成到另一个图像上。将 rotate 参数与 tile 参数配合使用。
ConnectedComponents connectivity=>integer , 对连通分量进行唯一标记,从 4 向或 8 向连通性中选择。
Contrast sharpen=>{True, False} 增强或降低图像对比度
ContrastStretch levels=>string , 'black-point'=>double , 'white-point'=>double , channel=>{Red, RGB, All, etc.} 通过“拉伸”强度值的范围来改善图像的对比度
Convolve coefficients=>array of float values , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}, bias=>double 对图像应用卷积核。给定核的 order,您需要提供 order*order 个浮点值(例如 3x3 意味着 9 个值)。
CopyPixels image=>image-handle , geometry=>geometry , width=>integer , height=>integer , x=>integer , y=>integer , offset=>geometry , gravity=>{NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast}, dx=>integer , dy=>integer 将由 widthxheight+x+y 定义的图像像素复制到偏移 +dx,+dy 处的图像。
Crop geometry=>geometry , width=>integer , height=>integer , x=>integer , y=>integer , fuzz=>double , gravity=>{NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast} 裁剪图像
CycleColormap amount=>integer 将图像颜色映射表位移 amount
Decipher passphrase=>string 将密文像素转换为明文像素
Deconstruct 将图像序列分解为各个组成部分
Deskew geometry=>string ,threshold=>double 将图像摆正
Despeckle 减少图像内的斑点
Difference image=>image-handle 计算两个图像之间的差异度量
Distort points=>array of float values , method=>{Affine, AffineProjection, ScaleRotateTranslate, SRT, Perspective, PerspectiveProjection, BilinearForward, BilinearReverse, Polynomial, Arc, Polar, DePolar, Barrel, BarrelInverse, Shepards, Resize}, 'virtual-pixel'=>{Background Black Constant Dither Edge Gray Mirror Random Tile Transparent White}, 'best-fit'=>{True, False} 扭曲图像
Draw primitive=>{point, line, rectangle, arc, ellipse, circle, path, polyline, polygon, bezier, color, matte, text, @filename}, points=>string , method=>{Point, Replace, Floodfill, FillToBorder, Reset} , stroke=>color name , fill=>color name , font=>string , pointsize=>integer , strokewidth=>float , antialias=>{true, false}, bordercolor=>color name , x=>float , y=>float , dash-offset=>float , dash-pattern=>array of float values , affine=>array of float values , translate=>float, float , scale=>float, float , rotate=>float , skewX=>float , skewY=>float , interpolate=>{undefined, average, bicubic, bilinear, mesh, nearest-neighbor, spline}, kerning=>float , text=>string , vector-graphics=>string , interline-spacing=>double , interword-spacing=>double , direction=>{right-to-left, left-to-right}, word-break=>{normal, break-word} 用一个或多个图形基元为图像添加注释。
Encipher passphrase=>string 将明文像素转换为密文像素
Edge radius=>double 使用给定半径的卷积滤波器增强图像内的边缘。
Emboss geometry=>geometry , radius=>double , sigma=>double 使用给定半径和标准差(sigma)的卷积滤波器对图像进行浮雕处理。
Enhance 应用数字滤波器以增强噪声较多的图像
Equalize channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 对图像执行直方图均衡化
Extent geometry=>geometry , width=>integer , height=>integer , x=>integer , y=>integer , fuzz=>double , background=>color name , gravity=>{NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast} 设置图像尺寸
Evaluate value=>double , operator=>{Add, And, Divide, LeftShift, Max, Min, Multiply, Or, Rightshift, RMS, Subtract, Xor} , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 对图像应用算术、关系或逻辑表达式
Filter kernel=>string , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}, bias=>double 对图像应用卷积核。
Flip 沿垂直方向反射图像扫描线
Flop 沿水平方向反射图像扫描线
FloodfillPaint geometry=>geometry , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}, x=>integer , y=>integer , fill=>color name , bordercolor=>color name , fuzz=>double , invert=>{True, False} 更改与目标像素颜色匹配且相邻的任何像素的颜色值。如果您指定了边框颜色,则任何不是该颜色的相邻像素的颜色值都会被更改。
ForwardFourierTransform magnitude=>{True, False} 实现正向离散傅里叶变换(DFT)
Frame geometry=>geometry , width=>integer , height=>integer , inner=>integer , outer=>integer , fill=>color name , compose=>{Undefined, Add, Atop, Blend, Bumpmap, Clear, ColorBurn, ColorDodge, Colorize, CopyBlack, CopyBlue, CopyCMYK, Cyan, CopyGreen, Copy, CopyMagenta, CopyAlpha, CopyRed, RGB, CopyYellow, Darken, Dst, Difference, Displace, Dissolve, DstAtop, DstIn, DstOut, DstOver, Dst, Exclusion, HardLight, Hue, In, Lighten, Luminize, Minus, Modulate, Multiply, None, Out, Overlay, Over, Plus, ReplaceCompositeOp, Saturate, Screen, SoftLight, Src, SrcAtop, SrcIn, SrcOut, SrcOver, Src, Subtract, Threshold, Xor }, 用装饰性边框环绕图像
Function parameters=>array of float values , function=>{Sin}, 'virtual-pixel'=>{Background Black Constant Dither Edge Gray Mirror Random Tile Transparent White} 对图像应用一个函数
Gamma gamma=>string , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 对图像进行伽马校正
GaussianBlur geometry=>geometry , radius=>double , sigma=>double , bias=>double , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 使用给定半径和标准差(sigma)的高斯算子减少图像噪声并降低细节级别。
GetPixel geometry=>geometry , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}, normalize=>{true, false}, x=>integer , y=>integer 获取单个像素。默认返回归一化的像素值。
GetPixels geometry=>geometry , width=>integer , height=>integer , x=>integer , y=>integer , map=>string , normalize=>{true, false} 获取由 map(例如 "RGB"、"RGBA" 等)定义的图像像素。默认返回非归一化的像素值。
Grayscale channel=>{Average, Brightness, Lightness, Rec601Luma, Rec601Luminance, Rec709Luma, Rec709Luminance, RMS} 将图像转换为灰度
HaldClut image=>image-handle , channel=>{Red, RGB, All, etc.} 对图像序列应用 Hald 颜色查找表
HoughLine geometry=>geometry , width=>double , height=>double , threshold=>double 识别图像中的线条(例如 HoughLine('9x9+195'))。
Identify file=>file , features=>distance , moments=>{True, False}, unique=>{True, False} 识别图像的属性
Implode amount=>double , interpolate=>{undefined, average, bicubic, bilinear, mesh, nearest-neighbor, spline} 使图像像素向中心收缩(implode)
Integral 计算图像中各值(像素值)的总和。
InverseDiscreteFourierTransform magnitude=>{True, False} 实现逆离散傅里叶变换(DFT)
Kmeans geometry=>geometry , 'colors'=>double , 'iterations'=>double , 'tolerance'=>double K 均值减色。
Kuwahara geometry=>geometry , radius=>double , sigma=>double , bias=>double , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 保边降噪滤波器
Label string 为图像分配标签
Layers method=>{coalesce, compare-any, compare-clear, compare-over, composite, dispose, flatten, merge, mosaic, optimize, optimize-image, optimize-plus, optimize-trans, remove-dups, remove-zero}, compose=>{Undefined, Add, Atop, Blend, Bumpmap, Clear, ColorBurn, ColorDodge, Colorize, CopyBlack, CopyBlue, CopyCMYK, Cyan, CopyGreen, Copy, CopyMagenta, CopyAlpha, CopyRed, RGB, CopyYellow, Darken, Dst, Difference, Displace, Dissolve, DstAtop, DstIn, DstOut, DstOver, Dst, Exclusion, HardLight, Hue, In, Lighten, LinearLight, Luminize, Minus, Modulate, Multiply, None, Out, Overlay, Over, Plus, ReplaceCompositeOp, Saturate, Screen, SoftLight, Src, SrcAtop, SrcIn, SrcOut, SrcOver, Src, Subtract, Threshold, Xor }, dither=>{true, false} 将每个图像与序列中前一个图像的 GIF dispose 形式进行比较。由此尝试选择最小的裁剪图像来替换每一帧,同时保留动画的结果。
Level levels=>string , 'black-point'=>double , 'gamma'=>double , 'white-point'=>double , channel=>{Red, RGB, All, etc.} 调整图像对比度的色阶
LevelColors invert=>>{True, False}, 'black-point'=>string , 'white-point'=>string , channel=>{Red, RGB, All, etc.} 用给定的颜色对图像进行色阶处理
LinearStretch levels=>string , 'black-point'=>double , 'white-point'=>double 带饱和度的线性拉伸
LiquidResize geometry=>geometry , width=>integer , height=>integer , delta-x=>double , rigidity=>double 用接缝裁剪(seam-carving)重新缩放图像。
Magnify 用像素艺术缩放将图像尺寸放大一倍
Mask mask=>image-handle 按蒙版定义的方式合成图像像素
MatteFloodfill geometry=>geometry , x=>integer , y=>integer , matte=>integer , bordercolor=>color name , fuzz=>double , invert=>{True, False} 更改与目标像素颜色匹配且相邻的任何像素的 matte 值。如果您指定了边框颜色,则任何不是该颜色的相邻像素的 matte 值都会被更改。
MeanShift geometry=>geometry , width=>double , height=>double , distance=>double 描绘图像中任意形状的聚类(例如 MeanShift('7x7+10%'))。
MedianFilter geometry=>geometry , width=>integer , height=>integer , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 用邻域的中值强度像素替换每个像素。
Minify 将图像尺寸缩小一半
Mode geometry=>geometry , width=>integer , height=>integer , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 使每个像素成为邻域的主导颜色。
Modulate factor=>geometry , brightness=>double , saturation=>double , hue=>double , lightness=>double , whiteness=>double , blackness=>double 按指定的百分比改变图像的亮度、饱和度和色相
Morphology kernel=>string , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}, iterations=>integer 对图像应用形态学方法。
MotionBlur geometry=>geometry , radius=>double , sigma=>double , angle=>double , bias=>double , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 为模拟运动效果,使用给定半径和标准差(sigma)的高斯算子以给定角度减少图像噪声并降低细节级别
Negate gray=>{True, False}, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 用每个像素的补色替换它(白变黑,黄变蓝,等等)
Normalize channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 变换图像使其跨越色值的完整范围
OilPaint radius=>integer 模拟油画
Opaque color=>color name , fill=>color name , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}, invert=>{True, False} 在图像内将此颜色更改为 fill 颜色
OrderedDither threshold=>{threshold, checks, o2x2, o3x3, o4x4, o8x8, h4x4a, h6x6a, h8x8a, h4x4o, h6x6o, h8x8o, h16x16o, hlines6x4}, channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 对图像进行有序抖动
Perceptible epsilon=>double , channel=>{Red, RGB, All, etc.} 将值小于
Polaroid caption=>string , angle=>double , pointsize=>double , font=>string , stroke=> color name , strokewidth=>integer , fill=>color name , gravity=>{NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast}, background=>color name 模拟一张宝丽来照片。
Posterize levels=>integer , dither=>{True, False} 将图像减少为有限数量的色阶
Profile name=>string , profile=>blob , rendering-intent=>{Undefined, Saturation, Perceptual, Absolute, Relative}, black-point-compensation=>{True, False} 添加或移除 ICC 或 IPTC 图像配置文件;name 是正式名称(例如 ICC)或文件名;将 profile 设为 '' 以移除配置文件
Quantize colors=>integer , colorspace=>{RGB, Gray, Transparent, OHTA, XYZ, YCbCr, YIQ, YPbPr, YUV, CMYK, sRGB, HSL, HSB}, treedepth=> integer , dither=>{True, False}, dither-method=>{Riemersma, Floyd-Steinberg}, measure_error=>{True, False}, global_colormap=>{True, False}, transparent-color=>color 图像中首选的颜色数量
Raise geometry=>geometry , width=>integer , height=>integer , x=>integer , y=>integer , raise=>{True, False} 提亮或加深图像边缘以创建 3D 效果
RangeThreshold geometry=>geometry , 'low-black'=>double , 'low-white'=>double , 'high-white'=>double , 'high-black'=>double 结合软阈值和硬阈值的图像阈值处理。
ReduceNoise geometry=>geometry , width=>integer , height=>integer , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 用噪声峰值消除滤波器减少图像中的噪声
Remap image=>image-handle , dither=>{true, false}, dither-method=>{Riemersma, Floyd-Steinberg} 用参考图像中最接近的颜色替换图像的颜色。
Resample density=>geometry , x=>double , y=>double , filter=>{Point, Box, Triangle, Hermite, Hanning, Hamming, Blackman, Gaussian, Quadratic, Cubic, Catrom, Mitchell, Lanczos, Bessel, Sinc}, support=>double 将图像重新采样到所需分辨率。模糊指定 blur > 1,锐利指定 < 1
Resize geometry=>geometry , width=>integer , height=>integer , filter=>{Point, Box, Triangle, Hermite, Hanning, Hamming, Blackman, Gaussian, Quadratic, Cubic, Catrom, Mitchell, Lanczos, Bessel, Sinc}, support=>double , blur=>double 将图像缩放到所需尺寸。模糊指定 blur > 1,锐利指定 < 1
Roll geometry=>geometry , x=>integer , y=>integer 垂直或水平滚动图像
Rotate degrees=>double , background=>color name 旋转图像
RotationalBlur geometry=>geometry , angle=>double , bias=>double , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 对图像进行径向模糊。
Sample geometry=>geometry , width=>integer , height=>integer 用像素采样缩放图像。
Scale geometry=>geometry , width=>integer , height=>integer 将图像缩放到所需尺寸
Segment colorspace=>{RGB, Gray, Transparent, OHTA, XYZ, YCbCr, YCC, YIQ, YPbPr, YUV, CMYK}, verbose={True, False}, cluster-threshold=>double , smoothing-threshold=double 通过分析颜色分量的直方图并识别均质单元来分割图像
SelectiveBlur geometry=>geometry , radius=>double , sigma=>double , threshold=>double , bias=>double , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 选择性地模糊对比度阈值内的像素。
Separate channel=>{Red, RGB, All, etc.} 将某个通道从图像中分离为一幅灰度图像
Shade geometry=>geometry , azimuth=>double , elevation=>double , gray=>{true, false} 使用远处的光源为图像添加阴影
SetPixel geometry=>geometry , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}, color=>array of float values , x=>integer , y=>integer , color=>array of float values 设置单个像素的值。期望归一化的像素值。
SetPixels geometry=>geometry , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}, color=>array of float values , width=>integer , height=>integer , x=>integer , y=>integer , color=>array of float values 设置一个或多个像素的值。期望归一化的像素值。
Shadow geometry=>geometry , opacity=>double , sigma=>double , x=>integer , y=>integer 模拟图像阴影
Sharpen geometry=>geometry , radius=>double , sigma=>double , bias=>double , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 使用给定半径和标准差(sigma)的高斯算子锐化图像。
Shave geometry=>geometry , width=>integer , height=>integer 从图像边缘削去像素
Shear geometry=>geometry , x=>double , y=>double fill=>color name 以正或负的剪切角沿 X 或 Y 轴剪切图像
SigmoidalContrast geometry=>string , 'contrast'=>double , 'mid-point'=>double channel=>{Red, RGB, All, etc.}, sharpen=>{True, False} S 形(sigmoidal)非线性对比度控制。使用 S 形传递函数增加图像对比度,而不会使高光或阴影饱和。contrast 表示对比度增加多少(0 表示无;3 是典型值;20 很大);mid-point 表示结果图像中中间调落在何处(0 是白色;50% 是中灰;100% 是黑色)。要降低对比度,将 sharpen 设为 False。
Signature 为图像像素流生成 SHA-256 消息摘要
Sketch geometry=>geometry , radius=>double , sigma=>double , angle=>double 使用给定半径和标准差(sigma)的高斯算子以给定角度将图像处理成素描风格
Solarize geometry=>string , threshold=>double , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 反转所有高于阈值级别的像素
SortPixels 在每条扫描线内按强度升序对像素进行排序。
SparseColor points=>array of float values , method=>{Barycentric, Bilinear, Shepards, Voronoi}, 'virtual-pixel'=>{Background Black Constant Dither Edge Gray Mirror Random Tile Transparent White} 在所提供的点周围插值图像颜色
Splice geometry=>geometry , width=>integer , height=>integer , x=>integer , y=>integer , fuzz=>double , background=>color name , gravity=>{NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast} 在图像中拼接插入
Spread radius=>double , interpolate=>{undefined, average, bicubic, bilinear, mesh, nearest-neighbor, spline} 将图像像素随机位移一定量
Statistic geometry=>geometry , width=>integer , height=>integer , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow}, type=>{Contrast, Median, Mode, Mean, Maximum, Minimum, ReduceNoise, RMS} 用邻域中对应的统计量替换每个像素。
Stegano image=>image-handle , offset=>integer 在图像内隐藏数字水印
Stereo image=>image-handle , x=>integer , y=>integer 合成两个图像并生成一幅由立体像对的左右图像合成的单一图像
Strip 从图像中剥除所有配置文件和注释。
Swirl degrees=>double , interpolate=>{undefined, average, bicubic, bilinear, mesh, nearest-neighbor, spline} 让图像像素围绕中心旋涡
Texture texture=>image-handle 平铺到图像背景上的纹理名称
Thumbnail geometry=>geometry , width=>integer , height=>integer 将图像尺寸更改为给定尺寸并移除任何关联的配置文件。
Threshold threshold=>string , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 对图像进行阈值处理
Tint fill=>color name , blend=>string 用 fill 颜色为图像染色。
Transparent color=>color name , invert=>{True, False} 在图像内使此颜色透明
Transpose 沿垂直方向翻转图像并旋转 90 度
Transverse 沿水平方向翻转图像并旋转 270 度
Trim 从图像中移除属于背景色的边缘
UnsharpMask geometry=>geometry , radius=>double , sigma=>double , gain=>double , threshold=>double 用非锐化掩蔽(unsharp mask)算法锐化图像。
Vignette geometry=>geometry , radius=>double , sigma=>double , x=>integer , y=>integer , background=>color name 以晕影(vignette)样式偏移图像边缘
Wave geometry=>geometry , amplitude=>double , wavelength=>double , interpolate=>{undefined, average, bicubic, bilinear, mesh, nearest-neighbor, spline} 沿正弦波改变图像
WaveDenoise geometry=>geometry , threshold=>double , threshold=>double 使用小波变换从图像中去除噪声
WhiteBalance 根据 LAB 色彩空间中的灰世界假设对图像应用白平衡。
WhiteThreshold threshold=>string , , channel=>{All, Default, Alpha, Black, Blue, CMYK, Cyan, Gray, Green, Index, Magenta, Alpha, Red, RGB, Yellow} 将所有高于阈值强度的像素强制变为白色

请注意,geometry 参数是 width 和 height 参数的简写(例如 geometry=>'106x80' 等价于 width=>106, height=>80)。

您可以在 Annotate() 和 Draw() 中都指定 @filename。这会从磁盘上的文件读取文本或图形基元指令。例如,

image->Draw(fill=>'red', primitive=>'rectangle',
 points=>'20,20 100,100  40,40 200,200  60,60 300,300');

等价于

$image->Draw(fill=>'red', primitive=>'@draw.txt');

其中 draw.txt 是磁盘上的一个文件,内容如下:

rectangle 20, 20 100, 100
rectangle 40, 40 200, 200
rectangle 60, 60 300, 300

Annotate()、Comment()、Draw() 和 Label() 方法的 text 参数可以通过嵌入以下特殊格式字符来包含图像文件名、类型、宽度、高度或其他图像属性:

%b   文件大小
%c   注释
%d   目录
%e   文件名扩展名
%f   文件名
%g   页面几何
%h   高度
%i   输入文件名
%k   唯一颜色数
%l   标签
%m   magick
%n   场景数
%o   输出文件名
%p   页码
%q   量子深度
%r   图像类与色彩空间
%s   场景编号
%t   去除目录与扩展名的文件名
%u   唯一临时文件名
%w   宽度
%x   x 分辨率
%y   y 分辨率
%z   图像深度
%C   图像压缩类型
%D   图像 dispose 方法
%H   页面高度
%Q   图像压缩质量
%T   图像延迟
%W   页面宽度
%X   页面 x 偏移
%Y   页面 y 偏移
%@   边界框
%#   签名
%%   百分号
\n   换行
\r   回车

例如,

text=>"%m:%f %wx%h"

对于标题为 bird.miff、宽度为 512、高度为 480 的图像,会生成注释 MIFF:bird.miff 512x480

您可以选择性地为任何方法名添加 Image。例如,TrimImage() 是 Trim() 方法的别名。

上面列出的大多数属性在 magick 中都有对应项。这些属性的更详细说明请参见相关文档。

设置图像属性

使用 Set() 方法设置图像属性。例如,

$image->Set(dither=>'True');
$image->[$x]->Set(delay=>3);

本示例使用 'True',而本文档写作 '{True, False}' 的地方,您可以使用不区分大小写的字符串 'True'、'False',也可以使用整数 1 和 0。

当您对布尔属性调用 Get() 时,Image::Magick 返回 1 或 0,而不是字符串。

下面是您可以设置的所有图像属性的列表:

图像属性 属性 说明
adjoin {True, False} 将多个图像合并为单个多图像文件
alpha {On, Off, Opaque, Transparent, Copy, Extract, Set} 控制 alpha/matte 通道以及涉及它的特殊操作
antialias {True, False} 去除像素锯齿
area-limit integer 设置像素面积资源限制。
attenuate double 在向图像添加噪声时减弱(或增强)。
authenticate string 用此密码解密图像。
background color name 图像背景色
blue-primary x-value , y-value 色度蓝原色点(例如 0.15, 0.06)
bordercolor color name 设置图像边框色
clip-mask image 为图像关联一个裁剪蒙版。
colormap[i] color name 位置 i 处的颜色名(例如 red)或十六进制值(例如 #ccc)
comment string 设置图像注释
compression {None, BZip, Fax, Group4, JPEG, JPEG2000, LosslessJPEG, LZW, RLE, Zip} 图像压缩类型
debug {All, Annotate, Blob, Cache, Coder, Configure, Deprecate, Draw, Exception, Locale, None, Resource, Transform, X11} 显示大量调试信息
delay integer 必须经过这么多个 1/100 秒后才显示序列中的下一个图像
density geometry 图像的垂直和水平分辨率(以像素为单位)
depth integer 图像深度
direction {Undefined, right-to-left, left-to-right 从右到左或从左到右渲染文本
disk-limit integer 设置磁盘资源限制
dispose {Undefined, None, Background, Previous} 图层处置(disposal)方法
dither {True, False} 对图像应用误差扩散
display string 指定要连接的 X 服务器
extract geometry 从图像中提取区域
file filehandle 设置图像文件句柄
filename string 设置图像文件名
fill color fill 颜色填充绘制图形轮廓内部的任何区域。
font string 用文本为图像添加注释时使用此字体
fuzz integer 此距离内的颜色被视为相等
gamma double 图像的伽马级别
Gravity {Forget, NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast} 图像 gravity 的类型
green-primary x-value , y-value 色度绿原色点(例如 0.3, 0.6)
index[x , y] string 位置 (x , y) 处的颜色映射索引
interlace {None, Line, Plane, Partition, JPEG, GIF, PNG} 隔行扫描方案的类型
iterations integer 为您的 GIF 动画添加 Netscape 循环扩展
label string 设置图像标签
loop integer 为您的 GIF 动画添加 Netscape 循环扩展
magick string 设置图像格式
map-limit integer 设置 map 资源限制
mask image 为图像关联一个蒙版。
matte {True, False} 启用图像 matte 通道
mattecolor color name 设置图像 matte 色
memory-limit integer 设置内存资源限制
monochrome {True, False} 将图像变换为黑白
option string 为某种图像格式关联一个选项(例如 option=>'ps:imagemask')
orientation {TopLeft, TopRight, BottomRight, BottomLeft, LeftTop, RightTop, RightBottom, LeftBottom} 图像方向
page { Letter, Tabloid, Ledger, Legal, Statement, Executive, A3, A4, A5, B4, B5, Folio, Quarto, 10x14} or geometry 图像画布的首选尺寸和位置
pixel[x , y] string 位置 (x , y) 处的十六进制值(例如 #ccc)
pointsize integer Postscript 或 TrueType 字体的点大小
precision integer 设置要打印的最大有效位数
quality integer JPEG/MIFF/PNG 压缩级别
red-primary x-value , y-value 色度红原色点(例如 0.64, 0.33)
sampling-factor geometry 水平和垂直采样系数
scene integer 图像场景编号
server string 指定要连接的 X 服务器
size string 原始(raw)图像的宽度和高度
stroke color stroke 颜色沿图形的轮廓绘制。
texture string 平铺到图像背景上的纹理名称
tile-offset geometry 图像平铺偏移
time-limit integer 设置时间资源限制(以秒为单位)
title string 设置图像标题
type {Bilevel, Grayscale, GrayscaleMatte, Palette, PaletteMatte, TrueColor, TrueColorMatte, ColorSeparation, ColorSeparationMatte} 图像类型
units { Undefined, PixelsPerInch, PixelsPerCentimeter} 图像分辨率的单位
verbose {True, False} 打印图像的详细信息
virtual-pixel {Background Black Constant Dither Edge Gray Mirror Random Tile Transparent White} 虚拟像素方法
white-point x-value , y-value 色度白点(例如 0.3127, 0.329)

请注意,geometry 参数是 width 和 height 参数的简写(例如 geometry=>'106x80' 等价于 width=>106, height=>80)。

SetAttribute() 是 Set() 方法的别名。

上面列出的大多数属性在 magick 中都有对应项。这些属性的更详细说明请参见相关文档。

获取图像属性

使用 Get() 方法获取图像属性。例如,

($a, $b, $c) = $image->Get('colorspace', 'magick', 'adjoin');
$width = $image->[3]->Get('columns');

除了“设置图像属性”中列出的所有属性外,您还可以获取以下额外属性:

图像属性 属性 说明
area integer 当前消耗的面积资源
base-columns integer 基础图像宽度(变换之前)
base-filename string 基础图像文件名(变换之前)
base-rows integer 基础图像高度(变换之前)
class {Direct, Pseudo} 图像类
colors integer 图像中唯一颜色的数量
columns integer 图像宽度
copyright string 获取 PerlMagick 的版权信息
directory string 图像蒙太奇内的平铺名称
elapsed-time double 自图像创建以来经过的时间(秒)
error double 用 Compare() 或 Quantize() 方法计算的每像素平均误差
bounding-box string 图像边界框
disk integer 当前消耗的磁盘资源
filesize integer 磁盘上图像的字节数
format string 获取描述性的图像格式
geometry string 图像几何
height integer 图像的行数或高度
icc string ICC 配置文件
icc string ICM 配置文件
id integer ImageMagick 注册表 ID
IPTC string IPTC 配置文件
mean-error double 用 Compare() 或 Quantize() 方法计算的每像素归一化平均误差
map integer 当前消耗的内存映射资源
matte {True, False} 图像是否具有 matte 通道
maximum-error double 用 Compare() 或 Quantize() 方法计算的每像素归一化最大误差
memory integer 当前消耗的内存资源
mime string 图像格式的 MIME
montage geometry 图像蒙太奇内的平铺尺寸和偏移
page.x integer 图像虚拟画布的 x 偏移
page.y integer 图像虚拟画布的 y 偏移
rows integer 图像的行数或高度
signature string 与图像像素流关联的 SHA-256 消息摘要
taint {True, False} 如果图像已被修改则为 True
total-ink-density double 返回 CMYK 图像的总油墨密度
transparent-color color name 设置图像透明色
user-time double 自图像创建以来的用户时间(秒)
version string 获取 PerlMagick 的版本
width integer 图像的列数或宽度
XMP string XMP 配置文件
x-resolution integer 图像的 x 分辨率
y-resolution integer 图像的 y 分辨率

GetAttribute() 是 Get() 方法的别名。

上面列出的大多数属性在 magick 中都有对应项。这些属性的更详细说明请参见相关文档。

将图像与其重构进行比较

使用 Compare() 方法以数学和视觉方式注释图像与其重构之间的差异。该方法支持以下参数:

比较参数 参数 说明
channel double 选择图像通道,默认是除 alpha 之外的所有通道。
fuzz double 此距离内的颜色被视为相等
image image-reference 重构图像
metric AE, MAE, MEPP, MSE, PAE, PSNR, RMSE 用此度量衡量图像之间的差异

在此示例中,我们将 ImageMagick 徽标与一个锐化后的重构进行比较:

use Image::Magick;

$logo=Image::Magick->New();
$logo->Read('logo:');
$sharp=Image::Magick->New();
$sharp->Read('logo:');
$sharp->Sharpen('0x1');
$difference=$logo->Compare(image=>$sharp, metric=>'rmse');
print $difference->Get('error'), "\n";
$difference->Display();

除了报告的约 0.024 的均方根误差外,还会显示一幅差异图像,以便您直观地辨别图像之间的差异。

创建图像蒙太奇

使用 Montage() 方法通过组合若干个独立图像来创建一幅合成图像。这些图像在合成图像上平铺排列,图像名称可选地显示在各个小块的正下方。例如,

$image->Montage(geometry=>'160x160', tile=>'2x2', texture=>'granite:');

下面是您可以设置的 Montage() 参数列表:

蒙太奇参数 参数 说明
background color name 背景色名称
border integer 图像边框宽度
filename string 蒙太奇图像的名称
fill color name 注释的填充色
font string X11 字体名称
frame geometry 用装饰性边框环绕图像
geometry geometry 合成图像中每个小块的首选小块和边框尺寸(例如 120x120+4+3>)
gravity NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast 图像在小块内引向的方向
label string 为图像分配标签
mode Frame, Unframe, Concatenate 缩略图的框架选项
pointsize integer Postscript 或 TrueType 字体的点大小
shadow {True, False} 在小块下方添加阴影以模拟深度
stroke color name 注释的描边色
texture string 平铺到图像背景上的纹理名称
tile geometry 每行和每页的小块数量(例如 6x4)
title string 为图像蒙太奇分配标题
transparent string 在图像内使此颜色透明

请注意,geometry 参数是 width 和 height 参数的简写(例如 geometry=>'106x80' 等价于 width=>106, height=>80)。

MontageImage() 是 Montage() 方法的别名。

上面列出的大多数属性在 montage 中都有对应项。这些属性的更详细说明请参见相关文档。

处理 Blob

blob 包含直接在内存中(而非磁盘上)表示某种特定图像格式的数据。PerlMagick 支持任何这些图像 格式 的 blob,并提供将 blob 转换为某种特定图像格式或从中转换的方法。

Blob 方法 方法 参数 返回值 说明
ImageToBlob any image attribute an array of image data in the respective image format 将图像或图像序列转换为 blob 数组
BlobToImage one or more blobs the number of blobs converted to an image 将一个或多个 blob 转换为图像

ImageToBlob() 以各自的格式返回图像数据。然后您可以打印它、将它保存到 ODBC 数据库、写入文件,或管道传输到显示程序:

@blobs = $image->ImageToBlob();
open(DISPLAY,"| display -") || die;
binmode DISPLAY;
print DISPLAY $blobs[0];
close DISPLAY;

BlobToImage() 方法返回从所提供的 blob 转换而来的图像或图像序列:

@blob=$db->GetImage();
$image=Image::Magick->new(magick=>'jpg');
$image->BlobToImage(@blob);

直接访问图像像素

使用以下方法来直接访问图像像素:

直接访问图像像素 方法 参数 说明
GetAuthenticPixels geometry=>geometry , width=>integer , height=>integer , x=>integer , y=>integer 以 C 指针形式返回真实(authentic)像素
GetVirtualPixels geometry=>geometry , width=>integer , height=>integer , x=>integer , y=>integer 以 const C 指针形式返回虚拟像素
GetAuthenticIndexQueue 以 C 指针形式返回颜色映射索引或黑色像素
GetVirtualIndexQueue 以 const C 指针形式返回颜色映射索引或黑色像素
SyncAuthenticPixels 将真实像素同步到像素缓存

其他方法

Append() 方法连接一组图像。例如,

$p = $image->Append(stack=>{true,false});

连接与对象 $image 关联的所有图像。默认情况下,图像从左到右堆叠。将 stack 设为 True 可使它们从上到下堆叠。

Clone() 方法复制一组图像。例如,

$q = $p->Clone();

将对象 $p 的所有图像复制到 $q。您可以将此方法用于单图像或多图像序列。

Coalesce() 在尊重任何页面偏移和处置方法的同时合成一组图像。GIF、MIFF 和 MNG 动画序列通常以一个图像背景开始,后续每个图像在尺寸和偏移上有所不同。返回一个新的图像序列,其中所有图像都与第一个图像的虚拟画布大小相同,并与序列中的下一个图像合成。例如,

$q = $p->Coalesce();

ComplexImages() 方法对图像序列执行复数运算。例如,

$p = $image->ComplexImages('conjugate');

EvaluateImages() 方法对一组图像应用算术、逻辑或关系表达式。例如,

$p = $image->EvaluateImages('mean');

对与对象 $image 关联的所有图像求平均。

Features() 方法返回图像中每个通道在四个方向(水平、垂直、左右对角线)上、针对指定距离的特征。这些特征包括角二阶矩、对比度、相关性、平方和:方差、逆差矩、和均值、和方差、和熵、熵、差方差、差熵、相关性信息度量 1、相关性信息度量 2 以及最大相关系数。值按 RGB、CMYK、RGBA 或 CMYKA 顺序排列(取决于图像类型)。

@features = $image->Features(1);

Flatten() 方法将一组图像平坦化并返回。例如,

$p = $images->Flatten(background=>'none');
$p->Write('flatten.png');

该图像序列被一个单一图像替换,这个图像由将第一个图像之后的每个图像叠加到第一个图像上而创建。

Fx() 方法对一组图像应用数学表达式并返回结果。例如,

$p = $image->Fx(expression=>'(g+b)/2.0',channel=>'red');
$p->Write('fx.miff');

用绿色和蓝色通道的平均值替换红色通道。

有关此方法的详细讨论,请参见 FX,特殊效果图像运算符

Histogram() 返回图像中的唯一颜色以及每种颜色的计数。返回的值是红、绿、蓝、不透明度和计数值的数组。

Morph() 方法对一组图像进行变形(morph)。图像的像素和尺寸都被线性插值,从而呈现出从一个图像到下一个图像渐变(meta-morphosis)的外观:

$p = $image->Morph(frames=>_integer_);

其中 frames 是要生成的中间图像数量。默认值为 1。

Mosaic() 从图像序列创建马赛克。

Mogrify() 方法是图像操作方法(操作图像)的单一入口点。参数是方法名称,后跟该方法可能需要的任何参数。例如,下面这些调用是等价的:

$image->Crop('340x256+0+0');
$image->Mogrify('crop', '340x256+0+0');

MogrifyRegion() 方法对图像的某个区域应用变换。它类似于 Mogrify(),但以区域几何开头。例如,假设您想提亮图像中位于位置 (40, 50) 的 100x100 区域:

$image->MogrifyRegion('100x100+40+50', 'modulate', brightness=>50);

PerceptualHash() 将视觉上相同的图像映射到相同或相似的哈希值——在图像检索、认证、索引或副本检测以及数字水印中很有用。对于每个通道以及 sRGB 和 HCLp 色彩空间,返回 7 个哈希值。例如,对于一幅 sRGB 图像,预计有 42 个感知哈希值。

@phash = $image->PerceptualHash();

Ping() 是一个便捷方法,无需将图像读入内存即可返回有关图像的信息。它返回图像的宽度、高度、以字节为单位的文件大小以及文件格式。您可以指定多个文件名,但只能指定一个文件句柄:

($width, $height, $size, $format) = $image->Ping('logo.png');
($width, $height, $size, $format) = $image->Ping(file=>\*IMAGE);
($width, $height, $size, $format) = $image->Ping(blob=>$blob);

这是一种更高效、内存消耗更少的方式来查询图像是否存在及其特征是什么。

Poly() 从图像序列和相应的项(系数与次数对)构建一个多项式:

$p = $image->Poly([0.5,1.0,0.25,2.0,1.0,1.0]);

PreviewImage() 平铺指定图像的 9 个缩略图,每个缩略图以不同强度应用某种图像处理操作。这有助于为某个特定的图像处理操作确定合适的参数。从以下操作中选择:Rotate, Shear, Roll, Hue, Saturation, Brightness, Gamma, Spiff, Dull, Grayscale, Quantize, Despeckle, ReduceNoise, AddNoise, Sharpen, Blur, Threshold, EdgeDetect, Spread, Solarize, Shade, Raise, Segment, Swirl, Implode, Wave, OilPaint, CharcoalDrawing, JPEG。这是一个示例:

$preview = $image->Preview('Gamma');
$preview->Display();

要完全控制文本定位,您需要字体度量信息。请使用

($x_ppem, $y_ppem, $ascender, $descender, $width, $height, $max_advance) =
  $image->QueryFontMetrics(_parameters_);

其中 parameters 是 Annotate 方法的任意参数。返回的值如下:

  1. 字符宽度
  2. 字符高度
  3. 上伸部(ascender)
  4. 下伸部(descender)
  5. 文本宽度
  6. 文本高度
  7. 最大水平步进(advance)
  8. 边界:x1
  9. 边界:y1
  10. 边界:x2
  11. 边界:y2
  12. 原点:x
  13. 原点:y

使用 QueryMultilineFontMetrics() 获取多行文本的最大文本宽度和高度。

不带参数调用 QueryColor() 以返回已知颜色名称的列表,或指定一个或多个颜色名称以获取这些属性:红、绿、蓝以及不透明度值。

@colors = $image->QueryColor();
($red, $green, $blue) = $image->QueryColor('cyan');
($red, $green, $blue, $alpha) = $image->QueryColor('#716baeff');

QueryColorname() 接受一个颜色值并返回其相应的名称或十六进制值;

$name = $image->QueryColorname('rgba(80,60,0,0)');

不带参数调用 QueryFont() 以返回已知字体的列表,或指定一个或多个字体名称以获取这些属性:字体名称、描述、字族、样式、拉伸、字重、编码、字铸厂(foundry)、格式、度量以及字形值。

@fonts = $image->QueryFont();
$weight = ($image->QueryFont('Helvetica'))[5];

不带参数调用 QueryFormat() 以返回已知图像格式的列表,或指定一个或多个格式名称以获取这些属性:adjoin、blob 支持、raw、解码器、编码器、描述以及模块。

@formats = $image->QueryFormat();
($adjoin, $blob_support, $raw, $decoder, $encoder, $description, $module) =
  $image->QueryFormat('gif');

用图像格式名称调用 MagickToMime() 以获取其 MIME 类型,例如从 tif 得到 image/tiff。

$mime = $image->MagickToMime('tif');

使用 RemoteCommand() 向一个已经运行的 displayanimate 应用程序发送命令。唯一的参数是要显示或动画播放的图像文件的名称。

$image->RemoteCommand('image.jpg');

Smush() 方法将一组图像紧贴着拼合在一起。例如,

$p = $image->Smush(stack=>{true,false},offset=>integer);

将与对象 $image 关联的所有图像紧贴着拼合。默认情况下,图像从左到右紧贴拼合。将 stack 设为 True 可使它们从上到下紧贴拼合。

Statistics() 返回图像中每个通道的图像统计信息。返回的值是深度、最小值、最大值、平均值、标准差、峰度、偏度和熵值的数组,按 RGB、CMYK、RGBA 或 CMYKA 顺序排列(取决于图像类型)。

@statistics = $image->Statistics();

最后,Transform() 方法接受一个完全限定的几何说明,用于裁剪或调整一个或多个图像的尺寸。例如,

$p = $image->Transform(crop=>'100x100+0+0');

您可以选择性地为上面任何方法名添加 Image。例如,PingImage() 是 Ping() 方法的别名。

异常处理

所有 PerlMagick 方法在成功时返回一个未定义的字符串上下文。如果发生任何问题,错误会作为一个嵌入数值状态码的字符串返回。小于 400 的状态码是警告。这意味着操作未能完成,但在某种程度上是可恢复的。大于或等于 400 的数值码是错误,表示操作完全失败。下面是不同方法返回异常的方式:

返回数字的方法(例如 Read()、Write()):

$x = $image->Read(...);
warn "$x" if "$x";      # print the error message
$x =~ /(\d+)/;
print $1;               # print the error number
print 0+$x;             # print the number of images read

对图像进行操作的方法(例如 Resize()、Crop()):

$x = $image->Crop(...);
warn "$x" if "$x";      # print the error message
$x =~ /(\d+)/;
print $1;               # print the error number

返回图像的方法(EvaluateSequence()、Montage()、Clone())应这样检查错误:

$x = $image->Montage(...);
warn "$x" if !ref($x);  # print the error message
$x =~ /(\d+)/;
print $1;               # print the error number

这是一个错误消息示例:

Error 400: Memory allocation failed

请查看 错误和警告代码 的完整列表。

下面说明如何使用数值状态码:

$x = $image->Read('rose.png');
$x =~ /(\d+)/;
die "unable to continue" if ($1 == ResourceLimitError);

常量

PerlMagick 包含以下常量:

BlobError
BlobWarning
CacheError
CacheWarning
CoderError
CoderWarning
ConfigureError
ConfigureWarning
CorruptImageError
CorruptImageWarning
DelegateError
DelegateWarning
DrawError
DrawWarning
ErrorException
FatalErrorException
FileOpenError
FileOpenWarning
ImageError
ImageWarning
MissingDelegateError
MissingDelegateWarning
ModuleError
ModuleWarning
Opaque
OptionError
OptionWarning
QuantumDepth
QuantumRange
RegistryError
RegistryWarning
ResourceLimitError
ResourceLimitWarning
StreamError
StreamWarning
Success
Transparent
TypeError
TypeWarning
WarningException
XServerError
XServerWarning

您可以这样访问它们:

Image::Magick->QuantumDepth