Color Modes

移植到 ImageMagick 版本 7

ImageMagick 版本 7高动态范围成像像素通道Alpha灰度蒙版MagickCore API头文件已弃用功能移除命令行界面性能改进版本 7 更改摘要

ImageMagick 的设计是一个不断进化的过程,设计和实施工作相互影响并指导着未来的发展。在 ImageMagick 版本 7 中,我们根据从版本 6 实现中汲取的经验教训改进了设计。ImageMagick 最初是为将 RGB 图像显示到 X 窗口服务器而设计的。随着时间的推移,我们扩展了对 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(命令行)进行了重大改进,特别强调了不仅从命令行,还从脚本和文件流读取“选项”的能力。这允许使用“协同处理”编程技术或使用“守护进程/服务器后端”执行图像处理,甚至进行多机分布式处理。

随着 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 位)的成员,分别为红色、绿色、蓝色和不透明度。黑色通道或颜色映射索引由单独的方法和结构 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 中找到这些访问器的定义

像素特征

每个像素通道包含一个或多个这些特征

未定义
与该像素通道无关的特征
复制
不要更新该像素通道,只需复制它
更新
更新该像素通道
混合
如果启用,将该像素通道与 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 通道混合,如果这有意义的话。

像素元内容

在版本 7 中,我们引入了像素元内容。元内容是关于内容的内容。因此,它不是内容本身,而是描述或与内容关联的东西。这里的内容是一个像素。像素元内容供您专有使用(在内部,数据只是被复制,不会被修改),并通过这些 MagickCore API 方法访问

SetImageMetacontentExtent()
GetImageMetacontentExtent()
GetVirtualMetacontent()
GetAuthenticMetacontent()
GetCacheViewAuthenticMetacontent()
GetCacheViewVirtualMetacontent()

Alpha

