ImageMagick 示例 --
基本用法
索引
在这里,我们详细解释了 IM 遵循的命令行处理,一些新的图像处理功能,想法、哲学和方法论,以及内部发生的实际情况。有了这些背景知识,提供的示例页面中的其余部分将变得更加清晰。即使您只使用应用程序编程接口 (API),本节也值得了解和理解。
为什么命令行样式发生了改变! 或者...
在 ImageMagick 的早期版本 (版本 5.5.7 及更早版本) 中,IM 库的命令行接口一直存在与执行操作的顺序相关的问题。它非常杂乱,而且对于任何试图弄清楚实际情况的人来说都很混乱。此外,以前有效的东西可能在其他时候以相同的顺序无效,因为 IM 的作者一直在不断地与接口作斗争,以使其按人们期望的方式工作。问题的根源在于 ImageMagick 遵循了相当标准的 UNIX 命令行样式...
问题是,如果您处理两个图像处理操作会怎么样!例如...
结果 (在 IM v5.5.7 中) 是两个输入图像首先被旋转,然后拼接在一起,产生类似的图像... 也就是说,“
在 ImageMagick 版本 6 中,操作符将始终按用户在命令行中给出的顺序应用。
因此,IMv7 中的先前示例将导致:首先将两个图像拼接在一起,然后将结果旋转;产生这样的结果...
如果用户实际上打算在拼接之前进行旋转,他可以明确地要求 IM v6 以这种顺序执行。
这种精细的控制在以前的 IM 版本中是无法实现的,可能需要使用管道或中间保存图像才能实现。解决问题的方法,不幸的是需要采取一项重大措施,并造成一些不兼容性。另一方面,几乎所有在 IM 版本 5 中有效的“简单”命令都像您期望 IM 版本 6 一样工作。从本质上讲,版本 6 之前的版本中的命令行用法定义不明确,在我看来是错误的,产生了大量奇怪且意想不到的结果。
我希望将选项分成设置和操作符的做法是清晰的,因为这对于 IM 的当前工作方式至关重要。请记住,在 ImageMagick 的 6.0 版本之前...
让我们分解它,看看 IM 6.0 版本做了什么...
如你所见,ImageMagick 6.0 版本中命令行的处理非常直接,逻辑性强,使得结果可预测。这就是关键所在...
将产生与这个 IM 6.0 版本命令相同的结果...
遗留命令行风格可以工作,但存在与 IM 5.0 版本相同的缺陷(参见上面的 为什么命令行风格会改变)。所有设置都在第一个读入之前应用,而所有操作符都被保存起来,以便在第一个图像读入时执行(并且只在第一个图像上执行)。此外,也没有保证多个操作符的顺序与你提供的顺序相同,尽管它们很可能按该顺序应用。此外,由于操作符被保存起来,直到第一个图像实际被读入,所以你可能会发现,在读入图像之前多次重复一个命令会导致一些较早的命令“消失”。这不是错误,而是对 IM 遗留功能的错误使用。这种命令行风格仅用于支持遗留,因此已过时,应尽可能避免使用。任何包含这种旧风格的脚本也应该更新,以便在要应用的运算符之前进行图像读入。
仅允许这些特定设置,如果您尝试使用其他设置,则会收到错误消息。例如...设置可以用多种不同的方式指定,所有这些方式都是完全有效的。IM 对此非常宽容。例如,设置可以用大写、小写或大小写的组合来指定。单个词(由“
如果字符串不是从文件或输入流中读取的,则任何 '
您可以看到上面的输出结果作为 HTML 网页 显示图像。关于这些选项的最后一句话。默认情况下,它们都会打印到 "
将允许您转换或批量修改图像,而不会破坏原始图像。在这种情况下,将所有 PNG 文件转换为具有相同文件名但后缀不同的 JPEG 文件。但是请注意,如果存在具有相同名称的现有文件,它将被 *覆盖*。所以让我重申一下...
由于 "
如您所见,上面生成的图像的大小由第二个 "使用 "
由于 "
请注意,任何 Alpha 合成方法都可以以这种方式使用,但前提是仅使用恒定的“源”或“叠加”图像应用于所有图像。另外,由于“
警告,不要在文件名设置本身中包含不同的文件后缀。IM 在决定要使用的图像文件格式时将不会看到它。请注意,IM 无法从文件名中判断,它将回退到读取的原始文件格式,因此,在使用此技术时,明确的后缀或编码器前缀可能很重要。要获取源图像的原始文件名,请使用“
等等。我建议使用“
具有调色板(或布尔值)透明度的图像,例如 GIF 和 PNG8 格式,将使用当前“透明颜色”显示,该颜色用于在颜色表中表示透明度。也就是说,可能会使用通常的随机颜色(通常是黑色)而不是默认的棋盘格图案。这可以被认为是一个错误,尽管从技术上讲它不是。但是,如果您希望 display 以与其他包含透明度信息的图像相同的方式处理此类图像,则可以在将图像馈送到“
或者,几乎任何修改正在显示的图像的操作也会删除现有的调色板元数据。因此,可以使用一些“
这样做的好处是可以清除可能存在的 GIF 动画优化。不过对于多个不相关的图像,这可能会带来其他不良影响。是的,这些方法很笨拙,但它们有效。
此方法不提供背景窗口、菜单选项或其他控件。它只是简单地一次显示一个图像。如果您只想简单地“显示”生成的图像,特殊的“
对于 JPG 图像,您可以使用特殊的 jpeg 输入大小提示设置来加快图像读取速度。参见读取 JPEG 控制选项。
如果图像来自现代数码相机,您还可以使用“
有关更多图像平铺的示例以及它们的生成方法,请参见平铺画布和背景图像示例。如果您想为 X 窗口背景使用单个图像,您可能需要知道 X 窗口显示的大小。“
这里我们使用“
将在后台命令中显示内置的“wizard”图像。然后脚本将等待 5 秒,然后用内置的“logo”图像替换它。请注意,如果没有运行“
我已经编写了一个脚本,利用这种方法,名为“
有关更多信息和示例,请参见真正的大型图像处理。
它实际上很少使用,因为特殊的“
如你所见,"
因为 "
括号还使你在单个 "
当然,可以使用 "
第一组括号严格来说并不需要,它们确实给 IM 的内部处理增加了一点点额外的负担,但它确实通过分离处理步骤来清楚地说明命令正在做什么。对于图像处理脚本,将每个处理步骤作为单独的括号来执行可能更容易,因为这是一种分离正在应用的处理步骤的方法。
请注意,第一个 "
如你所见,当括号结束时,字体设置被恢复到之前的 'Candice' 字体,而不是在括号中设置的 'Gecko' 字体。当你要在很短的时间内更改很多设置时,这将非常有用...
"
操作符的 '加号' 形式 "
或删除所有内容(并添加新图像)...
'
但是,如果图像数量为 24 个或更少,则不会删除任何图像。因此,每次运行命令时,动画都会增长一帧,直到达到 24 帧的最大值。此后,最旧的(第一帧)将被删除,同时添加一个新帧。从 IM v6.3.4 开始,"
这次 "
"
你可以将插入索引视为应该出现在图像被插入点之前的图像数量。当然,位于该索引的图像(以及之后的所有图像)将被向上移动到下一个索引位置,以腾出空间用于新图像。如果使用负索引位置,则插入位置是在插入的图像从列表末尾移除之后计算的。也就是说,它将像没有插入的图像一样,不存在于原始图像列表中。因此,"
加号形式 "
要执行上述操作的逆操作(将图像移动到图像列表的末尾),可以通过首先使用 "
简而言之,"
此选项的加号形式 "
可能最常见的用途是,在使用诸如 "
从 IM v6.4 开始,"
"
它基本上是一个终极的 交换操作符.
此图像列表操作符有点不同。给定一个图像列表数字 "
无参数的 '加号' 形式 "
从版本 6.2.2 开始,"
当然,负索引的行为仍然与你预期的一致。例如,要复制整个图像列表,你可以使用数字 '
当你使用用逗号分隔的索引列表时,这些图像将按照你指定的顺序提取。
如果范围内的图像被反转(在将负索引转换为实际的图像索引后),则作为提取过程的一部分,提取的图像也会被反转。
不带括号的 克隆图像操作符 可以直接从当前图像列表中复制图像并追加,但这不是其预期用途,应避免使用,因为如果稍后将该操作组用括号括起来,则会产生不同的结果。另外,在上面的示例中,我正在生成克隆并将它们追加到当前图像列表中,以演示该操作符。实际上,我应该使用 复制图像操作符 来复制当前图像列表中的图像。因此,您也应该这样做,因为它可以更清楚地表明您要做什么。 MPR: 图像内存寄存器也可以用来克隆图像,并且在 IM v5 中可用。它实际上仍然是克隆和存储整个图像列表(长度未知)以供以后使用的一种有效方法,而不仅仅像上述图像列表操作符那样存储单个图像。
您可以使用 "
请注意,此操作符可以非常快地生成数百个图像,但是直到图像被处理,这些图像仅仅是彼此的“克隆”,它们之间共享实际的图像数据。因此,重复的图像非常节省内存。如果存在多个图像,则最后一个图像会被复制 N 次...
如果您只想将最后一个图像复制一次,您可以使用参数的“加号”形式。
如果您想多次复制特定的图像,您可以将图像索引指定为第二个参数。
参数的索引部分可以包含要复制 N 次的图像索引列表或范围。例如,将整个列表复制两次,以创建原始图像数量的三倍...通过使用反转的图像列表,也可以轻松创建 巡逻循环 类型的动画列表。
请注意,我没有复制整个图像列表,而是跳过了第一个(
但是请注意,通过误用 颜色变形操作符,图像实际上正在被处理,因此变形需要花费时间来实际处理图像(不产生任何变化)。此外,创建的图像将包含原始数据的实际副本,而不仅仅是简单的、节省内存的克隆。
另一种似乎越来越常见的方法是使用 "
这些技术将在下一部分中继续介绍,即关于 复杂的图像处理和调试。
检查结果的另一种方法是将结果管道到显示命令中,以便在屏幕上查看结果,而不是将它保存到图像文件。也就是说,在最后一行使用类似这样的内容...
或者,您可以使用 '
您实际上甚至不需要 "
这种类型的图像处理还允许在图像创建后立即轻松查看中间图像。基本上,您可以在 "
一旦该中间图像被输出以供显示,IM 将自动继续处理。请参阅 显示图像输出。或者,通过插入此行,您可以在处理中的那个点显示到目前为止生成的所有当前图像...
在您调试和确定图像处理步骤后,您可以优化代码,以便您不需要使用那么多的括号步骤,以及更少的 克隆图像,从而导致最终需要 删除 的中间图像更少。请记住,"图像合成" 或者 "图层扁平化" 将多个图像合并在一起,只留下一个结果图像,这可以减少内存中中间图像的总数。
ImageMagick 能够以标准化、编程化和自动化的方式处理任何图像,并在一个命令中使用多个步骤,这使得 IM 成为一个如此强大的工具。您可以编写一个非常复杂的运算,然后将其应用于许多图像。图像列表操作符和括号使 IM 的功能提升了一个数量级,允许您使用更少的命令编写更复杂的图像操作程序。有关将复杂图像过程一起编写脚本的另一个示例,请参阅示例 从形状中编写的 3-D 子弹。另请参阅 更好的 ImageMagick Shell/PHP 脚本提示,了解如何改进您的图像过程脚本,以便更轻松地编辑、理解,并让其他人能够理解您的操作。
另一方面,"
您可以使用 "
例如,在这里我使用所有可用的设置方法来设置各个图像的“虚拟画布偏移”或“页面”,因为我从它们中创建了一个 动画……
如您所见,当从单独的图像文件创建多图像列表时,传统的(非设置)方法更简单。但是,当您需要更改已读取到内存中或由一些复杂的图像处理方法创建的图像时,"
有关从图像列表中提取和修改单个图像的更极端的示例,请参见 动画的逐帧修改。以下是一个使用 "
您可以使用 "
这可以工作,但使用起来非常笨拙和痛苦,尤其是在处理多个图像(如动画)时。事实上,这是在 IM 版本 5 中更改图像中元数据的唯一方法。(太糟糕了!)
这两个方面,“大小”和“偏移”密切相关,但通常您希望分别处理这两个方面,或者以更受控的方式进行处理。因此,除了正常的 "
一些格式,如 GIF 和 PNG,保存虚拟画布信息,而另一些格式,如 JPEG,则不保存。以上所有格式对虚拟画布信息都有各自的限制。只有内部 MIFF 文件格式没有此类限制。请注意,"
在这里,我使用 identify 的 "
使用此信息生成新的标签图像很棘手,我们将在下面讨论。您可以使用的最有用的用户定义设置之一是 "
以上将生成一个名为 "
换句话说,'定义的工件' 为专家用户提供了一种方法,让他们可以在正常参数使用之外修改特定操作符的正常操作或标准操作。例如,JPEG 编码器设置,用于读取和写入此类图像...
图像失真选项,例如...
调整大小过滤器控制,例如
一些工件定义有快捷方式,因为它们被用户非常频繁地使用。例如,"
但由于 属性 附加到特定图像,因此您无法在创建新图像时使用它们。例如,这将失败...
如您所见,'
那么,您如何使用图像属性或属性创建标签呢? "
更重要的是,"
请注意上面 "
注意现在可见的严重舍入(量子效应),在渐变配置文件中形成台阶。由于只使用了 16 个灰度值,您实际上将图像转换为只有 4 位的颜色深度!请注意,这种类型的量子舍入问题在 IM Q8 版本中非常常见,只需执行多个图像处理任务,例如,超出基本调整大小和裁剪图像。这是更正常的 IM Q16 使用其额外的内存使用量解决的问题。只有当您使用非常重的图像处理(例如,快速傅立叶变换 (FFT) 或合并包含不同曝光时间(光强度)的图像以生成高动态范围图像)时,量子舍入才会成为 IM Q16 的问题。这毕竟是为什么 HDRI 最初被添加到 ImageMagick 的原因。燃烧和裁剪... 这里我“拉伸”渐变,使原始的黑色和白色颜色值远远超出“Quantum Range”,然后再恢复。
您可以看到,正常的 IM 会丢失两端的 信息。较低端的 值 会 被 “烧毁”,因为值 会 变成 负 数,而 高端 的 值 会 被 “裁剪”,因为 它们 超过 了 用于 保存 值 的 整数 的 最大 'Quantum Range' 限制。ImageMagick 的 HDRI 版本 结果... 使用 ImageMagick 的 HDRI 版本重复这两个操作不会产生上述任何舍入、燃烧或裁剪结果,但会在内存方面产生额外的成本(双精度数比整数需要更多空间)。在速度方面,它不会花费太多,实际上甚至可能在当今许多现代计算机硬件上更快,因为存在浮点加速器。
如您所见,即使在对图像进行大量压缩或拉伸并恢复之后,渐变仍然完美无缺。
在上述示例中使用“ImageMagick 示例前言和索引 | |
ImageMagick 命令行处理
为什么命令行样式发生了改变! 或者...
以前版本的 IM 的问题
在 ImageMagick 的早期版本 (版本 5.5.7 及更早版本) 中,IM 库的命令行接口一直存在与执行操作的顺序相关的问题。它非常杂乱,而且对于任何试图弄清楚实际情况的人来说都很混乱。此外,以前有效的东西可能在其他时候以相同的顺序无效,因为 IM 的作者一直在不断地与接口作斗争,以使其按人们期望的方式工作。问题的根源在于 ImageMagick 遵循了相当标准的 UNIX 命令行样式...-
command [options] input_image output_image
-
command [options] image1 [options] image2 [options] output_image
-negate
”,“-resize
”和“-crop
”等,可以出现在其要应用到的图像之前或之后。例如,在版本 5.5.7 下,以下两个命令是同样有效的,并且执行相同操作。
magick -negate image.gif output.gif magick image.gif -negate output.gif |
magick -size 40x20 xc:red xc:blue \ -append -rotate 90 append_rotate.gif |
-rotate
”操作将在“-append
”之前应用,这可能不是用户想要的。在 ImageMagick 版本 6 中,操作符将始终按用户在命令行中给出的顺序应用。
因此,IMv7 中的先前示例将导致:首先将两个图像拼接在一起,然后将结果旋转;产生这样的结果...
如果用户实际上打算在拼接之前进行旋转,他可以明确地要求 IM v6 以这种顺序执行。
magick -size 40x20 xc:red xc:blue \ -rotate 90 -append append_rotate_bad.gif |
IMv7 命令语法
请注意,在至少读入或创建一张图像之前,不应该给出任何“操作”。实际上,您可能希望将“图像读入/创建”也视为一种操作。毕竟,它确实是图像处理操作,即将文件中的图像转换为内存中的图像。因此,在 IMv7 中执行此操作的正确方法是读入图像,处理,然后使用最后的“隐式写入”参数写入结果。也就是说...-
command "image" { -operation }... "output_image"
-
command { [settings] [operation] }... "implict_write"
{...}
”部分使用您想要或需要的“读取”或“操作”重复,而“[操作]
”部分是图像读取或创建,或者实际“执行某些操作”的图像处理操作。您将按您想要处理图像的顺序执行它们。选项类型 - 操作符和设置...
以下内容的摘要现在也可以从 ImageMagick 网站 上的 命令行的解剖 中获得。所有命令行选项现在将分为两个基本组:“设置”和“图像操作符”。设置保存信息,操作符实际执行一些操作。设置选项 | |
是仅保存信息的命令行选项,这些信息将在以后由其他“图像操作符”使用。也就是说,它们除了设置一些以后要使用的值之外,什么也不做。许多选项都有“- ”和“+ ”样式。后者通常用于关闭设置或将其重置为其正常的默认状态。这使您可以快速简便地消除设置的影响。例如,“+gravity ”将使重力设置返回到初始的“gravity none”状态。设置可以进一步分为几个子类别... 操作符设置控制以后的操作符如何运作。它们设置颜色和字体,这些颜色和字体可能被操作符使用,控制图像和文本的放置位置,从源图像中查找颜色,控制一些更复杂操作符的处理方法,等等,等等,等等。
大多数设置选项属于此类别。 输入设置专门用于控制创建的图像,这些图像是从文件或管道创建的或读入的。它们通常用于分配或覆盖与图像关联的特定元数据,这些图像是在定义该设置之后创建的或从外部文件读入的。
请记住,它们仅在创建或读入图像时应用,否则完全被忽略。特殊操作符“-set ”用于更改图像的元数据,这些图像已读入内存或以某种方式处理。有关更多详细信息,请参见下文中的 元数据。 输出设置仅在将图像写回磁盘或保存到磁盘时使用。虽然它们可以在命令行中的任何位置给出,但它们仅在写入图像时应用,无论是作为默认的最后一个图像文件名参数操作,还是通过“-write ”或“-identify ”操作。
如果未设置或关闭 (使用它们的加号“+ ”形式),将使用适当的默认值。通常,此默认值是来自最后读入图像的保存值。一些“操作设置”,例如当前的“-background ”颜色,也会分配给图像,如果文件格式要求的话。 控制和调试设置控制 IM 通常如何执行其任务。这些包括...
有关这些特殊设置的更多信息,请参见下文中的 IM 操作控制。 |
|
图像操作符 | |
是会以某种方式修改图像的命令行参数。它们在看到时立即执行,并且可以使用先前在命令行中给出的其他“设置选项”。这些操作符可以分为几个子类别... 图像创建操作符将从文件或管道中读取图像,或生成新图像。这些包括...
作为“操作符”,它们在命令行中被看到时也会立即执行。它们只会将新图像添加到内存中已有的图像中,但不会触及之前已读入的图像。当然,作为操作符,任何之前定义的“设置”都会应用于它们。尤其是输入设置,用于控制来自文件或文件流的输入。例如 "-size ",它暗示了你想要创建的图像的大小,或者设置定义或覆盖图像元数据,例如 "-delay " 和 "-page "。 简单的图像处理操作符将修改所有已读入内存的图像。每个图像将独立于其他图像进行修改。它们包括以下操作...
因为所有图像操作符都在命令行中被看到时立即执行,所以它们必须在要对其进行操作的图像读入内存后给出。如果存在多个图像,则所有图像都会被操作,一次一个,按顺序进行。因此,你必须注意当前图像列表中有哪些图像。请注意,某些操作符可能会生成多个图像。例如 "-crop " 可能会生成多个图像“切片”,或者 "-separate ",它将图像拆分为单独的通道图像。因此,你最终可能会在内存中拥有更多图像。但它们都只接受一个图像作为输入。请注意,许多 API 仅将等效操作应用于给定图像列表中的第一个图像。也就是说,它们可能不会循环遍历每个图像。但是,"magick " 和其他 CLI(命令行界面)命令会依次将操作符应用于当前图像列表中的每个图像。 多图像列表操作符很特别,因为它们将整个当前图像列表作为一个实体进行修改。它们可以将整个列表替换为一个组合图像,或者根据之前或之后找到的其他图像修改每个图像。它们用于 Alpha 合成、动画处理、颜色通道处理等...
请记住,整个列表被视为一个实体,一些图像可能会被删除或替换。大多数上述操作符将所有给定的多个图像合并到一个最终的单个图像中。图层合成 方法是目前唯一会将当前图像列表拆分为两个完全独立的图像列表的操作符,然后将它们合并在一起形成一个全新的图像列表。它通过查找当前图像列表中的某个位置的特殊 "null: " 图像来进行拆分。这些操作符都不能用于 "mogrify " 命令,因为该命令将一组输入图像(在最后给出)作为单个图像进行处理。 图像堆栈操作符会影响当前内存中图像列表的排序。具体来说,它们提供了对图像的特殊“旁路”处理。它们在许多方面与之前的 图像列表操作符 类似,但它们不会实际修改图像本身,而只是修改它们在内存中的排列方式。
请注意,括号 "( " 和 ") " 可能需要反斜杠或引用,以防止命令行外壳界面 (CLI) 对其赋予任何特殊含义。这些操作符都不能用于 "mogrify " 命令,因为该命令将一组输入图像(在最后给出)作为单个图像进行处理。 其他特殊操作符是执行一些非标准或不寻常操作的操作符(与上面列出的操作符相比)。
"-geometry " 操作符很特别,因为它是在图像列表中仅影响一个图像(最后一个)的操作符,而不是以某种方式影响所有图像。它只为向后兼容性和特殊的 Alpha 合成需求而提供。有关更多详细信息,请参阅 几何图形,仅调整最后一个图像的大小。另外两个 "-version " 和 "-list " 是生成信息的运算符,并导致 IM 在返回请求的信息后显式退出。有关这些选项的更多信息,请参阅下面的 IM 特殊控制。某些选项甚至可能导致整个命令多次运行。基本上,它们以某种奇怪和不寻常的方式进行特殊处理。通常,这些选项只在特殊情况下使用,或者用于恢复特定的全局信息。 |
设置以某种方式保存,以便以后使用,
而操作符则立即应用于图像。
这就是 6.0 版本与 IM 的所有先前版本不同的原因。所有选项都被定义为“设置”或“操作符”,并且它们的顺序将决定何时以及将选项应用于哪些图像。可以参考 IM 示例选项参考 来确定哪些是“设置”,哪些是“操作符”。而操作符则立即应用于图像。
IM 命令的工作示例
让我们看一个示例,以及 IM 6.0 版本如何处理它。
|
参数 | 执行的操作 | 图像 | ||||
|
||||||
magick |
初始化并创建一个空的“图像列表”。 | empty seq | ||||
eye.gif |
读入图像并将其添加到当前图像列表的末尾。 | 1 张图像 | ||||
news.gif |
将第二张图像添加到列表中(现在有 2 张图像)。 | 2 张图像 | ||||
-append |
获取当前列表中的所有图像,并垂直追加。 所有图像都被一个单一图像替换。 |
1 (合并) | ||||
storm.gif |
将另一张图像添加到图像列表中。 | 2 | ||||
tree.gif |
再添加一张。 | 3 | ||||
-background skyblue |
设置稍后使用的“背景颜色”。 对任何图像都不做更改。 |
3 | ||||
+append |
将列表中的所有 3 张图像水平连接。 当前的背景颜色用于填充空缺部分。 |
1 (合并) | ||||
result.gif |
由于这是最后一个参数,因此会执行隐式的 -write 操作,并使用此参数进行操作。使用给定的文件名写入当前列表中的单个图像,这也设置了要使用的图像文件格式。 |
已写入 |
传统命令行样式
由于许多非常旧的 IM 脚本使用如下形式的单个图像操作符的命令...-
command -operator input_image output_image
-
command input_image -operator output_image
|
|
IM 7.0 版本将继续支持遗留,其中包含一个允许对命令行进行单遍处理的命令。这使得它可以从脚本文件甚至管道中实际读取图像处理选项。但是,单遍处理技术不允许在读入要应用的图像之前保存操作符。实际上,如果你尝试在内存中没有图像的情况下使用操作符,"magick " 命令会产生“无图像”类型的错误。 |
命令行与 API
命令行 IM 与使用 Magick API(例如 PerlMagick、RMagick、PHP IMagick 和 MagickWand)之间存在一些主要区别。- 只有一个活动图像列表
- 命令行一次只能处理一个图像列表。您可以将图像列表暂时“推送”或保存(参见 括号 和 MPR:命名内存寄存器)。您甚至可以从上次“推送”的列表中“克隆”(进行高效复制)图像。但是您不能同时真正处理两个这样的列表。另一方面,其他语言 API 允许您拥有任意数量的独立图像列表或“魔杖”。实际上,您通常将每个图像保存为独立的魔杖(图像列表和设置),以便更好地处理,并且仅在需要时或作为最后一步的一部分将图像合并到列表中。您还可以按任何顺序处理它们,并将它们存储到数据库或其他数据结构中,以进行排序或以后比较。但是,在命令行中,单个图像列表意味着您不能以任何顺序执行操作,而通常尝试以更合乎逻辑的顺序执行操作,在您进行的过程中完全完成每个图像处理步骤。基本上,这意味着使用来自一组操作的结果来选择或修改应该执行的下一组处理操作,要“返回”或稍后更改某些内容要困难得多。将两个完全独立的图像列表合并或交错(混洗)成一个逻辑整体尤其困难。但是,已经制定了一些技术,允许您从命令行执行此操作。例如,请参见 图像列表的多层 Alpha 合成。
- 直接访问像素数据
- 同样,您可以从命令行进行一些像素数据的数学处理和合并,但您不能轻松地查找属性,或使用命令行界面读取和修改特定像素或区域。您可以使用特殊的 FX 图像运算符 合并和数学修改图像的像素数据,但它通常限于转换整个图像,并且非常非常慢。为了使它更容易,用户使用 FX 运算符开发的许多常见操作现在已内置到 IM 中,从而创建了诸如 颜色查找表、评估数学函数 和 多参数函数 之类的东西。以及 通用图像扭曲运算符 和一些特殊的 图像合成方法。API 可以以更直接的方式操作图像,使您能够更容易地DIY独特的操作,并以 API 语言提供的全部速度执行操作。
- 条件处理
- IM 命令行界面不能轻松地根据某些图像派生的属性修改图像。例如,根据图像是否使用浅色背景或深色背景来以不同的方式处理图像非常困难。是的,您可以使用 FX 图像运算符 执行一些有限的和特定的条件操作,或要求 IM 根据某些条件调整(旋转)图像的 方向,或在 调整图像大小 时仅缩小而不放大。但这些仅处理特殊的、众所周知的和常见的处理条件。执行条件处理的唯一真正实用的方法是使用单独的命令和临时文件。有关此示例,请参见评论良好的 拼图脚本。另一方面,API 可以执行这种类型的条件处理,同时将所有相关的图像保存在内存中,准备根据特定条件继续处理,并在您需要时进行处理。
- 循环处理
- 您也不能简单地以受控的方式循环遍历图像,也不能轻松地根据序列中正在处理的图像来修改过程。也就是说,您不能简单地根据图像“场景”编号或先前图像的结果对每个图像执行不同的操作。例如,以不同的尺寸绘制文本,或逐渐模糊图像,或在一个命令中生成动画列表。是的,您可以修改图像列表中的特定图像。例如,请参见 动画的逐帧修改。但是您必须知道图像列表中包含多少图像,并“展开”循环以分别处理列表中的每个图像。从命令行循环遍历图像的唯一真正实用的方法是将各个图像写出为单独的图像文件(参见 写入多个图像),并在外部脚本化循环中一次处理一个图像。例如,请参见旨在 垂直分割图像 的 shell 脚本。或者,您可以使用 shell 脚本循环生成图像,并将结果传递到最终命令中以将它们合并到最终图像或图像序列中。有关此示例,请参见 分层图像示例 或各种 扭曲图像动画 shell 脚本生成器。但是,API 对循环遍历多个图像没有问题,无论是单个图像列表,还是多个图像列表,甚至是整个图像列表数组或数据结构。它还可以将所有图像保存在内存中,准备进行最终组合步骤,而无需管道处理或使用临时文件。
magick conjure
”程序(见下文)最初旨在允许更好地脚本化使用 ImageMagick,从而允许使用多个图像列表。对 IM v7 “magick
” 的改进使得这种实验性 API 逐渐被淘汰,尽管它仍然可用,并且仍在开发中。参数处理
除了命令行上的文件名和选项之外,还有一些基本类型的选项参数被使用。- 常量名称 (用于特定的设置和方法类型)
- 常量名称列表 (例如两种颜色或通道)
- 几何参数 (一个特殊格式化的带标志的数字列表)
- 浮点数列表 (有时带有 百分比转义)
- 自由格式文本字符串 (带有 百分比转义)
常量名称
常量名称是用于查找内部库中允许的特定字符串常量,该库中包含选项可能使用的设置。例如,“-gravity
” 设置可以采用九种不同的设置。设置后,该设置将被命令行中该设置后的所有图像处理运算符使用。例如:设置如 'North
'、'East
' 或 'NorthEast
'。您可以使用 列表操作选项(见下文)获取所有有效设置的列表。例如,使用以下命令...
magick -list gravity |
-list
” 输出中的大写字母指定)可以包含额外的空格、连字符或下划线,这些空格、连字符或下划线将被简单地忽略(但仅在词之间)。因此,以下所有参数对于设置“North East” “-gravity
” 都是有效的...- '
NorthEast
', 'northeast
', 'NORTHEAST
', 'NorTheAst
', 'north east
', 'north-EAST
', 'NORTH_EAST
', 'North East
', '___North___East___
'。
Nor The Ast
' 的参数无效,即使所有字母都正确,因为它在设置的声明词中使用空格。这些常量名称不仅用于设置,还用于声明某些更复杂的图像处理运算符(如“-layers
”、“-distort
” 和“-morphology
”)中使用的操作方法。一些常量名称从外部配置文件中读取。例如,颜色名称,例如“-fill
”、“-stroke
”、“-background
” 和“-mattecolor
”。或者“-ordered-dither
” 使用的特殊“阈值”映射。同样,“-list
” 可用于查找当前安装的 IM 版本知道的名称。 常量名称列表
这是一个不太常用的参数,最常用于需要一种或两种颜色的设置,例如 按颜色进行电平调整。“-level-colors
” 选项可以采用以下任何参数样式。
color color1,color2 color1-color2
它也用于图像选择,用于利用多个图像索引的操作,例如 复制 和 克隆。索引从第一个图像的零开始,而负索引可用于表示从图像列表末尾开始的图像索引。例如,'-2-1
' 表示取倒数第二个图像(索引 '-2
')到第二个图像(索引 '1
')。是的,这实际上意味着按指定的相反顺序取图像!另一个大量使用此功能的选项是 通道选择,您可以在其中指定一个包含特定名称的通道列表。例如:'Red,Green,Blue,Black,Alpha
'。但是 通道设置 也可以使用使用单个字母字符串的简写(例如:'RGBA
') 几何参数
这是最常见的选项参数形式,通常用于为各种操作指定大小、矩形和偏移量。但它也被任何需要 1 到 5 个数字列表的选项使用,无论是整数还是浮点数。例如,诸如“-crop
” 和“-resize
” 之类的选项将使用几何参数的完整语法,而诸如“-border
”、“-level
” 和“-gamma
” 之类的选项可能仅使用几何语法的一小部分。这种类型的参数非常普遍,因此专门针对 magick 编写了一个特殊的(且复杂的)解析器,以将这些字符串参数解析为数字和标志,供需要几何参数的任何运算符使用。几何参数基本上允许用户指定包含最多 5 个浮点值的单个字符串参数(尽管大多数运算符仅使用整数)。以下所有字符串形式都由几何参数解析器理解...
WxH+X+Y WxH +X+Y A A/B/C A,B,C,D,E
用户可以使用以下任何形式指定少量数字,但通常使用哪种形式取决于参数用于的操作。前几种通常用于指定特定大小和位置的矩形,或仅用于某种目的的偏移量。偏移量始终解码为不同的数字,这些数字位于字符串中“x”两侧。也就是说,"+X+Y
" 始终被解码为第三个和第四个数字,同时它标记第一个和第二个数字未定义(或为零)。最后几种形式最多允许 5 个可能的输入值,通常用于为标准 RGBKA 图像通道中的每一个指定一个值。除了这些数字之外,解析器还会报告是否存在任何特殊的“标志”字符(任何“%
”、“^
”、“!
”、“<
”、“>
”)。但是,解析器只报告是否存在字符。它不会报告字符在参数中的位置。例如,IM 不会记住“%
”附加到哪个特定数字。它也不会报告字符是否出现多次。这意味着几何参数“%50
”与“50%
”具有完全相同的含义,尽管后者更便于阅读。同样,“50%x30
”实际上可能表示“50%x30%
”,而不是图像宽度的 50% 和 30 像素高,正如你可能认为的那样。由于几何参数可以包含特殊的“% ”标志,因此目前无法使用 百分比转义 来根据图像属性设置其值。有一个关于何时扩展百分比转义的 未来提案,可以解决几何参数的这个问题。希望它将成为 IMv7 的一部分。 |
浮点数列表
如果需要超过 5 个浮点数,甚至可能是未知数量的值,则使用 **浮点数列表** 参数,尽管目前这些参数通常由各个选项解析,因为它们在不同选项之间可能略有不同。通常,它们由一个字符串(通常用引号引起来)组成,其中包含以逗号或空格分隔的浮点数。 扭曲操作符 可能是使用浮点数列表的最著名操作符。其他操作符包括 用户定义的形态学和卷积核,尽管它也具有定义数字数组(核)的特定语法。浮点数的一种变体由 "-sparse-color
" 使用,允许你用颜色替换一些浮点数。在内部,当将生成的数组传递给核心库函数时,它们仍然转换为浮点数。自由格式字符串
其他选项只接受一个字符串作为参数。无论是生成标签、注释文本还是保存为图像元数据。这些通常将包含 百分比转义,这些转义将在字符串使用之前在某个时间点被替换(替换)。它可能是一个立即替换,或者替换可能在稍后执行,就在实际使用参数之前。(参见下面的 延迟百分比转义。带百分比转义的参数
由于其性质,最后两种类型参数通常会被预处理,以便扩展字符串中的 图像属性百分比转义。这意味着特定的字符序列将被扩展(字符串被替换或替换)为其他字符串,或者从正在处理的图像中查找或计算出的值。这通常是在操作符将参数实际应用于特定图像之前完成的,以便可以使用特定于该图像的设置。如果参数中允许使用百分比转义,则可以以 '@
' 为前缀,以便从给定的外部文件(或标准输入)中读取整个参数。例如,'@filename
' 将被替换为文件 'filename
' 的内容。如果发生这种情况,不会应用百分比或其他特殊转义。也就是说,从文件读取的字符串将被视为字面量,并在不修改的情况下使用。警告:该文件可以是任何东西,包括程序可能可读的系统和密码文件。因此,web 用户应该事先检查输入字符串是否属于这种情况,或者更确切地说,使用 '@filename ' 子句将该字符串馈送到 IM,作为一种安全措施。 |
\n
' 字符串都将被替换为 '换行' 字符,任何以 '%
' 为前缀的标签都将被替换为相应的值。有关替换的完整列表,请参见 图像属性百分比转义。在参数中使用百分比转义,意味着对于越来越多的允许使用此类转义的操作符,例如 "-set
"、"-sparse-color
"、"-distort
" 或 "-morphology
",你可以根据各种图像属性和元数据生成参数。ImageMagick 版本 7 允许在几乎所有参数中使用百分比转义(IMv7 的一个关键特性!)。不仅如此,你甚至可以根据图像的内容或索引计算不同的参数!你甚至可以使用每个图像或预定义的全局设置预先计算一些复杂的设置。在 IM v6.6.9-0 之前,百分比转义,更具体地说,涉及图像索引的 FX 百分比转义,例如 '%p '、'%n '、'%[fx:t] ' 和 '%[fx:n] ' 存在问题。它们通常只会返回无用的值 '0 ' 或 '1 ',而不是当前图像列表中的实际索引和图像数量。 |
延迟百分比转义
请注意,对于某些设置选项,百分比转义 不会在它们被看到时立即扩展,而只是以给定的形式存储。只有在实际使用文本时,才会扩展字符串中找到的任何 百分比转义,当最终知道将它们使用的图像时。也就是说,这些选项必须延迟 百分比转义 的替换,直到实际使用参数。这些选项包括 输入设置,例如:"-label
"、"-comment
",以及 "-format
" 设置和全局 "-define
" 值。这意味着你可以在实际读取要应用于它的图像之前很久就指定一个包含图像特定 百分比转义 的 "-label
"。只有在实际将标签附加到图像时(在读取图像之后),才会扩展 百分比转义,以便它可以使用正在应用标签的图像的属性。更广泛地使用 百分比转义 的主要限制是,它目前只应用于有限的选项参数集。例如,我们目前无法将它们用于 几何参数,这些参数也使用 '百分比' 字符,但用于不同的目的。 这个问题是 IMv7 将要解决的主要问题之一。 |
ImageMagick 命令
虽然这些 ImageMagick 示例页面的大部分内容都使用 "magick
" 命令来处理图像,但还有许多其他 ImageMagick 命令,我将在本文中简要介绍。但是,其中一些命令无法在网页上正确演示。但是,我将尝试在此提供有关这些命令的提示和技巧,即使我无法在此直接显示它们的输出。Convert -- 转换和修改图像
"magick
" 命令是 ImageMagick 的主要工作马,因此这些页面中的几乎所有示例都使用此命令。因此,我不会在此过多介绍此命令的使用,而是看看一些历史。当 IM 首次创建时,该命令的最初目的是将一种图像格式的图像转换为另一种格式。事实上,它仍然用于此目的,这也是它被称为 "magick
" 的原因。因此,该命令甚至可能不会将图像读入内存,而是可能使用 IM 本身之外的辅助 委托 程序来直接进行转换。但是,随着时间的推移,这种完全外部化的方面已经不再使用,也不需要,除了作为读取和写入复杂图像文件格式的一种方式。在很长一段时间内,添加了一些额外的图像处理功能,以便在图像格式之间转换时对图像进行小的更改,甚至是对同一格式进行小的更改。这些通常是简单的选项,但从 IM 版本 5 开始,这些处理功能的使用已经变得非常广泛,并且 "magick
" 命令比仅仅图像转换更为重要。随着选项的增加,多个选项开始被使用,选项的顺序开始产生奇怪和不可控的结果。对于用户来说,当使用多个图像处理选项时,IM 被认为是不稳定和不可控的,并且开始不受欢迎。IM 版本 6 将图像处理从简单的 '选项' 样式切换到 '按你所见进行' 的样式,因此,图像处理功能变得稳定、可预测,并且 IM 的命令行功能变得更加有用,其数量级高得多。因此,"magick
" 不再是关于将图像从一种格式转换为另一种格式,而是作为访问图像处理功能的命令行 API,以非常复杂的方式创建和修改图像,而无需学习图像处理学位或使用计算机语言(如 Perl、PHP 或 C)进行编程。当然,一些 shell 脚本知识会有所帮助,但不是严格要求的。identify-- 打印 IM 所看到的图像的详细信息
"identify" 命令旨在以简单且有用的方式返回有关图像的信息。默认情况下,它输出一个简单的紧凑摘要,详细说明图像名称、文件格式、图像大小、虚拟画布大小和偏移量、颜色深度、内部格式类型,以及如果已知,则以人类可理解的方式显示图像在磁盘上的原始大小。例如...请注意,上述结果中的 '8c
' 不是图像中的颜色数量(实际上是 6 种),而是 '伪彩色' 调色板大小(有关实际颜色数量,请参见后面的示例)。还要注意,图像 '虚拟画布' 的大小与实际图像相同,偏移量为零,这意味着它当前未使用。添加 -verbose
(操作控制)将生成有关 IM 所知或可以轻松计算的图像的尽可能多的信息。这包括颜色统计信息、颜色计数、配置文件信息、图像的内部图像保存类型等等等等。但是要注意,输出确实是... 详细的!可以使用 "-format
" 设置和 IM 特殊的百分比 ('%
') 转义来以特定方式获取和输出特定信息,以输出 图像属性。但是,通常你需要指定一个 EOL(UNIX 或 MacOSX 下的换行符)作为该参数的一部分(在 IM v6.8.5-8 中更改)。例如,你可以只提取图像中颜色数量的计数。
在 IM v6.8.5-8 之前,"-format " 会自动在输出中添加换行符,以分隔多个图像结果。现在不再这样做,因此您可能需要在 "-format " 字符串中添加您自己的适当的 EOL 字符。 |
识别,是 Ping 还是不 Ping
IM "magick identify
" 默认情况下只读取图像的最小基本信息,使用一种称为 "-ping
" 的技术。这意味着 identify 只读取足够多的图像文件来确定简单的图像信息,例如大小,而不会尝试将整个图像读入内存。请参见下面的 Ping,操作控制。这是 "magick identify
" 相对于 "magick
" 的一大优势。但是,大多数图像元数据将不可用。例如,来自 PNG 图像文件的图像标签。例如,这里我创建一个带有“标签”的图像,并尝试使用简单的格式设置来打印该标签。但是,这只会发生在非常特定的情况下。任何 "-format
" 具有更复杂的转义符,将自动禁用最小“ping”读取的使用。或者,您可以专门禁用此最小“ping”读取,并强制 identify 读取“全部”图像,以便获取所需的信息。通常您不必过分担心它。除非您正在处理非常大的图像,例如照片。 Identify 作为浮点数计算器
您可以使用 FX 转义表达式 进行一些浮点数学运算...请注意,数学运算甚至不需要与图像本身相关,允许您将 IM 用作脚本中使用的简单浮点计算器。由于我们只需要基本信息,因此我们使用了 Ping 控制来阻止 identify 读取整个图像。在这种情况下,它对结果没有影响,但可以极大地加快命令速度。关于 Identify 的额外说明
- 特定格式详细信息
- 通常 IM 会将图像读入内存(本质上是读入自己的内部数据格式),使用各种图像库 API 和代理程序,然后使用 identify 输出它看到的結果。也就是说 "
magick identify
" 分析它已读入并存储的图像/数据内容。它不会分析特定文件格式如何存储或处理图像数据。这很重要,因为特定文件格式可能存在 "magick identify
" 不会报告的非常具体的方面。例如,虽然它列出了 GIF 图像颜色表中每个图像的内容(多个图像是可能的),但它不会告诉你文件中的所有图像是否共享同一个颜色表。如果您需要有关特定图像文件格式的特定信息,最好使用专门为此格式设计的工具。例如 "giftrans" 用于 GIF 文件格式,而 "jpegtrans" 用于 JPEG 文件格式。 - 颜色直方图输出
- 请注意,如果图像的颜色超过 1024 种,则详细输出中将不包含直方图或颜色表。要强制生成此信息,您可以使用特殊的 '
histogram:
' 文件格式,该格式将所有内容包含为一个大型图像注释。 - 退出状态
- 如果遇到损坏的图像并且您添加了 考虑警告控制,则 identify 程序将返回非零退出状态。
error=`magick identify -regard-warnings image 2>&1 >/dev/null;` if [ $? -eq 0 ]; then echo "The image is good" else echo "The image is corrupt or unknown format" echo "$error" fi
识别输出替代方案
从 IM v6.2.4 开始,您还可以使用 "convert
" 命令使用特殊的 "info:
" 输出文件格式生成识别输出。您可以使用 写入操作符 在一系列操作的中间写入 "info:
",例如作为调试工具。您还可以将其写入特定文件(或文件流)。一个更简单的方法是使用 "-identify
" 选项写入正常的“标准输出”。这也可以与另一个选项 "-print
" 组合使用,以输出其他信息。"-identify
" 和 "-print
" 之间的主要区别在于,第一个将对内存中的每个图像运行一次,而第二个将只运行一次。这意味着我们可以完全在单个 ImageMagick 命令中生成我们想要的关于内存中图像的任何文本文件。例如,这里我生成与我在上一示例中使用的同一组图像的 HTML 文件...
|
magick
" 命令的“标准输出”。除非您之前重新定向“标准输出”,否则您不能专门输出到其他“管道”或特定文件。使用 "info:
" 写入输出将允许您将输出定向到特定文件,就像您可以定向到图像文件一样。您还可以将输出定向到先前准备好的文件描述符,使用特殊的 "fd:
" 输出文件格式。当然,这将对每个图像写入一次,因此可能需要对图像进行一些调整才能使其只输出一次。 Mogrify -- 就地批处理
"magick mogrify
" 命令在许多方面类似于 "magick
",只是它旨在 *就地修改图像*。也就是说,它的主要目的是一次读取一个图像(或动画),并对其进行修改,然后将图像保存回图像读取的 *完全相同的文件名*。正因为如此...
Mogrify 很危险,因为它很容易破坏原始图像!
因此,在您进行任何最终操作之前,请使用图像的单独副本测试 "magick mogrify
"。不要在没有备份的原始图像上使用它。现在,虽然 "magick mogrify
" 通常会将修改后的图像保存到相同的文件名,但它有两个特殊选项允许它将图像保存到不同的文件。 "magick mogrify
" 特定设置 "-format
" 定义了在保存文件时要使用的不同格式和后缀。因此,像这样的命令...
magick mogrify -format jpg *.png |
在使用 Mogrify 之前请思考并检查
或者您可能会发现您刚刚覆盖了一些您想保留的东西。从 IM v6.2.0 开始,您还可以使用新的 "-path
" 选项来指定要输出处理图像的不同目录。这使其更安全,但它仍然会覆盖该目录中可能已经存在的任何相同名称的图像。此外,该目录中留下的任何旧图像都不会被删除。因此,您可以使用 IM 将结果(例如图像缩略图)保存到现有子目录中,例如...
magick mogrify -path thumbnail-directory -thumbnail 100x100 * |
在 IM v6.3.4-3 之前,"-format " 和 "-path " 设置是互斥的。从该版本开始,您可以更改格式和输出目录位置。 |
magick mogrify
" 命令的多图像处理功能,它无法使用任何 多图像列表操作符 或 图像堆栈操作符。这意味着您无法在 "magick mogrify
" 命令中使用图像处理操作符,例如 "-fx
"、"+swap
"、"-composite
"、"-append
"、"-flatten
" 和 "-layers
"。由于某些设置选项需要在第一个图像读入之前设置(例如 "-size
"、"-label
" 和 "-density
"),因此这些选项将在第一个图像读入之前进行处理和设置。在此之后,每个图像都会被读入,并在保存图像和读入下一个图像之前按命令行顺序对其应用操作符。务必牢记这一点,因为如果您稍后在序列中更改这些设置之一,您可能会使 IM 忘记以前的设置。例如..
|
-size
" 输入设置决定,第一个较大的设置被完全忽略。另一方面,操作设置 "-font
" 为每个 "-annotate
" 操作正确设置。这种额外的复杂性意味着可能最好...
简单地修改图像。
不要尝试使用 "magick mogrify
" 在批处理操作中执行非常长且复杂的 "magick
" 式操作,它可能会出现“设置”问题。如果您真的想进行复杂的处理,请编写一个 shell/dos/perl 脚本,使用 "magick
" 一次处理一个图像,或者转到 ImageMagick API 接口。有关使用脚本修改大量图像的示例,请参见 高级 ImageMagick 示例。请记住,"magick mogrify
" 是一个危险的命令,应始终在备份图像上进行彻底测试,然后再投入生产。实际上,我还建议脚本包含对 "magick mogrify
" 等内容的快速“测试”,以确保该命令不会破坏任何东西(由于版本更改或计算机安装差异)然后再处理大量图像。也就是说,进行一个小型的“测试用例”,如果它无法生成正确的图像,就中止,然后再继续。这实际上对于任何大型图像处理项目都是一个好主意,以便保护用户免受意外后果。我在 IM 示例中自己做了这件事,它为我节省了很多麻烦。 使用 "magick mogrify
" 进行 Alpha 合成
由于 "magick mogrify
" 无法使用 多图像列表操作符,因此它无法轻松地使用 Alpha 合成 来覆盖徽标或蒙版图像。这有一个例外,使用 "-draw
" 执行图像 Alpha 合成。这允许您将第二个图像指定为操作符参数的一部分,位于当前图像列表之外。例如,这里我首先使用特殊的 "cp_perl
" 脚本创建想要处理的原始图像的副本。然后我创建一个临时圆形“蒙版”图像,然后我使用 "magick mogrify
" 和“Dst_In
” Alpha 合成方法从所有这些图像中剪切出圆形形状。
|
magick mogrify
”将多次读取“源”图像,因此建议您使用 IM 专用的“MPC:”文件格式来减少解码图像的开销,因为会反复读取图像。此图像文件格式不需要由 IM 解析,因为它将直接从磁盘映射到内存(对于创建它的同一台机器)。这可以节省大量处理时间,特别是在处理大量图像时。 使用 Convert 代替 Morgify
使用一种特殊的技术来修改输出文件名,使用 百分比转义(参见 文件名百分比转义),您可以将“mogrify
”替换为更通用的“convert
”命令。不仅如此,它还将为您提供对图像最终目标文件名的更多控制,并让您更好地处理多图像处理,例如合成和动画。例如,在这里,我创建了当前目录中图像的缩略图,在输入文件名中插入了“_tn
”字符串,以创建适当的输出图像文件名。
magick *.jpg -thumbnail 120x90 \ -set filename:fname '%t_tn' +adjoin '%[filename:fname].gif' |
%i
”、“%d/%f
”或“%d/%t.%e
”。当然,这些都在文件名设置中包含文件名后缀,而 IM 不会使用它,但这应该没问题,因为它与图像文件格式相同。使用“convert
”而不是“mogrify
”的真正问题是,所有图像都将首先读入内存!Mogrify 非常努力地一次只读取/修改/写入一个文件(尽管该文件可能包含多个图像)。但“convert
”不会这样做。因此,如果您不小心,很容易超出内存限制。尽管有一些方法可以解决这个问题。请参阅 读取修饰符 和 缩略图 中的示例。同样,由于所有图像都作为单个图像列表存储在内存中,因此您需要小心处理这些图像。例如,您无法直接使用 Alpha 合成,就像您通常那样,但可能需要使用专门的 多图像列表合成 来完成此工作。当然,就像使用“magick mogrify
”一样,这种使用“magick
”的方法可能很危险,因为它很容易覆盖并破坏原始图像文件。 批处理替代方案
如果使用“magick mogrify
”批量处理图像不切实际,尤其是在您复制图像而不是就地修改图像的情况下,那么使用其他非 IM 循环解决方案可能更好。这些包括...
# Use a simple shell loop, to process each of the images. mkdir thumbnails for f in *.jpg do magick $f -thumbnail 200x90 thumbnails/$f.gif done # Use find to substitute filenames into a 'convert' command. # This also provides the ability to recurse though directories by removing # the -prune option, as well as doing other file checks (like image type, # or the disk space used by an image). find * -prune -name '*.jpg' \ -exec magick '{}' -thumbnail 200x90 thumbnails/'{}'.gif \; # Use xargs -- with a shell wrapper to put the argument into a variable # This can be combined with either "find" or "ls" to list filenames. ls *.jpg | xargs -n1 sh -c 'magick $0 -thumbnail 200x90 thumbnails/$0.gif' # An alternative method on linux (rather than plain unix) # This does not need a shell to handle the argument. ls *.jpg | xargs -r -I FILE magick FILE -thumbnail 200x90 FILE_thumb.gif |
find
”和“xargs
”来进行递归或非递归文件处理。阅读它们的帮助页面。要快速入门,请参阅此 IM 讨论帖,以及指南 Xargs - 维基百科,其中包含有关所涉及的危险的信息。如果您的命令变得比这更复杂,那么可能是时候使用 shell 脚本或 API 程序来读取多个图像,收集信息,计算适当的参数并处理图像了。我还建议仔细查看“parallel
”命令(通常是“xargs
”的直接替代品)。这不仅可以让你同时运行多个命令,而且还可以通过少量的工作在不同的计算机上运行每个命令,从而允许你对大量任务进行网络分布式处理。对于 Windows 用户,我建议您参考 Windows 使用 部分,特别是 Windows,批量处理多个文件。请记住,“mogrify ”以及所有其他 IM 命令也会扩展所有包含 shell 元字符(如“*”和“?”)的文件名。这是为了允许在旧的 DOS 命令行 shell 上使用这些元字符。但是,这可能会导致错误,重复的 magick mogrify 执行,甚至可能是来自某些恶意来源的“黑客”提供的文件名。建议谨慎并全面了解安全问题。 |
Composite -- 以特殊方式叠加图像
“magick composite
”命令专门设计用于以各种方式对两个图像进行简单的 alpha 合成(叠加)。这包括限制图像组合在一起的区域,尽管可以使用第三个蒙版图像。与“magick
”不同,“magick composite
”命令是一个非常传统的命令,因为它会在实际执行其设计执行的单个图像处理操作之前读取所有选项和设置。“magick composite
”命令还提供了对一些更复杂的 alpha 合成模式的简单访问。例如“-dissolve
”、“-blend
”和“-watermark
”图像合成。如果给出了任何这些参数,它们将覆盖任何其他为该命令给出的“-compose
”设置。另请注意,“-tile
”设置的工作方式也与“magick
”或“magick montage
”和“magick display
”不同。在“magick composite
”中,这将导致叠加的图像在背景图像的整个区域进行平铺。这在其他 IM 命令中尚不可用。虽然这些特殊功能使“magick composite
”成为一个有用的命令,但 alpha 合成现在也可以在“magick
”命令中使用。(有关详细信息,请参见 IM 中的 Alpha 合成)。有关以多种不同方式叠加两个或多个图像的摘要,请参见 多对图像的合成 中的示例。有关将两个图像合并在一起的方法的更多信息,请参见 Alpha 合成 示例页面。叠加限制或“蒙版”功能也在上面的示例页面中详细介绍,在 使用合成蒙版来限制合成区域 中。Montage -- 生成缩略图数组
特殊的 IM 图像索引命令“magick montage
”也遵循与“magick
”相同的“按所见执行”样式的命令行结构。唯一的区别是,当命令结束时(除了最终的输出图像文件名参数之外),“magick montage
”将根据当前设置开始将图像列表处理成缩略图图像索引页面。这使得“magick montage
”比 IM 版本 5 中更加通用,因为您现在可以像在“magick
”中一样处理图像,然后设置所有您想要的“magick montage
”设置,并让它完成工作。有关“magick montage
”的更多详细信息,请参见 Montage,缩略图数组。display-- 图像幻灯片
“magick display
”程序旨在以循环幻灯片的形式显示图像或图像列表。它不是为精心编排和定时的图像动画而设计的,为此请使用“animate
”命令。每个图像将在适合图像大小的窗口中显示,除非其他选项(如窗口“-geometry
”,见下文)覆盖此行为。图像通常也会在棋盘格背景上显示,以便显示图像可能具有的任何透明度的效果(见下文)。请记住,这不是为显示动画而设计的,而是作为实际图像的幻灯片。因此,在脚本程序中使用 display 时,可能需要一些谨慎。图像显示时间、循环和其他选项默认情况下,除了用户使用“-delay
”设置指定的任何延迟之外,还会使用大约 2 秒的延迟。但是,您可以通过使用选项“-delay 0”使其等待用户输入(空格键)。但是,默认值可以被图像本身覆盖,具体取决于其文件格式。因此,像 GIF 和 MIFF 这样的动画格式可能会导致暂停,或者 2 秒加上图像元数据延迟设置。因此建议您始终设置一个适当的“-delay
”(请记住,“-delay 5x1
”将延迟 5+2 秒或大约 7 秒),以满足您的脚本和需求。对于“-loop
”设置也是如此。默认情况下,“magick display
”无限循环(“-loop 0
”),但像 MIFF 或 GIF 这样的图像格式可以覆盖它,以便在循环中的最后一个图像之后退出。根据您的情况,请适当地查看“-loop
”选项。请注意,“magick display
”不会处理任何 GIF 动画设置,因此帧不会被丢弃,虚拟画布大小和偏移量会被忽略。换句话说,您将看到 GIF 动画中的原始部分图像,而不是正确叠加的图像。它确实提供了“-coalesce
”选项,用于清理此类动画以用于显示目的。透明度处理
包含完整 alpha 通道的图像(例如 PNG 和 MIFF 格式)将叠加在“棋盘格”背景图案上,以便您可以看到任何半透明效果,例如阴影效果。您可以通过使用“-texture
”选择不同的背景来更改它,例如...
magick display -texture granite: test.png magick display -texture xc:black test.png |
magick display
”之前删除调色板元数据,使用以下命令来更改图像输出格式的内部样式。
magick image.gif -type truecolormatte miff:- | display - |
magick display
”选项来删除调色板。例如,使用“-coalesce
”。
magick display -coalesce image.gif |
使用 Convert 显示
另一种显示方法(除了使用“magick animate
”,请参见下文)是使用更简单的“x:
”输出图像格式(参见显示输出格式)。
magick image.png x: |
show:
”或“win:
”输出生成委托将通过运行“display
”命令在输出图像上,并在不等待该窗口关闭的情况下退出,从而完成相同的工作。
magick image.png show: |
显示输出大小
显示不会缩放图像以使其适合 X 窗口显示。窗口大小将调整以适合每个图像,除非使用“-geometry
”设置进行设置。该设置还可以用于在 X 窗口显示上固定窗口的位置。大于屏幕的图像也不会调整大小,但会溢出屏幕,显示将提供一个“滚动窗口”以让用户在图像周围滑动。在查看现代高分辨率数码照片时,这可能会很痛苦。要将显示限制为 800x600 像素区域(仅调整较小的尺寸,绝不调整较大的尺寸),请使用...
magick display -resize 800x600\> photo.jpg |
magick display -define jpeg:size=1600x1200 -thumbnail 800x600\> photo.jpg |
-auto-orient
”来更正显示图像的相机旋转,使用图像文件格式中的 EXIF 元数据。如果您不想要菜单,可以使用“-immutable
”设置“magick display
”,以便它知道不允许编辑。显示的脚本化使用
考虑到这些选项,以下是我使用“magick display
”显示复杂 shell 脚本结果的建议...
magick display -delay 0 -loop 1 -coalesce -resize 800x600\> some_random_image |
使用 X 窗口显示
选项“-window root
”可用于在 X 窗口背景(根)窗口上显示图像。在这种情况下,“magick display
”程序会自动退出。默认情况下,图像将在背景中平铺。例如,试试这个..
magick display -window root pattern:checkerboard |
xdpyinfo
”程序虽然不是 ImageMagick 的一部分,但可以为您提供这些信息。
xdpyinfo | grep dimensions: |
xdpyinfo
”的输出,将图像调整大小以完全填充 X 窗口背景。
screen_size=`xdpyinfo | sed '/dimensions:/!d;s/^[^0-9]*//;s/ pixels.*//'` magick display -resize $screen_size! -window root photo.jpg |
显示远程控制
Display 提供了一个特殊的“-remote
”选项。这将查找正在运行的“magick display
”命令,然后将给定的参数传递给它。例如...
magick display wizard: & sleep 5 magick display -remote logo: & |
magick display
”命令,则当前命令将打开一个窗口而不退出。因此,您还应该将“display -remote
”命令作为预防措施置于后台。此时,您无法请求远程“magick display
”退出。因此,关闭远程显示的最佳方法是终止正在运行的进程,或使用某些 X 窗口命令“删除”显示窗口。例如(使用非 IM 命令“xdotool
”)...
xdotool search -class "display" windowkill |
animate-- 显示图像动画
在很多方面,“magick animate
”和“display
”非常相似。但是“display
”只显示给定图像文件中的图像“按原样”,没有任何更改,在每个帧之间添加最少的 2 秒暂停以供用户输入。“magick animate
”另一方面将应用图像中保存的任何GIF 动画设置,并且只根据其“时间延迟”设置显示每个图像,循环回到开头以重复动画。换句话说,“magick animate
”会正确地“动画”动画格式,而“display
”则不会。但是,由于这一点,第一个图像的虚拟画布将控制输出图像大小,其他图像将叠加到该图像区域中。当然,随着图像的动画化,您可以使用诸如“-delay
”之类的选项对图像显示时间进行精细控制。该命令还具有一個额外的参数“-pause
”,用于在动画循环结束时添加额外的暂停,超出最终帧的“-delay
”设置指定的任何内容。例如,您可以使用“magick animate
”生成两个非常相似图像的闪烁比较,使用类似于... 的方法。
magick image1.png image2.png -scale 400% miff:- |\ magick animate -delay 50 -loop 0 - |
flicker_cmp
”,并且发现它在拾取像素强度中非常细微的差异方面非常有用,否则我会错过这些差异。compare-- 查找差异
有关此方面的所有当前信息都位于 IM 示例的图像比较页面部分。stream-- 大量图像的管道处理
“magick stream
”是一个专门用于处理提取非常大的图像文件的一部分的程序。它是 ImageMagick 中唯一这样的程序,所有其他程序在处理之前将图像完全读入内存(JPEG 图像通过“-size
”除外,因为此选项将传递给 JPEG 委托库)。您可以使用“-extract
”设置选择图像的一部分。您可以使用“-depth
”设置指定原始字节的深度。最后,您可以使用“-channel
”选项选择要提取的颜色通道。但是,“magick stream
”只输出图像的原始颜色字节(RAW 格式),如图像深度定义的那样,因此您可能需要将提取段的输出管道化到 convert 中。例如...
|
import-- 从屏幕显示中读取图像
“magick import
”命令是一个特殊的程序,可用于从 X 窗口显示中抓取和提取图像。例如,让我们让它抓取并打印您从显示屏中选择的窗口...
magick import -page A4 -gravity center ps:- | lpr |
X:
”文件格式也提供了与 magick 命令中完全相同的功能。两者之间的唯一区别是“magick import
”具有比“X:
”格式更多的 X 窗口特定设置,例如指定显示、屏幕和/或窗口 ID,要从中抓取图像。其他选项包括控制显示“蜂鸣”和重复快照。如果没有指定特定的窗口,可以使用鼠标选择用户想要作为图像抓取的显示部分。- 如果使用单击鼠标,则会抓取整个单击的窗口并将其作为图像返回。请注意,如果显示上的任何其他窗口遮挡了所选窗口的一部分,那么您将抓取一个遮挡其他窗口遮挡了所选窗口的图像。
- 单击根窗口或选择“
-window root
”将返回整个屏幕。 - 如果使用单击鼠标并拖动,则会返回整个屏幕的裁剪部分,当然这也意味着整个显示(虚拟画布或页面大小)上的位置(虚拟画布偏移)也会被返回。
xwininfo
”找到它。您还可以使用“-extract
”来缩减所选窗口的区域。另请参见特殊输入格式“X:
”作为使用“magick import
”的替代方法。Note to import from the Windows clipboard use magick clipboard:myimage image.png and not "import"
conjure-- IM 实验性脚本语言
最初旨在允许使用多个图像列表进行脚本化的 ImageMagick 使用,但 IM v6 中对“magick
”的改进使得这个实验性 API 逐渐被废弃。它是一种基于 XML 的语言。但是,如果您想要 XML,SVG 可能会更适合您的需求。在我看来,在处理多图像列表时,使用“magick conjure
”脚本可能更好、更容易。并且正在使用中,尽管使用范围并不广泛,因为缺乏示例和用户支持。图像列表...
关于 ImageMagick 最重要的一点,也是让新手和有经验的用户都感到困惑的一点是...
ImageMagick 使用的是有序的图像列表,而不是单个图像
也就是说,IM 不仅处理一个图像,而且可能处理一个有序的图像列表,无论它们是独立的图像,还是彼此叠加的一组图像,还是动画的帧。一般来说,所有图像操作符都将应用于当前列表中的所有图像。因此,如果您使用“-draw
”操作符,它不仅会在列表中的最后一个图像上进行绘制,正如许多新手所想的那样,而且还会在所有当前图像列表中的其他图像上进行绘制,并且会依次对每个图像进行绘制。图像叠加操作符,例如“-coalesce
”和“-layers
”将用根据列表中的其他图像修改的新图像替换列表中的每个图像。它甚至可能添加或删除额外的图像!此外,图像列表操作符,如“-append
”、“-mosaic
”和“-fx
”将用生成的组合图像替换当前图像列表中的所有图像。也就是说,它将销毁所有图像,除非它们之前使用括号和克隆图像保存。有关实际示例,请参见下面的图像列表操作符。最后,当读取或创建新图像时,IM 仅将该新图像添加到当前图像列表的末尾(该列表始终存在)。某些格式(如GIF)实际上可能会将多个图像添加到当前图像列表中,除非在输入文件名中添加了特殊的索引读取修饰符,以限制读取的内容。保存图像时,IM 会保存写入时内存中的整个图像列表。如果图像格式允许,IM 会将所有图像写入单个文件。如果格式不允许多个图像(例如 JPEG),它会将图像写入单独的文件(参见写入多个图像)。括号 -- 在“侧边”处理图像
随着命令行选项的正式化,处理顺序现在是完全可预测的,并且还可以在图像处理中添加括号(或方括号)。这对 IM 用户来说一直是一个期待已久的功能,它允许你在单个命令中完成以前无法完成的事情。左括号 '(
' 会启动一个新的图像列表,所有包含的操作符都会作用于它。匹配的右括号 ')
' 则将结果图像列表(可能包含多个图像,或者根本没有图像)添加到先前图像列表的末尾。换句话说,使用括号意味着...
"我需要在一个单独的图像列表中做一些工作
然后再将结果添加到先前列表的末尾."
它允许你对图像子集进行操作,就像一个草稿纸,然后将结果添加回主图像列表,而不会影响你之前已经读入或正在操作的图像。让我们看一些简单的示例...然后再将结果添加到先前列表的末尾."
|
-negate
" 操作符将两个图像都反色,因为它们当时都在内存中的当前图像列表中。但是通过添加括号,我们可以将反色操作限制在第二个图像上...
|
storm.gif
" 图像被读入到与第一个图像(由 "(
" 图像列表操作符生成)不同的图像列表中,所以可以对其进行反色,而不会影响第一个图像。然后,我们可以将结果添加到主图像列表(即 ")
" 操作符),然后像以前一样将这两个图像拼接在一起。括号必须作为单独的参数给出。也就是说,你必须用空格将它们与其他参数隔开。你不能将它们紧贴着相邻参数。换句话说,在 IM 命令行参数 " \(+clone " 中是错误的,而 " \( +clone " 是正确的。此外,在最后一个示例中,我需要在括号前面加上一个反斜杠 ' \ '。这是因为,当在 UNIX(Linux)机器上使用 IM 时,括号对命令行 shell 具有特殊意义。因此,当我使用它们时,我需要对括号符号进行转义或引用。Windows DOS 脚本不需要用反斜杠转义括号。有关此差异和其他与 Linux 脚本的差异,请参阅 Windows DOS 脚本。 |
magick
" 命令中完成以前无法完成的事情成为可能。生成图像数组!
|
magick montage
" 生成这样的数组(参见 Montage Concatenation Mode),但是使用单独的命令会使图像处理脚本更加复杂。当然,如果你想让命令看起来更像数组,你可以随意添加一些额外的括号。
|
括号和设置
选项 'settings' 不会受到括号的影响,并且会继续跨越括号图像操作符,直到设置被更改或关闭。例如...
|
-font Candice
" 设置在输入括号时没有重置回其默认设置,而第二个 "-font Gecko
" 在你离开括号时没有被原始字体设置替换。换句话说...
括号只创建一个单独的图像序列。
它们不会限制设置,只会限制正在处理的图像。
从 IM v6.4.1-4 开始,新的操作控制选项 "它们不会限制设置,只会限制正在处理的图像。
-respect-parentheses
" 可以覆盖这种行为。当在 IM 命令开头给出时,它会导致括号也保存和检索之前给出的设置。这意味着在括号中给出的任何设置都将只保持设置,直到括号结束。例如...
|
magick -respect-parentheses \ -font Arial label:"This is a line of plain text." \ \( -font Candice -pointsize 16 -fill red -undercolor lightblue \ label:"A line using a lot of different settings." \) \ label:"Text is back to normal -- like Magick\!" \ -append cmd_settings_lots.gif |
图像列表操作符
随着 IM 对图像序列的更强强调,特别是在括号中,提供了一组新的图像操作符来操作图像列表也就不足为奇了。这些操作符的参数是数字,用于索引图像列表,从第一个图像的零('0
')开始,第二个图像的 1('1
')开始,依此类推。但是,如果你给出一个负索引,则从图像列表的末尾(最后添加的图像)引用这些图像。也就是说,'-1
' 的索引是当前图像列表中的最后一个图像(通常是最后读入或创建的图像),'-2
' 是倒数第二个图像,依此类推。
-delete {index_range_list}
"-delete
" 列表操作符是图像列表操作符中最简单的,它只是从当前图像列表中删除图像。
|
+delete
" 不带参数,只删除当前图像列表中的最后一个图像。"-delete
" 操作符还接受用逗号分隔的数字列表,或要删除的数字范围。
|
|
0--1
' 参数表示从第一个图像(索引 0)删除到最后一个图像(索引 -1)的所有图像。换句话说,删除当前图像列表中的所有图像。然后添加树图像以使 IM 产生实际的结果,以避免 'no image' 类型的错误。还可以使用 "NULL:
" 输出图像来产生无输出。如果图像索引不存在,或者数字范围颠倒,"-delete
" 将会静默地忽略该特定图像的删除。例如,参数 '-25
' 将尝试删除图像列表中的最后第 25 个图像,但是如果存在少于 25 个图像,则会静默地不做任何操作。因此,你可以使用类似于以下的序列生成包含 24 个图像的滚动动画...
|
-delete
" 将不会删除导致编号范围颠倒的图像。这意味着最后一个示例可以这样重写...
|
-delete
" 将删除从第一个图像到最后第 25 个图像之间的所有图像,列表中最多保留 24 个图像。如果仅存在 24 个或更少的图像,则要删除的图像的给定范围将被有效地反转,并且 "-delete
" 操作符将不会删除任何内容。 -insert {index}
"-insert
" 操作有点类似于 "-delete
" 的反向操作。它将获取当前图像列表中的最后一个图像,并将其插入到给定索引处。
|
-insert -2
" 将 '滚动' 最后三个图像,在插入的新图像和图像列表的末尾之间放置两个图像。
|
+insert
" 将把最后一个图像移动到图像列表的开头(索引 0
),有效地将整个图像列表滚动一帧。
|
-duplicate 1,0
" 复制第一个图像,然后使用 "-delete 0
" 删除第一个图像来完成。-swap {index}[,{index}]
简而言之,"-swap
" 将交换当前图像列表中两个图像的位置。例如,"-swap 0,2
" 将交换当前图像列表中的第一个图像和第三个图像。
|
+swap
" 将交换当前图像列表中的最后两个图像。换句话说,它等效于 "-swap -2,-1
"。
|
-composite
"、"-flatten
"、"-append
" 或 "-fx
" 的图像分层操作符之前,交换两个图像。
|
-swap
" 带有一个数字,将交换最后一个图像与给定的数字。也就是说 "-swap 1
" 等效于 "-swap 1,-1
"。
|
-reverse
"-reverse
" 操作符(添加到 IM v6.3.4 中)将非常简单地反转整个图像列表的顺序。
|
-clone {index_range_list}
此图像列表操作符有点不同。给定一个图像列表数字 "-clone
" 将复制一个由 '左括号' 或 '括号' 操作符保存的图像。也就是说...
Clone 只能在括号中使用
这样做的原因是,它允许你从最后保存的(推入的)图像列表中提取一个图像的副本,以便你可以对其进行进一步处理。例如。
|
+clone
" 将只复制保存的(推入的)图像列表中的最后一个图像,以便你可以对其进行进一步处理。
|
-clone
" 操作符将接受用逗号分隔的图像列表,或 '{index}-{index}
' 形式的索引范围。
|
0
'(第一个图像)和 '-1
'(最后一个图像)指定它,即使用范围 '0--1
'。它看起来可能很奇怪,但它是有道理的,并且工作正常。
|
|
|
不带括号的 克隆图像操作符 可以直接从当前图像列表中复制图像并追加,但这不是其预期用途,应避免使用,因为如果稍后将该操作组用括号括起来,则会产生不同的结果。另外,在上面的示例中,我正在生成克隆并将它们追加到当前图像列表中,以演示该操作符。实际上,我应该使用 复制图像操作符 来复制当前图像列表中的图像。因此,您也应该这样做,因为它可以更清楚地表明您要做什么。 MPR: 图像内存寄存器也可以用来克隆图像,并且在 IM v5 中可用。它实际上仍然是克隆和存储整个图像列表(长度未知)以供以后使用的一种有效方法,而不仅仅像上述图像列表操作符那样存储单个图像。
-duplicate {count}[,{index_range}]
您可以使用 "-duplicate
" 从当前图像列表中生成图像的额外副本(克隆)(从 IM v6.6.8-7 开始添加)。新图像将添加到列表末尾。与之前的(更旧的) 克隆操作符 不同,它不需要使用括号。例如,要制作 N 个图像的额外副本(总数为 N+1),您可以这样做...
|
|
|
|
|
0
)和最后一个(-1
)图像的复制,使得图像索引为 -2
到 1
。如果您的 IM 版本早于 v6.6.8-7,您仍然可以生成重复的图像,克隆图像操作符,但一次只能生成一组图像。或者通过使用一种基本上误用 颜色变形操作符 的技术,生成多个重复图像。技巧是首先创建一个克隆来生成两个相同的图像,然后使用 "-morph
" 在它们之间生成最后 N-2 个图像。
|
组合图像序列操作
使用这些操作符,您可以提取特定图像的副本,对其进行修改,并将该图像返回到您获取它的位置。例如,这里我制作了第二个图像(图像索引“1”)的 "-clone
",将图像的颜色从蓝色旋转到红色,然后通过首先 "-delete
" 它并 "-insert
" 新的图像来替换原始图像。
|
-swap
" 来替换原始图像,然后 "+delete
" 现在位于末尾的旧图像。这只需要您两次给出图像位置,而不是三次。一次用于克隆,一次用于替换修改后的图像。
|
复杂的图像处理和调试
由于添加了 图像序列操作符(见上文),您不再需要每次都一步一步地处理图像,保存图像并重新读取它。相反,您现在可以简单地将中间图像保存在内存中并继续处理它。这节省了很多时间,包括将图像转换为文件格式的时间,以及将图像保存到速度较慢的磁盘的实际 IO。这种类型的图像处理命令可能会变得非常长和复杂。因此,最好将命令写入脚本,并尝试将每个主要操作放在单独的一行上,以便更轻松地编程和编辑。请参阅 更好的 ImageMagick Shell/PHP 脚本提示。追加 起来以输出所有处理步骤的结果,而不仅仅是最终图像。这种技术可以让您跟踪每个步骤(用括号括起来)非常复杂的命令产生的结果,并允许更容易地调试过程中的每个步骤。请注意,它只使用初始图像的大小和形状来生成按钮的初始形状,因此您可以自由地使用任何形状或图像!其余命令将像以前一样处理它。当然,您通常会 删除 所有临时工作图像。也就是说,我会将上面最后一行替换成类似这样的内容...
|
|
show:
' 代替 "display
",它将在屏幕上显示结果图像,然后允许原始命令继续或退出。有关更多信息,请参阅 显示图像输出。
|
+append
",在这种情况下,IM 将通过按下“空格键”依次显示每个图像。您甚至可以使用 "montage
" 命令以更美观的方式查看结果...
|
\( ... \)
" 语句之间插入这些行。
|
|
|
图像元数据:属性、特性和工件
到目前为止,我们已经研究了图像以及构成图像的实际内容或数据。但图像不仅仅是“图像数据”。还有许多属性或元数据也是图像的一部分,并且会影响其图像处理以及其他程序应该如何处理图像。例如,图像可以具有“偏移量”或可以是更大“虚拟画布”(页面)的一部分。也就是说,单个图像可能只是更大图片的一小部分,它由一系列其他图像组成,以形成“图层”或“动画”。IM 还附带了许多特殊的“设置”,这些设置由许多图像处理操作符用来修改它们的工作方式。例如,要使用的“背景颜色”。其中一些是全局设置,在整个图像列表中都相同,而另一些则在列表中的每个图像中可能不同。那么,图像中还包含哪些内容呢?很多东西...- 通常(但并不总是)与图像一起保存在图像文件格式中的图像元数据。例如:配置文件、标签、标题和注释,以及虚拟画布信息(页面)。这些都是每个图像的设置,并且在当前图像列表中的每个图像中可能不同。
- 许多不同的图像处理操作符使用的全局设置,但通常不与图像一起保存:颜色,例如背景色、边框色、填充色和蒙版色,还有字体、字号、重力、合成方法、颜色通道处理、颜色值的读/写位深度。
- 专家设置和定义,用于控制特定图像处理操作符更深层的底层操作。例如:失真视口、特殊合成方法参数,
- 图像实际如何在 ImageMagick 中的内存中存储:例如作为 RGB 或 CMYK。是否存在 alpha 通道,以及是否启用,以及图像在读入时可能具有的调色板。但是,其中一些存储设置是在编译时硬编码的(例如,内存中的颜色值质量)。
- 一些通用的 IM 操作设置,例如调试或详细设置,通常控制信息输出或错误处理。
- 属性
- 这些存储为每个图像的特殊数据结构项,通常是为了允许各种图像处理操作符快速直接访问。例如:图像大小、虚拟画布几何形状、背景、填充、描边、蒙版颜色、点大小、密度、字体、合成、插值、虚拟像素方法、配置文件块、时间延迟和处置设置;以及更多其他内容。请注意,其中一些是每个图像的“特定”属性,而另一些则被视为“全局”设置,该设置通过 CLI 接口设置为所有图像的相同值,即使它们仍然存储为每个单独图像的一部分。属性通常使用许多选项在正常的图像处理过程中进行修改,或者更普遍地使用 Set 进行修改。
- 属性
- 这些是一组自由格式的键值字符串,它们以个别方式附加到每个图像。每个图像可以拥有完全不同的字符串集。本质上,它们是元数据项,不需要定期访问或解码,或者以某种特殊方式使用。典型的示例包括:标签、标题和注释字符串;创建和修改日期;用户定义的字符串;一些操作符的结果。用户可以使用 Set 设置或更改这些内容,只要“键”不对应于某些已知的“属性”。
- 工件
- 这是一个全局的自由格式字符串集,在所有图像中都是通用的。它用于保存定义或修改所有图像的读取和图像处理的自由格式全局设置。一个例子是“
verbose
”设置,该设置会导致某些操作输出有关其操作的常规信息,包括更详细的 Magick identify 输出。用户可以使用 Define(见下文)或 Set 的特殊情况(见 使用 Set “Option:” 定义和工件)修改这些全局值。
设置/更改图像属性/特性
简单元数据是图像属性,通常对图像处理最为重要。因此,它们被解码并在图像数据结构中可用,以便图像处理操作符可以快速使用。此类数据通常通过两种方式进行修改。在读取或创建图像时直接更改图像元数据。或者,将元数据修改应用于已在内存中的图像。例如,“-label 'string'
”将在设置该设置之后读取或创建的每个图像中设置注释。但是,"-set label 'string'
" 将更改当前图像列表中所有图像(已在内存中)的“label”元数据。这两种方法的原因是由于历史上的向后兼容性和便利性。基本上,"-label
" 传统上是在应用该图像之前读取的。它只影响在设置或更改之后读取(或创建)的图像。例如……
|
-set
" 操作符会更改当前图像列表中的所有图像,包括之前读取的图像。因此,您通常必须使用括号来限制要将选项应用于哪个图像,除非您想将它应用于到目前为止读取的所有图像。
|
+label
" 取消定义设置,在这种情况下,将保留标签元数据,就像读取或创建图像一样。如果读取的图像也没有标签,IM 将回退到一些逻辑默认值。对于标签,它只是空字符串。您可以看到这两种方法的更详细和具体的示例 图像的蒙太奇标注,这些示例大量使用此方法来进行标注。这种设置图像元数据的“二元性”也存在于其他选项中。这包括…… "-comment
"、"-caption
"、"-page
"、"-dispose
" 和 "-delay
"。但是,虚拟画布大小和图像偏移设置(页面)还有第三种方法,使用特殊操作符 "-repage
"(见下文 虚拟画布)。例如,在这里我使用所有可用的设置方法来设置各个图像的“虚拟画布偏移”或“页面”,因为我从它们中创建了一个 动画……
|
-set
" 或专门的 "-repage
" 操作符更好。例如,要更改最后一个示例中第三个图像(图像索引为“2
”,或“tree”)的图像偏移……
|
-set
" 为所有图像指定注释,然后修改一个特定图像的示例。
|
您可以使用 "
mpr:
" 作为在内存图像中设置属性的替代方法。例如,这里我们获取内存中带有“Bad”注释的图像,并将注释替换为“Good”注释……
|
一般全局属性
正在建设中
Most of these attributes are generally set globally either before or after reading images into memory (it makes no difference). They are typically used as a general control of the later image processing operations. * Many settings are simpley globally saved for use as needed -fill -background -bordercolor -strokecolor -mattecolor -quantize +dither -channels -size -gravity -units -density -font -pointsize -tile * Some settings affect the way an image is saved to disk, or the meta-data saved with the image. This includes -loop -compression -quality -depth -density -background * -compose is awkward, as it can only be set globally. But if unset then individual images can have a different setting (for layering). Most of these however can be turned off, (using a + version) which causes the operator to retrieve the setting from image meta-data (eg: +background falls back to the original images meta-data if present) but more generally it falls back to some default value. (eg: +gravity falls back to 'None' to mean no gravity has been set). A few of these also get saved with images when written. Specifically the GIF format will save an the -background and -bordercolor as part of the images attributes, however these are normally ignored by programs which read these images. You may have noticed that some settings are used in multiple places. for example -density * used in reading in many vector format images like Postscript, PDF, and WMF image formats. * also in special image generators such as label: caption: and text: * used as part of font drawing in -annotate -draw and -polaroid operators. * And finally some formats save the density or resolution as part of the the image file format. For example postscript wrapped raster images, JPEG, and TIFF. Is it any wonder then why settings can be so confusing.
虚拟画布和 Page 和 Repage 操作符
“page”或“虚拟画布”设置在 IM 中的主要目的是定义图像的“实际”部分(实际包含彩色像素数据的部分)如何在“画布”的更大上下文中进行适应。这在涉及多个图像并且需要彼此相对定位时尤其重要,例如 多个图像的图层 和 GIF 动画。它也用于(因此得名“页面”)定义图像在 Postscript 中或生成“页面”的图像时在更大的物理纸张或“页面”上的位置 文本。虽然它最常用于 多个图像的图层 和 GIF 动画,但它也与在 裁剪 和 修剪 图像时记住图像的原始位置有关,以及在 多图像列表合成 和 一般图像失真 中有关。现在,“页面”定义了两个不同的部分:一个“虚拟画布”或区域,定义图像所在的更大空间,以及“偏移”或图像在该“画布”中定位的位置。虽然允许负“偏移”,但“画布大小”限制在从 0,0 到给定的宽度和高度的区域内。也就是说,只能指定正画布。 |
-page
" 和 "-set page
" 方法之外,还提供了一个单独的选项 "-repage
" 以便进行更精细的控制。具体来说……- +repage
- 在没有参数的情况下,将重置图像虚拟画布为实际图像本身。也就是说,只是清除图像可能具有的任何虚拟画布信息。这在应用图像子划分操作符(如 裁剪 和 修剪)之后通常很重要。在保存到 GIF 或 PNG 图像文件格式之前,删除虚拟画布大小和偏移尤为重要,因为许多浏览器使用画布/偏移信息作为图像显示的一部分。
- -repage WxH
- 更改现有图像的虚拟画布大小,但不要重置图像在该画布上的位置。请注意,向 "
-page
" 或 "-set page
" 提供此参数将重置图像位置为“+0+0
”,这可能不是想要的。 - -repage +X+Y
- 只需将图像在虚拟画布上移动到此绝对位置,而无需更改图像的画布大小。
- -repage +X+Y\!
- 通过将给定的数字(正或负)添加到图像的现有偏移位置,对图像在虚拟画布上的位置进行相对移动。
- -repage 0x0
- 尝试找到包含整个图像的最佳虚拟画布大小。但是,这将对具有负偏移的图像失败,因为没有办法指定具有负分量的虚拟画布。为了避免问题,它将使用实际图像的大小作为可能的最小画布大小。也就是说,它永远不会分配具有零维的虚拟画布。
- -repage 0x0+X+Y
- 移动图像偏移,然后调整虚拟画布大小以最佳地适应图像的新位置。
- -repage 0x0+0+0
- 等效于 "
+repage
" 或 "+set page
" 或 "-set page 0x0
"。所有虚拟画布和偏移信息都将被删除。 - -repage WxH+X+Y
- 等效于 "
-set page WxH+X+Y
"。也就是说,只需直接分配给定的值。
!
”标志将使给定的偏移量成为相对于图像当前偏移量的相对位移。也就是说,“-repage +5+0\!
”将使图像偏移量向右移动 5 个像素,而不会修改虚拟画布大小。目前无法直接指定虚拟画布大小的相对调整。但是,可以通过使用 FX 百分比转义 来完成。但这通常不需要。一个示例在 使用特定颜色修剪 中给出。在为图像提供最终的负偏移位置时要小心,因为 GIF 文件格式无法处理这种情况,并将负偏移量重置为零。此外,某些浏览器在提供具有负偏移量的 PNG 图像时会变得很奇怪。保存图像的虚拟画布信息取决于格式。JPEG | 像许多图像文件格式一样,JPEG 图像根本不保存虚拟画布信息。这些信息会被忽略并丢失。 |
GIF | 虚拟画布大小和偏移量将作为其 GIF 动画处理的一部分保存。但是,它不会处理负偏移量。任何负偏移量都将在保存时重置为零。 |
PNG | 偏移量甚至负偏移量都会保存,但 PNG 文件格式通常不保存虚拟画布信息。但是,IM 保存的 PNG 图像将包含虚拟画布大小信息,但仅供其他 IM 命令使用。如果 IM 读取没有此 IM 特定属性的 PNG 图像,它将设置图像虚拟画布为适当的大小,以确保图像在虚拟画布上可见(如 "-repage 0x0 ")。对于没有偏移量的图像,这意味着虚拟画布与实际图像大小相同。 |
-page
" 对 "text:
" 和 "ps:
" 图像生成器操作符具有特殊含义(参见 文本:多行文本文件 和 PS:Postscript 格式的文本和图形)。因此,在创建这些图像时,不会使用其正常的画布大小和偏移量含义。 设置和每图像属性
但是,IM 无法为处理图像可能具有的所有设置创建一个选项。这简直是不可能的。不仅如此,用户还经常喜欢添加或定义自己的设置。正因为如此,"-set
" 选项实际上可以定义任何设置,使用任何值。如果设置不是图像的特定已知属性(以允许操作符快速访问的方式保存),它将作为 '属性'(字符串数组)保存在图像中,并且将在详细的 "magick identify
" 输出的底部附近列出,或者使用 百分比转义 检索和扩展。例如,内置的 rose 图像会自动生成三个 '属性':两个日期字符串和一个 '签名哈希'。除此之外,我还添加了自己的用户定义 '属性' 设置。一些图像处理操作符甚至将特殊兴趣的值作为图像 '属性' 返回。它们不是其他操作符所必需的,因此不会存储为 '属性',而是保存为 '属性' 字符串,以便用户可能使用。例如,最佳拟合标签 选择的最终点大小将保存为特殊的图像属性。
|
||
|
请注意,label: 生成器本身也设置了一个 'label' 属性,该属性恰好保存为属性字符串。 |
所有 '属性' 均保存为自由格式字符串数据类型,并存储为图像元数据。 正因为如此,并非所有 '属性' 都保存为 '属性',因为许多属性需要直接保存并用作图像处理操作符的数值数据。虚拟画布 'page' 属性就是这样的一个例子。 |
-format
" 设置让 IM 输出它创建并丢弃的标签的点大小。
|
filename:
" 设置。例如...
magick rose: -set filename:my_area '%wx%h' 'rose-%[filename:my_area].png' |
rose-70x46.png
" 的图像。出于安全考虑,只有以 "filename:
" 字符串为前缀的用户定义设置才能在输出文件名中使用,尽管可以使用任何名称。有关此方面的更多示例,请参见 文件名百分比转义。 定义和全局工件
定义的值称为 '工件',在所有图像中全局定义,并使用特殊的 "-define
" 操作符设置。此类 '工件' 的主要用途是作为特殊设置,可以被 图像文件格式编码器 或 图像处理操作符 用作额外的(或带外)设置。基本上,它允许为特定要求添加自由格式设置,而无需创建另一个 '属性'。同样,由于它是全局设置的,因此它不会附加到特定图像,而是附加到图像序列中的所有图像,并且在尚未读取或创建任何图像时可用。请注意,API 可以具有多个图像列表,并附带不同的 '工件' 集,但命令行界面 (CLI) 只有一个活动的图像列表,因此 '工件' 实际上是全局的。 |
-define jpeg:size=300x200 -define jpeg:preserve-settings=1 -define jpeg:optimize-coding=true |
-define distort:scale=2 -define distort:viewport=44x44+15+0 |
-define filter:blur=0.75 -define filter:support=1.25 |
-verbose
" 操作控制(见下文),实际上等同于使用 "-define verbose
",从而创建一个 'verbose
' 工件。例如...因此,加号形式 "+verbose
" 只会删除 'verbose
' 工件,因此等同于 "+define verbose
"。工件和延迟百分比转义
工件也经常用于保存应分配给已读取的图像的特殊属性,这些属性是在定义后读取的。 "-label
" 设置也只设置一个带有用户提供的参数的工件。此工件随后在读取或创建新图像后转换为 'label
' 设置或属性。例如,使用带有标签的 "rose:
" 图像创建也就是说,"-label
" 首先定义了所示的 'label
' 工件。稍后,当 rose 图像被创建(并且其大小属性已知)时,IM 将该全局工件转换为特定于图像的 '属性',并且仅在那时扩展任何 百分比转义。这被称为 延迟百分比转义。一些其他设置选项也会发生同样的事情,例如 "-comment
" 和 "-caption
"。正因为有 延迟百分比转义,所以 "-define
" 将只保存字符串,而 "-set
" 操作符将执行扩展。使用 Set "option:" 定义工件
我们在上面展示了如何 "-set
" 特殊用途的个人 属性,以每图像为基础。例如...
|
|
myinfo
' 属性未在附加的标签中找到或包含。另一方面,全局定义的 工件 可用于图像生成器。它们必须这样,才能让图像生成器或图像文件编码器读取它们以进行各种控制设置。因此,使用 "-define
" 将按预期工作。
|
-define
" 选项目前不允许使用图像属性!诀窍是在使用 "-set
" 选项时使用特殊的 "option:
" 前缀。此添加导致 "-set
" 使用前缀后的名称定义 '工件'。例如,这等同于最后一个示例。
|
-set
" 选项将扩展 百分比转义。这意味着,如果我们有一些每图像 属性,我们可以将其转换成全局 工件。例如,这里我创建了一个标签,然后将 'label:pointsize
' 属性("label:
" 图像生成器创建的)转换成全局工件 'my_pointsize
'。作为一个工件,此信息在我创建第二个标签图像时可用。然后,我将两个标签连接在一起(用一条分隔线 'gray
' 分隔)。一个非常棘手的例子。
|
-set option:...
" 的放置位置。如果您将其放置在创建 "xc:gray
" 之后,它将用于设置全局工件的图像。也就是说,因为只有最后一个图像的属性定义了存储在全局工件中的值。原因是只有最后一个图像用于定义工件。实际上,真正发生的是 "-set
" 被应用于当前图像列表中的每个图像,即使它正在生成全局工件。因此,每个图像都会将自己的属性分配到全局工件中,替换先前分配的值。完成后,只有最后一个图像会 '定义' 工件。目前,'FX 转义' 无法读取属性或工件。因此,您目前无法对这些值进行算术运算。 |
读取和写入时的图像类型
"-type
" 操作符/设置定义了在读取或写入图像时要使用的样式或颜色空间,以确保生成的图像(在内存中或图像文件中)是您期望的。作为此过程的一部分,它可能会在文件 I/O 时进行一些 颜色空间 修改,但仅为确保图像以预期形式显示。例如,"-type
" 具有特殊的 'bilevel
' 设置,可用于 magick 并将图像保存为某些图像格式的双色单色图像。类似地,'TrueColor
' 和 'TrueColorAlpha
' 可用于强制 TIFF 图像保存为全彩色 RGB 图像,即使图像实际上是纯灰度。其他设置包括 'GrayScale
' 和 'GrayScaleAlpha
',它们将确保写入的图像仅为灰度(分别具有或不具有透明度)。或者 'Palette
' 强制在支持此选项的格式中使用索引颜色映射。在读取图像文件格式时,"-type
" 设置为 'TrueColorAlpha
' 将强制读取的 JPEG 图像在内存存储中添加 'Alpha' 通道,即使 JPEG 格式本身无法处理透明度。当写入 PNG 文件格式时,设置 "-type
" 为 'Pallette
' 将强制其使用颜色索引的 "PNG8
' 内部图像格式。同样,使用 "BiLevel
" 将强制 IM 对大多数图像文件格式的颜色图像进行抖动,使其成为黑白。不幸的是,"-type
" 的确切含义和功能取决于您正在读取或写入的特定图像格式。请参见各种 图像文件格式 示例区域。有关特定 PNG 示例,请参见 PNG 输出格式。控制图像质量
深度 - 文件格式位深度
质量和深度是经常在讨论论坛和示例页面中提到的两个术语,因此我想简单地解释一下。质量是 ImageMagick 中的编译时设置,用于确定用于在 IM 内存中存储图像以及在处理过程中使用的值的范围。基本上,这意味着特定 IM 编译的处理质量。深度是图像读写到图像文件格式时使用的值的范围。因此,它更具可变性,并受“-depth
”设置或读入图像的原始“深度”控制。稍后将对此进行详细说明。请记住...
质量是“内存中”的值范围,并编译到 IM 中。
深度是文件格式的值范围,并且是可变的。
现在大多数图像格式的深度为 8。也就是说,它们使用 8 位(或从 0 到 28-1 的值)来保存图像中使用的每个颜色值。也就是说,红色值为 0 到 255,绿色值为 0 到 255,蓝色通道值为 0 到 255。通常,这种类型的图像被称为 24 位图像(即“每像素的位数”,而不是“每值的位数”,如“深度是文件格式的值范围,并且是可变的。
-depth
”设置中使用)。这包括诸如 JPEG 等格式。如果还涉及 Alpha 通道,那么您将获得 4 x 8 位的值,或 32 位/像素图像。这就是 PNG 图像通常使用的格式,尽管此类图像也可以使用每值 16 位进行保存。很多人所说的 8 位图像(8 位/像素),实际上是具有 8 位调色板或颜色映射的图像(在整个图像上提供最大 256 种颜色限制)。实际的像素数据是一个 8 位索引值(0-255),然后使用它从颜色表中查找该像素的颜色。也就是说,'光栅'(像素阵列)只是一个索引,用于从单独的颜色表中查找实际的像素颜色。换句话说,虽然 8 位图像也具有 8 位深度,但 8 位是颜色查找表中的一个索引,而不是实际的颜色。GIF 图像就是一个很好的例子。此类图像中的透明度通常通过指定表示透明度的特定颜色(使用“-transparent-color
”元数据设置)来处理,如 GIF 格式,或者使用特定数量颜色的颜色表(如某些 PNG8 图像(这也是一种颜色索引图像,类似于 GIF)使用)。总之...- 24 位图像为:3 x 8 位值 - 仅 3 个颜色通道
- 32 位图像为:4 x 8 位值 - 3 种颜色 + Alpha 通道
- 8 位图像为:8 位颜色索引图像,颜色限制为 256 种
质量 - 内存位质量
请记住,质量是 ImageMagick 中的编译时设置,用于确定用于在 IM 内存中存储图像以及在处理过程中使用的值的范围。它无法更改,除非从源代码重新编译 ImageMagick。因此,'Q16' ImageMagick(IMv7 默认设置)将使用至少两倍的内存来保存与 'Q8' 版本的 ImageMagick 相同的图像数据量,并且根据您的 CPU,速度会慢很多,尽管在当今的处理器上,这不太可能。同样,您可以编译 'Q32' 和 'Q64' 版本,尽管这些版本并不常见,通常只用于非常高端的图像处理。另请参见下面的新的 HDRI 编译质量选项。'Q16' ImageMagick 还允许您为每个像素值保存更多位信息。也就是说,颜色值以从 '0
' 到 '2^quality-1
' 的范围内的整数保存。最后一个值在 IM 编程中称为当前 'QuantumRange'(或旧的过时名称 'MaxRGB')。在编译 IM 时使用的质量设置越高,在内存中存储图像时颜色值越精确。这意味着,如果您在处理图像时生成了许多非常小的、细微的颜色变化,那么这些变化将保留在 ImageMagick 的内存存储中,并可用于后面的处理步骤。诸如调整大小、噪声滤波器、模糊、锐化、平均、全局颜色、伽马和直方图修改,或许多复杂的图像合成操作,都可能在 Q8 IM 中产生不希望的色差,在结果图像上创建非常明显的色差。当然,将最终图像保存到 8 位“深度”图像格式将把这些颜色值量化回 8 位,但在内存中处理图像时,图像的中间质量将保留。一些格式可用于保存 IM 使用的更高质量级别信息。例如,MIFF IM 格式、枚举像素 TXT 格式以及 NetPBM 图像格式。但是,虽然 Q8 版本的 IM 允许您输出 16 位深度的图像,但此类图像仍然只有相当于 8 位深度的信息,因为内存中没有质量,无法保存。如果 IM 使用 8 位值读取图像(许多图像格式都这样做),图像的“深度”将设置为 8 位,并且保存时,IM 通常会以相同的 8 位值深度保存图像,即使您使用 Q16 版本的 IM 处理图像也是如此。您可以覆盖此设置或清除该图像的“-depth ”设置,以便 IM 以图像的最佳深度保存它以匹配 IM 内存质量。另请注意,许多生成额外颜色的操作符(如 图像调整大小)也会将内存中图像的“深度”重置为编译时质量设置,以便 IM 随后尝试以更高的深度保存它,如果可能的话。 |
HDRI - 浮点质量
HDRI 或 高动态范围成像 最初是为了更自然地表示我们的眼睛同时看到场景中明亮和黑暗区域的能力而设计的。在实际的图像处理方面,它所做的远不止这些。HDRI 版本的 IM(默认构建)编译为使用存储在内存中的图像的浮点值,以便您可以对图像操作执行更精确的 HDRI 处理,从而防止此类操作在极端情况下“裁剪”图像颜色。HDRI 使用与默认编译时 质量设置 相同的颜色范围进行内存存储。也就是说,值仍然从 '0
' 到 'Quantum Range',意味着黑色到白色。但是,这些值使用浮点数(在 C 编程术语中为 'doubles
')而不是整数保存,这样就不会出现将值舍入为整数产生的“量子”效应。当值超出 'Quantum Range' 或变为负数时,这些值也不会被“裁剪”。基本上,您在处理步骤之间损失的信息要少得多。因此,当您计划对图像进行非常重的数学处理时,HDRI 至关重要,这涉及到暂时使用负值,或对非常小或非常大的值进行强缩放。对于想要充分利用 快速傅立叶变换 (FFT) 功能的用户来说,这一点尤其重要,并且您将在这些页面中看到 IM 的 HDRI 版本的大多数示例。有关编译 HDRI 版本的 IM 的信息,请参阅主 IM 网站上的 在 ImageMagick 中启用 HDRI,以及有关 Windows 和 Ubuntu Linux 的特定信息,请参阅用户论坛上的 傅立叶变换公告讨论。在使用 HDRI 时,应牢记一个重要的操作符是“-clamp
”。此选项将裁剪超出图像正常范围的图像中的值。也就是说,任何负值都将被裁剪为零,任何大于 'QuantumRange' 的值都将设置为该值。但是,它不会将浮点值“舍入”为整数。量子效应,HDRI 与非 HDRI
量子舍入... 例如,这里我使用 级别 和 反向级别 操作符将渐变图像的颜色范围压缩到只使用从 0 到 15 的值,然后再次解压缩。结果渐变也以图像配置文件的形式显示(使用脚本“im_profile
”)以使其更容易跟踪。
|
|
|
钳位以在 HDRI 中强制执行图像边界
您可以使用“-clamp
”在两个级别选项之间强制 HDRI 图像被正常的图像值范围“裁剪”。例如...
|
-clamp
”基本上生成了与使用正常的非 HDRI 版本的 ImageMagick 所获得的图像相同的图像。但是,此图像并不完全与非 HDRI 结果相同,因为虽然“-clamp
”会将图像中的值燃烧和裁剪,但它不会添加量子舍入效应。因此,只有在最终保存到非 HDRI 图像文件格式时,值才会被舍入为整数。“-clamp
”选项在使用 HDRI 时可能至关重要,以实现您想要的结果。
HDRI 文件格式
当然,将包含非常小、非常大或负值的图像保存到普通图像文件格式中也会被剪裁、量化,甚至颜色减少,原因与上述相同。因此,如果您需要保存尚未“归一化”回 0 到“量化范围”的图像,则需要使用一种罕见的浮点图像文件格式。一些可以处理浮点值(不会剪裁或舍入)的图像格式包括 NetPBM PFM。这是唯一一种不需要任何额外特殊选项的图像文件格式。其他图像文件格式也可以使用,但需要一个特殊的开关来指定文件将保存浮点值。具体来说,您需要指定编码器选项“
-define quantum:format=floating-point
”来请求这些文件格式中的浮点值。“-depth
”设置也可以用来定义使用哪种类型的浮点值。如果使用“-depth 32
”或更小(大多数 IM 版本中的默认值),则使用正常的“浮点数”。但是,如果设置了“-depth 64
”,则将使用“双精度数”来写入或读取图像文件格式的浮点数据。可以使用此特殊标志来保存浮点值的图像文件格式包括… TIFF、FITS 和 MIFF。原始数据文件格式 RGB 也会保存(和读取)浮点值,尽管该格式不保存图像大小,并且您还需要指定浮点设置来读取。另一个特殊的编码器选项是“
-define quantum:scale=65535.0
”。这将与从图像文件读取的值相乘,以便将值从 0.0 到 1.0 的归一化浮点值缩放为 0.0 到 65535.0 的内部值范围。因此,如果您在读取浮点图像时获得了近乎纯黑的图像,请尝试添加此选项以将读取的值缩放至适当的范围。直接内存到磁盘文件格式 MPC 也会保存 HDRI 版本的 IM 使用的浮点值,并且不需要任何特殊标志。但与任何 MPC 图像文件一样,只有相同机器上的完全相同版本(特定编译)的 IM 才能正确读取此类文件。因此它只适用于脚本图像处理的临时“快速读取”文件,不适用于长期存储。
我应该使用哪个 Q 等级
总之,我应该使用哪种类型的 ImageMagick?Q8、Q16、HDRI?Q8 的内存占用更小,因为图像值在内存中以 8 位值保存,就像大多数图像文件格式一样。对于基本的合成、图像格式转换、简单的“一次性调整大小”或在图像上绘制,那么 Q8 就“足够好”。Q16 使内存占用加倍,因为颜色值以 16 位值保存(精度更高)。但是,如果您计划进行大量的图像处理,包括多个操作级别,例如“颜色空间更改(即使只是 sRGB 到/从 RGB)、调整大小、失真、模糊、阴影等等,所有操作都针对同一图像,在同一个命令中(推荐出于同样的原因),那么使用 16 位更好,因为它将在处理步骤之间保留图像的较低精度。您也可以在命令之间以 16 位文件格式(PNG、MIFF、PbmPlus)保存,即使最终保存回到 8 位图像文件格式,如 ICO 和 JPEG。(这是默认设置,原因同上)下一级是Q16 HDRI,它将精度提升至 32 位浮点值,这使您可以处理变得非常小或非常大的图像值,而不会出现图像的舍入和裁剪效应。您甚至可以处理负值,尤其是在某些颜色空间中。本质上,它是用来防止图像数据在极端情况下的处理过程中丢失,例如使用 HDRI 图像、傅里叶变换,或者仅仅是高水平的压缩、扩展,您可能会在原始数据的数学处理中遇到这些情况。换句话说,它就是一个概括。对于大多数涉及失真和多图像合成以及图像处理效果的操作,Q16 是一个不错的折衷方案。Q8 如果内存紧张,但您只进行简单的操作,HDRI 如果您进行极端操作。图像密度或分辨率
图像的密度是图像的空间(空间)分辨率。也就是说,图像的密度(通常以 dpi 或每英寸点数表示)定义了单个像素之间的距离(或大小),以及图像在现实世界中的总尺寸,通常用于在现实世界设备上显示或打印图像。它只是存储在图像中的一个数字,用于告知输出设备(如打印机和显示器)图像应该以每英寸多少个点(或像素)显示,或者对于诸如 PostScript、PDF、MWF 和 SVG 之类的矢量格式,使用图像中可能使用的任何真实世界坐标进行绘制的像素比例。它与实际图像像素大小或内存中的 质量 和保存文件格式 深度 完全无关,这些定义了图像的颜色“分辨率”。您可以在将图像读入 IM 时设置图像的分辨率或密度,方法是在读取或写入图像之前使用“-density
”函数,或者使用“-set density
”在读取图像后进行设置。可以使用“-units
”设置来定义密度值是以默认(传统印刷)的“PixelsPerInch
”来表示,还是以更现代的公制单位“PixelsPerCentimeter
”来表示(PNG 使用后者)。例如,一个 200x200 像素的图像,其密度为 600 dpi,因此在现实世界中将以 1/3 英寸的正方形显示。另一方面,一个更小的 72x72 像素的图像,其密度为 72 dpi,将在现实世界中显示为 1 英寸的正方形,尽管与之相比,它的空间质量不会很好。前者是“照片质量”,而后者是“显示分辨率”。在实际应用中,72 dpi 的图像在打印机上看起来“数字”或“点状”。另一方面,一张大的现代数码照片,其拍摄时的密度为 1200 dpi,可能需要进行 重采样 才能在显示器上显示,或者您可能只看到图像的极小部分。有关图像分辨率和密度的更多信息,请参阅 重采样调整大小运算符 上的说明。有关文本和字体分辨率和密度的信息,请参阅 点大小和实际字体大小。 Photoshop 和密度
“Photoshop”图像编辑器会将图像分辨率的额外副本保存到图像中的一个单独的配置文件(名为“8BIM
”)中,IM 不会触碰这个配置文件。因此,如果您使用 IM 更改了图像的分辨率,您可能也应该在将图像重新加载到“Photoshop”之前从图像中剥离配置文件,否则您可能不会看到任何密度变化。您可以使用“+profile 8bim
”从图像中删除该配置文件。来自 IM 论坛讨论,Jesper Nilsson(又名 stroker)建议您使用程序“exiftool
”直接修改图像的 Photoshop 标记。例如
exiftool -g -Photoshop:XResolution=300 -Photoshop:YResolution=300 file.tif |
基于质量的性能测试
一些性能测试提交给了 IM 论坛,Q8 vs. Q16 速度(& HDRI)。上述文章中的粗略结果- 每个像素每个通道使用的内存量与预期一致。Q8 - 1 字节,Q16 - 2 字节,Q32 & 任何 HDRI - 4 字节,Q64(HDRI) - 8 字节。
- 64 位在浮点运算方面具有显著的精度改进,但任何其他 HDRI 版本的 ImageMagick 也是如此。
- 从速度上看,Q8、Q16 和 HDRI 速度都差不多(假设计算机有浮点 MPU),Q32 速度慢了大约 25%,而 Q64(HDRI)速度慢了大约 50%。
请注意,Q64 自动使用“双长浮点数”,而不是 64 位整数。这是一种双精度 HDRI,虽然非常精确,但它是在内存中所有质量设置中最慢的,也是最占用内存的。 |
实际速度将取决于您的计算机规格,以及您是否拥有数学协处理器。如果使用默认的 Q16 或标准 HDRI 不是很重要,那么这可能是最好的选择。 如果很重要,那么您应该在您的设备上进行类似的性能测试,但使用您通常期望在图像处理中使用的操作。 |
ImageMagick 特殊控制
IM 还有一些特殊选项,它使用这些选项来控制其操作工作、信息报告以及用于调试目的。-version | 输出 IM 的版本,它使用的图像质量,以及它是在何时构建的。IM 将在输出此信息后隐式退出。
|
||||||||||||||||||||||||||
-list | 这是一个只提供信息的选项,它将列出请求的项目,然后退出。也就是说,您不能将此选项与任何其他选项或图像处理一起使用。它纯粹是为了提供信息目的,尤其是在脚本中检查输入选项和 IM 是否实现了某些选项。给定的参数定义了您想要列出的信息。例如,可以列出“color ”名称的列表,您可以使用这些名称(例如,使用“-fill ”、“-background ”、“-mattecolor ”、“-bordercolor ”)。而“font ”列出 IM 特别知道的字体。以下只是一些更有趣的列表…
Configure ”非常重要,因为它会告诉你IM构建时使用了哪些库和委托。它还包括“点”版本号,这个版本号在旧版本的普通“-version ”输出中是缺失的。(参见 脚本版本处理 ,这是一个使用此信息的例子。IM在输出此信息后会隐式退出。)
|
||||||||||||||||||||||||||
-verbose | 报告一些更复杂操作的额外信息。 例如“ -segment ”,它会输出很多颜色量化的细节。以及“ -distort ”,输出额外的信息和请求的图像失真的“FX”等效项。在迭代“-morphology ”操作时,它还会监控更改的数量。这对于从“info: ”和“-identify ”输出中生成更详细的图像信息特别有用。您可以使用选项的“加号”形式“+verbose ”来关闭此设置。 |
||||||||||||||||||||||||||
-regard -warnings |
“-regard-warnings ”会对某些图像文件格式发出一些信息性警告,这些警告是致命的。它还会使 IM 根据此类错误条件返回正确的退出状态。它可用于脚本中“清理”来自不受控制来源的图像文件。也就是说,如果 JPEG 或 TIFF 图像不正确、不完整或包含“未知”配置文件,则此选项将使 IM 失败并退出。 |
||||||||||||||||||||||||||
-precision {number} | 控制有效数字的数量。 当 IM 在响应各种调试、详细或格式化请求时输出浮点数时,此设置会设置您希望该输出的精度。默认情况下,它会将此类数字限制为 6 个有效数字,但此运算符会增加或减少此默认值。6 的默认设置也可以使用“ MAGICK_PRECISION ”环境变量修改。它影响来自…的输出。
|
||||||||||||||||||||||||||
-quiet | 不报告信息性警告消息。只报告适当的错误,例如 I/O 错误或错误选项等。这对“-crop ”或“-trim ”和“-layers optimize ”特别有用,因为它们通常会报告“丢失图像”警告,因为运算符不会产生任何“真实”图像。这还会使某些复杂图像文件格式的编码器静音,这些格式可能包含 IM 通常会忽略的“未知块”。例如,当 IM 读取 TIFF 图像或奇怪的 MPEG(AVI)视频格式时。 |
||||||||||||||||||||||||||
-respect -parenthesis |
导致 括号 不仅保存和恢复当前图像列表,而且还保存和恢复所有当前 操作设置。这意味着,当给定括号时,括号内的任何设置将在括号结束时重置。参见上面 括号和设置 中的示例。 | ||||||||||||||||||||||||||
-ping | 对于“identify”命令。IM 会尝试避免完全读取和解码完整的图像文件格式,以获取诸如图像大小之类的基本信息。 | ||||||||||||||||||||||||||
-monitor | 在图像处理的每个阶段报告处理的百分比,特别是对于非常大或非常长的图像处理任务。在较低级别的 API 中,您将使用 SetImageInfoProgressMonitor() 或 SetImageProgressMonitor() | ||||||||||||||||||||||||||
-debug | 详细报告 IM 正在做什么,在各个方面。该参数是一个逗号分隔的选项列表,例如…
-debug ”,日志输出的位置由“log.xml ”文件控制。默认情况下,它设置为“console ”。要将其保存到文件,请将 <log output="console"/> 更改为 <log output="file"/> 。对于命令行和 API 使用,您还可以定义一个环境变量,使用 IM 的操作来设置调试级别。
|
Limiting image size (quick note) To prevent excess memory usage, set your memory limit to say 16GB. Now set the disk limit to 4GB. ImageMagick will exit if the disk limit is exceeded, with a "cache resource exhausted" exception.