安装 • 概述 • 示例脚本 • 读取或写入图像 • 操作图像 • 设置图像属性 • 获取图像属性 • 将图像与其重构进行比较 • 创建图像蒙太奇 • 处理 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 | |
该脚本读取三个图像,将它们裁剪,并写入单个图像作为 GIF 动画序列。在许多情况下,您可能想要访问序列中的单个图像。下一个示例说明如何做到这一点:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
假设您想从一块 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 方法的任意参数。返回的值如下:
- 字符宽度
- 字符高度
- 上伸部(ascender)
- 下伸部(descender)
- 文本宽度
- 文本高度
- 最大水平步进(advance)
- 边界:x1
- 边界:y1
- 边界:x2
- 边界:y2
- 原点:x
- 原点: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() 向一个已经运行的 display 或 animate 应用程序发送命令。唯一的参数是要显示或动画播放的图像文件的名称。
$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