我们现在支持 alpha,以前是不透明度。对于 alpha,0 的值表示像素没有任何覆盖信息,并且是透明的;即,由于几何体没有重叠该像素,因此没有任何几何体对颜色贡献。QuantumRange 的值表示像素是不透明的,因为几何体完全重叠了像素。因此,在版本 7 中,PixelInfo 结构成员 alpha 已经取代了以前的不透明度成员。另一个结果是十六进制表示法中 sRGB 值的 alpha 部分现在被反转了(例如,#0000 完全透明)。

色彩空间

Rec601LumaRec709Luma 色彩空间不再受支持。相反,指定 gray 色彩空间,并从以下强度选项中选择

Rec601Luma
Rec601Luminance
Rec709Luma
Rec709Luminance

例如,

magick myImage.png -intensity Rec709Luminance -colorspace gray myImage.jpg

灰度

以前,灰度图像为 Rec601Luminance,消耗 4 个通道:红色、绿色、蓝色和 alpha。在版本 7 中,灰度仅消耗 1 个通道,因此需要的资源少得多。

蒙版

版本 7 支持大多数图像操作的蒙版。读取蒙版中白色的像素会忽略图像中相应的像素,而写入蒙版中白色的像素会保护图像中相应的像素。从命令行,您可以使用 -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 选项时进行裁剪,而不是调整大小

convert -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 可见性属性声明。MagickCore 和 MagickWand 动态库现在只导出公共结构和函数声明。
  • InterpolatePixelMethod 枚举现在是 PixelInterpolateMethod。
  • IntegerPixel 存储类型已删除(请改用 LongPixel),并添加了 LongLongPixel
  • 图像签名已更改,以考虑可变像素通道。
  • 所有颜色包结构,PixelPacket、LongPacket 和 DoublePacket,都合并到单个颜色结构 PixelInfo 中。
  • ChannelMoments 结构成员 I 现在是 invariantIcomplex.h 头文件冲突。
  • 我们在 FormatMagickSize() 中添加了一个长度参数,以允许使用可变长度缓冲区。

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 版本 7 中移除了所有来自版本 6 的已弃用功能。这些包括 Magick-configWand-config 配置实用程序。请改用

MagickCore-config
MagickWand-config

FilterImage() 方法已被移除。请改用 ConvolveImage()。

此外,所有已弃用的 MagickCoreMagickWand 方法在版本 7 中不再可用。

贝塞尔滤波器已被移除,因为它只是 Jinc 的别名。请改用 -filter Jinc。

Shell API 或命令行界面

如前所述,对 Shell API 或命令行界面的更改主要侧重于抽象,以便不仅可以从命令行参数中读取 options,还可以从文件中(脚本)或文件流中(交互式命令或协同处理)读取。

为此,需要重写 CLI 解析器,以便始终以严格的“所见即所得”顺序执行所有选项。以前在 IMv6 中,选项是按组执行的(称为“FireOptions”),这种笨拙的做法现在已经消失了。但是,严格的顺序意味着你不能在提供操作对象图像之前给出操作。这样做现在会产生错误。

错误报告现在会报告哪个选项(通过命令行上的参数计数或脚本中的行、列)导致了“异常”。这还没有完全实现,但正在不断改进。同样尚未完成的是“regard-warnings”处理或它的替代方案,它将允许你忽略报告的错误并继续处理(根据错误情况,在协同处理或交互式使用中)。

使用由 `magick` 实用程序激活的 IMv7 解析器,设置会依次应用于内存中的每个图像(如果有)。而一个选项:只需要全局应用一次。直接使用其他实用程序,或作为 `magick` CLI 的参数(例如 `magick`)使用传统解析器。

以前用于“推送”当前图像列表和图像设置(例如:'(' 和 ')')的括号选项现在有一个完全独立的图像设置堆栈。也就是说,括号“推送/拉取”图像列表,而花括号(例如:'{' 和 '}')将“推送/拉取”图像设置。

当然,由于之前报告的底层通道处理更改,将对几乎所有选项产生许多副作用。以下是一些具体的示例

大多数算法会更新红色、绿色、蓝色、黑色(对于 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 中,会克隆一个单独的图像,对其进行操作,并将结果合成到源图像。此外,绘制变换相对于图像的左上角,以前在 IMv6 中它们相对于区域。

使用 -define morphology:showKernel=1 发布形态学或卷积内核。以前是 -define showKernel=1

新选项

ImageMagick 版本 7 支持以下新选项,尽管大多数选项仅限于 "magick" 命令,或用于 "magick" 脚本中。

{ ... }
保存(和恢复)当前图像设置(在内部称为“image_info”结构)。如果设置了 "-regard-parenthesis",这会像 IMv6 中一样自动使用括号(例如:'(' 和 ')')完成。建议谨慎操作,以防止出现不平衡的花括号错误。
--
选项结束,用于在 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 等),并用以下某些操作符号隔开

<=>  exchange two channels (e.g. red<=>blue)
=>   copy one channel to another channel (e.g. red=>green)
=    assign a constant value to a channel (e.g. red=50%)
,    write new image with channels in the specified order (e.g. red, green)
;    add a new output image for the next set of channel operations (e.g. red; green; blue)
|    move to the next input image for the source of channel data (e.g. | gray=>alpha)

例如,要从图像的红色、绿色和蓝色通道创建 3 个灰度图像,请使用

-channel-fx "red; green; blue"

没有操作符号的通道表示分离(即分号)。

这里我们采用一个 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 {image}
显式读取图像,而不是隐式读取。这使你能够从以“选项”字符开头的文件名中读取,否则这些文件名可能会被误认为是选项(未知或其他)。这最终将用于 "mogrify",以允许读取辅助图像,并在该命令中使用图像列表操作。
-read-mask
防止更新掩码指定的图像像素
-region
在 ImageMagick 7.0.2-6 及更高版本中受支持
-script {file}
在 "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 ..."。(参见变换)
-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

已移除/替换的选项(“没有此选项”错误并中止)

-interpolate filter
移除缓慢且无用的插值方法
-origin
旧选项,含义未知。
-pen
替换为 -fill
-passphrase
旧选项,含义未知

性能改进

仅需一个通道即可显著提高对灰度图像的操作性能。以前,灰度图像需要三个通道。

-fx 选项的性能提高了 1 到 2 个数量级。

版本 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() 访问下一组像素通道。
  • 使用 metacontent 通道将元内容与每个像素关联。
  • 所有颜色包结构,PixelPacket、LongPacket 和 DoublePacket,都合并到单个颜色结构 PixelInfo 中。

Alpha

  • 我们支持 Alpha 而不是不透明度(0 透明;QuantumRange 不透明)。
  • 使用 GetPixelAlpha() 或 SetPixelAlpha() 获取或设置 Alpha 像素通道值。

灰度

  • 灰度图像在 ImageMagick 版本 7 中占用一个像素通道。要处理 RGB,请将颜色空间设置为 RGB(例如,-colorspace sRGB)。

蒙版

  • ImageMagick 版本 6 仅在有限的情况下支持读取蒙版。版本 7 支持读取和写入蒙版。大多数图像处理算法都支持读取蒙版。

MagickCore API

  • 几乎所有图像处理算法现在都支持通道。
  • MagickCore 版本 7 在那些版本 6 中缺少 ExceptionInfo 参数的方法中添加了一个 ExceptionInfo 参数,例如 NegateImage(image,MagickTrue,exception);
  • 所有方法通道模拟都已删除(例如 BlurImageChannel()),它们不再需要,请改用像素特征。
  • 公共和私有 API 调用现在使用 GCC 可见性属性声明。MagickCore 和 MagickWand 动态库现在只导出公共结构和函数声明。
  • InterpolatePixelMethod 枚举现在是 PixelInterpolateMethod。
  • 为了考虑可变像素通道,图像现在可能返回不同的签名。

弃用方法

  • 所有 ImageMagick 版本 6 MagickCore 和 MagickWand 弃用方法已删除,在 ImageMagick 版本 7 中不再可用。
  • 所有 MagickCore 通道方法模拟已删除(例如 NegateImageChannels())。对于版本 7,请改用像素特征。
  • FilterImage() 方法已被移除。请改用 ConvolveImage()。