ImageMagick 版本 7 • 高动态范围成像 • 像素通道 • Alpha • 灰度 • 蒙版 • MagickCore API • 头文件 • 已移除的弃用特性 • 命令行界面 • 性能改进 • 版本 7 变更摘要
ImageMagick 的设计是一个演进的过程,设计与实现的努力相互影响并指引彼此进一步发展。在 ImageMagick 版本 7 中,我们基于版本 6 实现中汲取的经验教训改进了设计。ImageMagick 最初是为了将 RGB 图像显示到 X Windows 服务器而设计的。随着时间推移,我们将支持扩展到 RGBA 图像,进而扩展到 CMYK 与 CMYKA 图像格式。在 ImageMagick 版本 7 中,我们将支持扩展到拥有任意数量像素通道的任意色彩空间。此外,ImageMagick 7 以浮点数存储像素通道,允许带外的值(例如负值)并减少舍入误差。正如本文所述,还有众多其他设计上的增强。
为了在 MagickCore API 中支持可变像素通道,获取或设置像素通道时的像素处理方式发生了变化。你可以将通道作为数组 pixel[i] 来访问,或使用诸如 GetPixelRed() 或 SetPixelRed() 之类的访问器方法。MagickCore 与 MagickWand API 有一些细微的变更。Magick++ 与 PerlMagick API 没有变化,与 ImageMagick 版本 6 的保持一致。
ImageMagick 版本 7 的 shell API(命令行)经历了一次大规模检修,特别着重于不仅能从命令行、也能从脚本和文件流读取“选项”的能力。这使得可以使用“协同处理”(co-processing)编程技术,或使用“守护进程/服务器后端”进行图像处理,甚至进行多机分布式处理。
在 shell API 检修的同时还做了其他改进,包括:更好地报告哪个选项失败、选项的整合与弃用,以及在选项参数中更全局地使用“图像属性”(更常见地称为“百分号转义”)。
ImageMagick 版本 7 现已作为 生产 版本发布。
如今 ImageMagick 版本 7 已经发布,我们仍将继续支持版本 6 至少 10 年。对版本 6 的支持主要限于错误修复和安全补丁,仅有少量功能增强。
高动态范围成像
ImageMagick 版本 7 默认启用 高动态范围成像(HDRI)。HDRI 能准确表现真实场景中从最明亮的直射阳光到最深最暗的阴影这一宽广的强度级别范围。此外,图像处理结果更加准确。缺点是它需要更多内存,并可能导致更慢的处理时间。如果你发现版本 6 的命令行结果在版本 7 中有所不同,很可能是由于 HDRI 所致。你可能需要在命令行中添加 -clamp 以将像素约束到 0 .. QuantumRange 范围,或在构建 ImageMagick 版本 7 时禁用 HDRI。要禁用 HDRI(对于 iOS 等智能手机构建或以性能为重的生产站点,推荐如此),只需在构建 ImageMagick 时向 configure 脚本命令行添加 --disable-hdri。
像素通道
一个像素由一个或多个颜色值,即通道(例如红色像素通道)组成。
先前版本的 ImageMagick(4-6)支持 4 到 5 个像素通道(RGBA 或 CMYKA)。前 4 个通道通过 PixelPacket 数据结构访问。该结构包含 4 个 Quantum 类型(通常为 16 位)的成员:红、绿、蓝和不透明度(opacity)。黑色通道或颜色表索引由单独的方法和结构 IndexPacket 支持。作为示例,下面是来自 ImageMagick 版本 6 的一段代码片段,它对图像像素的颜色分量(但不包括 alpha 分量)取反:
for (y=0; y < (ssize_t) image->rows; y++)
{
IndexPacket
*indexes;
PixelPacket
*q;
q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
if (q == (PixelPacket *) NULL)
{
status=MagickFalse;
continue;
}
indexes=GetCacheViewAuthenticIndexQueue(image_view);
for (x=0; x < (ssize_t) image->columns; x++)
{
if ((channel & RedChannel) != 0)
q->red=(Quantum) QuantumRange-q->red;
if ((channel & GreenChannel) != 0)
q->green=(Quantum) QuantumRange-q->green;
if ((channel & BlueChannel) != 0)
q->blue=(Quantum) QuantumRange-q->blue;
if (((channel & IndexChannel) != 0) &&
(image->colorspace == CMYKColorspace))
indexes[x]=(IndexPacket) QuantumRange-indexes[x];
q++;
}
if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
status=MagickFalse;
}
ImageMagick 版本 7 支持从 1 到 64(乃至更多)的任意数量通道,并以返回 Quantum 类型像素通道数组的单一方法简化访问。针对先前版本 ImageMagick 编译的源代码需要重构才能在 ImageMagick 版本 7 中工作。我们用一个例子来说明。让我们先朴素地重构上面那段版本 6 的代码片段,使其能与 ImageMagick 版本 7 API 配合工作:
for (y=0; y < (ssize_t) image->rows; y++)
{
Quantum
*q;
q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
if (q == (Quantum *) NULL)
{
status=MagickFalse;
continue;
}
for (x=0; x < (ssize_t) image->columns; x++)
{
if ((GetPixelRedTraits(image) & UpdatePixelTrait) != 0)
SetPixelRed(image,QuantumRange-GetPixelRed(image,q),q);
if ((GetPixelGreenTraits(image) & UpdatePixelTrait) != 0)
SetPixelGreen(image,QuantumRange-GetPixelGreen(image,q),q);
if ((GetPixelBlueTraits(image) & UpdatePixelTrait) != 0)
SetPixelBlue(image,QuantumRange-GetPixelBlue(image,q),q);
if ((GetPixelBlackTraits(image) & UpdatePixelTrait) != 0)
SetPixelBlack(image,QuantumRange-GetPixelBlack(image,q),q);
if ((GetPixelAlphaTraits(image) & UpdatePixelTrait) != 0)
SetPixelAlpha(image,QuantumRange-GetPixelAlpha(image,q),q);
q+=GetPixelChannels(image);
}
if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
status=MagickFalse;
}
让我们再做一次,不过这次充分利用新的可变像素通道支持:
for (y=0; y < (ssize_t) image->rows; y++)
{
Quantum
*q;
q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
if (q == (Quantum *) NULL)
{
status=MagickFalse;
continue;
}
for (x = 0; x < (ssize_t) image->columns; x++)
{
ssize_t
i;
if (GetPixelWriteMask(image,q) <= (QuantumRange/2))
{
q+=GetPixelChannels(image);
continue;
}
for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
{
PixelChannel channel = GetPixelChannelChannel(image,i);
PixelTrait traits = GetPixelChannelTraits(image,channel);
if ((traits & UpdatePixelTrait) == 0)
continue;
q[i]=QuantumRange-q[i];
}
q+=GetPixelChannels(image);
}
if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
status=MagickFalse;
}
请注意我们如何使用 GetPixelChannels() 前进到下一组像素通道。
颜色表索引和(用于 CMYK 色彩空间的)黑色像素通道不再存储在先前通过 GetAuthenticIndexQueue() 和 GetCacheViewAuthenticIndexQueue() 访问的索引通道中。相反,它们现在是一等的像素通道,作为像素数组的成员(例如 pixel[4])访问,或通过便捷的像素访问器方法 GetPixelIndex()、SetPixelIndex()、GetPixelBlack() 和 SetPixelBlack() 访问。
由于对可变像素通道使用数组结构,自动向量化编译器获得了加速像素循环的额外机会。
IMv6 中的 sync 通道实际上是一个标志而非通道。在 IMv7 中,我们改用一个标志:-define compose:sync=false。
像素访问器
你可以将像素通道作为数组元素(例如 pixel[1])来访问,或使用便捷的访问器来获取或设置像素通道:
GetPixela() SetPixela()
GetPixelAlpha() SetPixelAlpha()
GetPixelb() SetPixelb()
GetPixelBlack() SetPixelBlack()
GetPixelBlue() SetPixelBlue()
GetPixelCb() SetPixelCb()
GetPixelCr() SetPixelCr()
GetPixelCyan() SetPixelCyan()
GetPixelGray() SetPixelGray()
GetPixelGreen() SetPixelGreen()
GetPixelIndex() SetPixelIndex()
GetPixelL() SetPixelL()
GetPixelMagenta() SetPixelMagenta()
GetPixelReadMask() SetPixelReadMask()
GetPixelWriteMask() SetPixelWriteMask()
GetPixelMetacontentExtent() SetPixelMetacontentExtent()
GetPixelOpacity() SetPixelOpacity()
GetPixelRed() SetPixelRed()
GetPixelYellow() SetPixelYellow()
GetPixelY() SetPixelY()
你可以在头文件 MagickCore/pixel-accessor.h 中找到这些访问器的定义。
像素特征(Traits)
每个像素通道包含以下特征中的一个或多个:
- Undefined
- 该像素通道未关联任何特征
- Copy
- 不更新该像素通道,仅复制它
- Update
- 更新该像素通道
- Blend
- 如果启用,将该像素通道与 alpha 蒙版混合
我们提供以下方法来设置和获取像素特征:
GetPixelAlphaTraits() SetPixelAlphaTraits()
GetPixelBlackTraits() SetPixelBlackTraits()
GetPixelBlueTraits() SetPixelBlueTraits()
GetPixelCbTraits() SetPixelCbTraits()
GetPixelChannelTraits() SetPixelChannelTraits()
GetPixelCrTraits() SetPixelCrTraits()
GetPixelGrayTraits() SetPixelGrayTraits()
GetPixelGreenTraits() SetPixelGreenTraits()
GetPixelIndexTraits() SetPixelIndexTraits()
GetPixelMagentaTraits() SetPixelMagentaTraits()
GetPixelRedTraits() SetPixelRedTraits()
GetPixelYellowTraits() SetPixelYellowTraits()
GetPixelYTraits() SetPixelYTraits()
为方便起见,你可以用一个通道蒙版和以下方法为一组像素通道设置活动特征:
SetImageChannelMask()
先前 MagickCore 方法有通道对应版本,例如 NegateImage() 和 NegateImageChannels()。由于像素通道特征指定了是否作用于特定像素通道、或是否与 alpha 蒙版混合,这些通道对应版本的方法不再必要。例如,不再使用
NegateImageChannel(image,channel);
而是使用:
channel_mask=SetImageChannelMask(image,channel);
NegateImage(image,exception);
(void) SetImageChannelMask(image,channel_mask);
像素用户通道
在版本 7 中,我们引入了像素用户通道。传统上我们使用 4 个通道:红、绿、蓝和 alpha。对于 CMYK 我们还有一个黑色通道。用户通道被设计用来包含对你的应用而言有意义的任何额外通道信息。一些示例包括 TIFF 或 PSD 图像中的额外通道,或者你可能需要一个为像素携带红外信息的通道。你可以为用户通道关联特征,这样当它们被图像处理算法(例如模糊)作用时,像素会被复制、被算法作用,甚至在有意义时与 alpha 通道混合。
像素元内容(Metacontent)
在版本 7 中,我们引入了像素元内容。元内容是关于内容的内容。因此它不是内容本身,而是描述内容或与内容相关联的某种东西。这里的内容就是像素。像素元内容供你专用(在内部数据只是被复制,不会被修改),并通过以下 MagickCore API 方法访问:
SetImageMetacontentExtent()
GetImageMetacontentExtent()
GetVirtualMetacontent()
GetAuthenticMetacontent()
GetCacheViewAuthenticMetacontent()
GetCacheViewVirtualMetacontent()
Alpha
我们现在支持 alpha,先前是 opacity(不透明度)。对于 alpha,值 0 表示该像素没有任何覆盖信息且为透明;即由于几何体没有与该像素重叠,没有任何几何体对其颜色有贡献。值 QuantumRange 表示该像素是不透明的,因为几何体完全覆盖了该像素。因此,在版本 7 中,PixelInfo 结构成员 alpha 取代了先前的 opacity 成员。另一个后果是十六进制记法中 sRGB 值的 alpha 部分现在被反转了(例如 #0000 为完全透明)。
色彩空间
不再支持 Rec601Luma 和 Rec709Luma 色彩空间。相反,指定 gray 色彩空间并从以下 intensity 选项中选择:
Rec601Luma
Rec601Luminance
Rec709Luma
Rec709Luminance
例如,
magick myImage.png -intensity Rec709Luminance -colorspace gray myImage.jpg
灰度
先前,灰度图像采用 Rec601Luminance 并消耗 4 个通道:红、绿、蓝和 alpha。在版本 7 中,灰度仅消耗 1 个通道,因此所需资源大大减少。
蒙版
版本 7 支持大多数图像运算符的蒙版。读蒙版(read mask)中的白色像素会忽略图像中对应的像素,而写蒙版(write mask)中的白色像素会保护图像中对应的像素。从命令行,你可以用 -read-mask 和 -write-mask 选项将蒙版与图像关联。这一极性与 ImageMagick 版本 6 中的蒙版一致,以便于移植你的工作流。为方便起见,我们在版本 7 中继续支持 -mask 选项以匹配版本 6 的行为。
在这个例子中,我们计算被蒙版的重建图像的失真:
compare -metric rmse -read-mask hat_mask.png hat.png wizard.png difference.png
这里我们保护某些像素不被更改:
magick rose: -write-mask rose_bg_mask.png -modulate 110,100,33.3 +write-mask rose_blue.png
与图像关联的蒙版会一直持续,直到它被修改或移除。对于复杂的命令行,这可能产生意想不到的结果。这里我们只想在应用 alpha 选项时裁剪,而不是在 resize 时裁剪:
magick -density 300 -colorspace srgb image.eps -alpha transparent -clip -alpha opaque +clip -resize 1000x1000 -strip image.png
MagickCore API
以下是 MagickCore API 的变更列表:
- 几乎所有图像处理算法现在都是通道感知的。
- MagickCore API 为版本 6 中缺少 ExceptionInfo 参数的那些方法添加了该参数,例如 NegateImage(image,MagickTrue,exception)
- 所有方法的通道对应版本(例如 BlurImageChannel())都已移除,它们不再必要,改用像素特征代替。
- 公有和私有 API 调用现在用 GCC 的 visibility 属性声明。MagickCore 与 MagickWand 动态库现在只导出公有的结构体和函数声明。
- InterpolatePixelMethod 枚举现在改为 PixelInterpolateMethod。
- IntegerPixel 存储类型已移除(改用 LongPixel),并新增了 LongLongPixel。
- 为考虑可变像素通道,图像签名发生了变化。
- 所有颜色包结构 PixelPacket、LongPacket 和 DoublePacket 都整合为单一的颜色结构 PixelInfo。
- ChannelMoments 结构成员 I 现在改为 invariant。I 与 complex.h 头文件冲突。
- 我们为 FormatMagickSize() 添加了一个 length 参数,以允许可变长度的缓冲区。
MagickWand API
以下是 MagickWand API 的变更列表:
- 几乎所有图像处理算法现在都是通道感知的。
- DrawMatte() 方法现在称为 DrawAlpha()。
- 不再支持 MagickSetImageBias() 和 MagickSetImageClipMask() 方法。
Magick++ API
以下是 Magick++ API 的变更列表:
- 几乎所有图像处理算法现在都是通道感知的。
- 例如,使用以下构造来避免对 alpha 通道进行操作:
image.negateChannel(Magick::ChannelType(Magick::CompositeChannels ^ Magick::AlphaChannel));
头文件
先前版本的 ImageMagick(4-6)将 ImageMagick 头文件引用为 magick/ 和 wand/。ImageMagick 7 改为分别使用 MagickCore/ 和 MagickWand/。例如,
#include <MagickCore/MagickCore.h>
#include <MagickWand/MagickWand.h>
已移除的弃用特性
ImageMagick 版本 6 的所有弃用特性在版本 7 中均被移除。这些包括 Magick-config 和 Wand-config 配置工具。改为使用:
MagickCore-config
MagickWand-config
FilterImage() 方法已被移除。改用 ConvolveImage()。
此外,所有弃用的 MagickCore 和 MagickWand 方法在版本 7 中均不再可用。
Bessel 滤波器因为是 Jinc 的别名而被移除。改用 -filter Jinc。
Shell API 或命令行界面
如前所述,对 Shell API 或命令行界面所做变更的主要焦点是抽象化,使选项不仅能从命令行参数读取,还能从文件(脚本)或文件流(交互式命令或协同处理)读取。
为此,CLI 解析器需要被重写,以便始终以严格的“边看边做”顺序执行所有选项。先前在 IMv6 中选项是成组执行的(称为 'FireOptions'),这种别扭之处现在已经消失。然而严格的顺序意味着你不能再在提供供操作使用的图像之前给出操作。这样做现在会产生错误。
错误报告现在会准确报告是哪个选项(按命令行上的参数计数,或脚本中的行、列)引发了“异常”。这一点尚未完成,但正在改进。同样尚未完成的是 'regard-warnings' 处理或其替代方案,它将允许你在协同进程或交互式使用中忽略报告的错误并(视错误情况酌情)继续处理。
在由 magick 工具激活的 IMv7 解析器中,设置会依次应用到内存中的每个图像(如果有的话)。而 option: 只需全局应用一次即可。直接使用其他工具,或将其作为参数传给 magick CLI(例如 magick),则会使用旧版(legacy)解析器。
先前用于将当前图像列表和图像设置(例如 '(' 和 ')')“压入”栈的圆括号选项,现在拥有一个完全独立的图像设置栈。也就是说,圆括号“压入/弹出”图像列表,而花括号(例如 '{' 和 '}')将“压入/弹出”图像设置。
当然,由于前面所述底层通道处理的变化,几乎所有选项都会产生许多副作用。下面是一些具体例子。
大多数算法会更新红、绿、蓝、黑(用于 CMYK)和 alpha 通道。大多数运算符会将 alpha 与其他颜色通道混合,但其他运算符(和情况)可能要求禁用这种混合,目前是通过 -channel 选项从活动通道中移除 alpha 来实现的(例如 magick castle.gif -channel RGB -negate castle.png)。
读取灰度图像会生成一个只有一个通道的图像。如果该图像随后要接受颜色,则需要应用 -colorspace 设置以将这一个通道扩展为单独的 RGB(或其他)通道。
先前,命令行参数被限制为 4096 个字符,在 ImageMagick 版本 7 中此限制已增加到 131072 个字符。
命令变更
以下是 ImageMagick 命令的变更列表:
- magick
- 重要:" magick" 命令是 Shell API 的新主命令,取代了旧的 "convert" 命令。这使你可以创建形如 "#!/path/to/command/magick -script" 的“magick 脚本”,或将选项管道传入命令 "magick -script -" 作为后台进程。
- magick-script
- 这与 "magick" 相同(仅命令名不同),但带有隐式的 "-script" 选项。这使你能以 "env" 风格的脚本形式使用它。也就是说,一个 magick 脚本以 "#!/usr/bin/env magick-script" 这一 'she-bang'(井号叹号)行开头,使脚本解释器能在用户命令 "PATH" 的任意位置被找到。这是为了绕开大多数 UNIX 系统(包括 Linux,但不包括 MacOSX)上常见的“单参数 she-bang 错误”所必需的。
- animate, compare, composite, conjure, convert, display, identify, import, mogrify, montage, stream
- 为减小命令行工具的占用空间,这些工具是指向 magick 工具的符号链接。在 Windows 上这些工具作为单独的可执行文件安装,并且不再包含旧版的 convert 可执行文件。你也可以从 magick 工具调用它们,例如用 magick logo: logo.png 来调用 magick 工具。(换句话说,通过在前面加上 magick 来调用这些工具,例如 magick compare、magick identify、magick mogrify、magick montage 等。不要使用 magick convert。那就是单纯的 magick)
行为变更
图像设置会应用到命令行上的每个图像。要将某项设置与特定图像关联,使用圆括号来消除歧义。在这个例子中我们为每个图像分配一个唯一的页面偏移:
magick \( -page +10+20 first.png \) \( -page +100+200 second.png \) ...
默认情况下,诸如卷积之类的图像操作会将 alpha 与每个通道混合。要对每个通道独立进行卷积,按如下方式停用 alpha 通道:
magick ... -alpha discrete -blur 0x1 ...
要从图像中移除 alpha 值,使用 -alpha off。如果你想保留 alpha 通道但在某些图像处理操作中不混合 alpha 像素,则改用 -alpha deactivate。
某些选项在 ImageMagick 版本 7 中发生了变更。这些包括:
- -channel
- 默认会更新 RGBA 通道,而先前在 IMv6 中默认是 RGB。如果你得到与 IMv6 不同的结果,可能需要在命令行上指定 -channel RGB(例如 -channel RGB -negate)。
- +combine
- 此选项现在需要一个参数,即图像色彩空间(例如 +combine sRGB)。
- -format
- 不再支持 %Z 图像属性。
- -gamma
- 不再支持多个 gamma 参数(例如 -gamma 1,2,3),改用 -channel 代替(例如 -channel blue -gamma 2)。
- -region
- 此选项为你定义的区域设置一个写蒙版。在 IMv6 中,会改为克隆一个单独的图像、对其进行操作,然后将结果合成到源图像。此外,draw 变换是相对于图像的左上角,而先前在 IMv6 中是相对于该区域。
使用 -define morphology:showKernel=1 来输出形态学或卷积核。先前是 -define showKernel=1。
新选项
ImageMagick 版本 7 支持以下新选项,但大多数仅限于在 "magick" 命令中、或在 "magick" 脚本中使用。
- { ... }
- 保存(并恢复)当前图像设置(内部称为 "image_info" 结构)。如同在 IMv6 中一样,当设置了 "-regard-parenthesis" 时,圆括号(例如 '(' 和 ')')会自动完成此操作。建议谨慎,以防止花括号不平衡的错误。
- --
- 选项的结束,用于 IMv7 "mogrify" 命令,以显式分隔要应用的操作和要“就地”处理的图像。(尚未实现)。但即使未提供,仍可使用 "-read" 来将次要图像读取(用于诸如 alpha 合成之类的用途)与正在被处理的“就地”图像区分开来。在其他命令(例如 "magick")中,它等价于对下一个选项作为图像进行显式的 "-read"(见下文)(如同在 IMv6 中一样)。
- -alpha activate/deactivate
- 分别启用和禁用 alpha 通道,具有持久性。这类似于 ImageMagick 6 中的 on/off。在 ImageMagick 7 中,-alpha off 会永久移除 alpha 通道,因此 -alpha on 将无法重新启用它。
- -alpha discrete
- 独立处理 alpha 通道(不混合)。
-channel-fx expression
交换、提取或复制一个或多个图像通道。
该表达式由一个或多个通道(助记符或数字,例如 red 或 0、green 或 1 等)组成,以如下特定操作符号分隔:
<=> 交换两个通道(例如 red<=>blue)
=> 将一个通道复制到另一个通道(例如 red=>green)
= 给通道赋一个常量值(例如 red=50%)
, 以指定的顺序写出带有这些通道的新图像(例如 red, green)
; 为下一组通道操作添加一个新的输出图像(例如 red; green; blue)
| 移到下一个输入图像作为通道数据的来源(例如 | gray=>alpha)
例如,要从图像的红、绿、蓝通道创建 3 个灰度图像,使用:
-channel-fx "red; green; blue"
没有操作符号的通道意味着 separate(即分号)。
这里我们取一个 sRGB 图像和一个灰度图像,将灰度图像注入到 alpha 通道:
magick wizard.png mask.pgm -channel-fx '| gray=>alpha' wizard-alpha.png
使用类似的命令来定义一个读蒙版:
magick wizard.png mask.pgm -channel-fx '| gray=>read-mask' wizard-mask.png
在 -channel-fx 选项之前添加 -debug pixel 以跟踪通道形态学。
- -exit
- 在此处停止处理。此选项之后将不再处理任何选项。可在脚本中使用,以强制 "magick" 命令退出,而不实际关闭它正从中处理选项的管道。也可作为 "magick" 命令行上的“最终”选项使用,代替隐式的输出图像,以完全阻止任何图像写出。旁注:即使是 "NULL:" 编码器也需要至少一个图像才能“不写出”!此选项完全不需要任何图像。
- -read
- 显式读取图像,而非隐式读取。这使你能从以“选项”字符开头、否则可能被误认为选项(无论已知与否)的文件名读取。这最终将用于 "mogrify",以允许读取次要图像,并允许在该命令内使用图像列表操作。
- -read-mask
- 阻止对蒙版指定的图像像素进行更新。
- -region
- 在 ImageMagick 7.0.2-6 及以上版本中支持。
- -script
- 在 "magick" 中,停止将命令行参数作为图像操作来处理,并从给定的文件或管道读取此后所有选项。
- -write-mask
- 阻止像素被写出。
已变更的选项
已知这些选项以某种方式发生了变更。
- -bias
- 此选项不再被识别。改用 -define convolve:bias=value。
- -draw
- matte 图元现在改为 alpha(例如 -draw 'alpha 0,0 floodfill')。
- -negate
- 目前会对所有通道取反,包括存在的 alpha。因此你可能需要使用 -channel 选项来防止 alpha 被取反(例如 -channel RGB -negate)。
- -preview
- 此选项现在是一个图像运算符。PREVIEW 图像格式已被移除。
给出弃用警告,但(暂时)仍可工作
- -affine
- 被 -draw "affine ..." 取代。(参见 transform)
- -average
- 被 -evaluate-sequence Mean 取代。
- -box
- 被 -undercolor 取代。
- -deconstruct
- 被 -layers CompareAny 取代。
- -gaussian
- 被 -gaussian-blur 取代。
- -/+map
- 被 -/+remap 取代。
- -/+mask
- 被 -/+read-mask、-/+write-mask 取代。
- -/+matte
- 被 -alpha Set/Off 取代。
- -transform
- 被 -distort Affine "..." 取代。
给出弃用警告,且(暂时)被忽略
几乎所有未做任何事情的“加号”(+)选项都已被标记为弃用,且什么也不做。它甚至没有关联的代码。例如 "+annotate"、"+resize"、"+clut" 和 "+draw"。
- -affinity
- 被 -remap 取代。
- -maximum
- 被 -evaluate-sequence Max 取代。
- -median
- 被 -evaluate-sequence Median 取代。
- -minimum
- 被 -evaluate-sequence Min 取代。
- -recolor
- 被 -color-matrix 取代。
已移除/已替换的选项(“no such option”错误并中止)
- -interpolate filter
- 移除缓慢且无用的插值方法。
- -origin
- 旧选项,含义不明。
- -pen
- 被 -fill 取代。
- -passphrase
- 旧选项,含义不明。
性能改进
由于只需要一个通道,灰度图像的操作得到了显著改进。先前灰度需要三个通道。
-fx 选项的性能提升了一到两个数量级。
版本 7 变更摘要
ImageMagick 从版本 6 到版本 7 的变更总结如下:
高动态范围成像
- ImageMagick 版本 7 默认启用 HDRI。预期会有更准确的图像处理结果,但内存需求更高,处理时间可能更慢。对于诸如手机之类资源受限的系统,你可以禁用此特性,代价是某些算法(例如调整尺寸)的精度略有损失。
像素
- 像素不再用 PixelPacket 结构成员(例如 red、green、blue、opacity)来寻址,而是用通道数组(例如 pixel[PixelRedChannel])。
- 使用便捷的宏来访问像素通道(例如 GetPixelRed()、SetPixelRed())。
- CMYK 色彩空间的黑色通道不再存储在先前通过 GetAuthenticIndexQueue() 和 GetCacheViewAuthenticIndexQueue() 访问的索引通道中。相反,它现在是一个像素通道,并通过便捷的像素宏 GetPixelBlack() 和 SetPixelBlack() 访问。
- 颜色表图像的索引通道不再存储在先前通过 GetAuthenticIndexQueue() 和 GetCacheViewAuthenticIndexQueue() 访问的索引通道中。相反,它现在是一个像素通道,并通过便捷的像素宏 GetPixelIndex() 和 SetPixelIndex() 访问。
- 使用 GetPixelChannels() 前进到下一组像素通道。
- 使用元内容通道将元内容与每个像素关联。
- 所有颜色包结构 PixelPacket、LongPacket 和 DoublePacket 都整合为单一的颜色结构 PixelInfo。
Alpha
- 我们支持 alpha 而非 opacity(0 透明;QuantumRange 不透明)。
- 使用 GetPixelAlpha() 或 SetPixelAlpha() 来获取或设置 alpha 像素通道值。
灰度
- 在 ImageMagick 版本 7 中灰度图像消耗一个像素通道。要处理 RGB,将色彩空间设置为 RGB(例如 -colorspace sRGB)。
蒙版
- ImageMagick 版本 6 仅在有限情况下支持读蒙版。版本 7 同时支持读蒙版和写蒙版。读蒙版被大多数图像处理算法所尊重。
MagickCore API
- 几乎所有图像处理算法现在都是通道感知的。
- MagickCore 版本 7 为版本 6 中缺少 ExceptionInfo 参数的那些方法添加了该参数,例如 NegateImage(image,MagickTrue,exception);
- 所有方法的通道对应版本(例如 BlurImageChannel())都已移除,它们不再必要,改用像素特征代替。
- 公有和私有 API 调用现在用 GCC 的 visibility 属性声明。MagickCore 与 MagickWand 动态库现在只导出公有的结构体和函数声明。
- InterpolatePixelMethod 枚举现在改为 PixelInterpolateMethod。
- 为考虑可变像素通道,图像现在可能返回不同的签名。
弃用的方法
- 所有 ImageMagick 版本 6 的 MagickCore 和 MagickWand 弃用方法都被移除,在 ImageMagick 版本 7 中不再可用。
- 所有 MagickCore 通道方法对应版本都被移除(例如 NegateImageChannels())。在版本 7 中改用像素特征代替。
- FilterImage() 方法已被移除。改用 ConvolveImage()。