ImageMagick 示例 --
调整大小或缩放(通用技巧)

索引
ImageMagick 示例前言和索引
调整图像大小
其他专门的调整大小操作符  
调整大小技巧  
调整大小/重新采样滤镜(单独部分)
Nicolas Robidoux 的重新采样(单独部分)
我们以各种方式查看放大和缩小图像。图像保持完整和完整,但颜色个别点合并或扩展以占用更小/更大的画布区域。请注意,虽然这与图像的分辨率(每实际世界长度的像素数)相关,但这更多是图像最终如何使用的结果,而不是直接图像处理的真正关注点。

调整图像大小

更改图像大小最明显和最常见的方法是调整图像大小或缩放图像。然后,图像的内容会被放大或更常见地缩小以适合所需的大小。但是,虽然实际的图像像素和颜色会发生修改,但图像表示的内容基本上保持不变。但是调整图像大小可能是一个棘手的问题。它可以以非常不利的方式修改图像,并且没有“最佳方法”,因为什么是最好的取决于您实际上希望从调整大小过程中获得什么。因为没有“最佳”或“完美”的方法,所以您可能需要考虑很多选项。IM 一直试图提供选项,以使您在图像调整大小方面获得最大的控制范围。有数百种可能性、样式和技术,甚至调整大小专家也一直在尝试寻找新的和不同的方法来更改图像的大小。当然,对于大多数人来说,正常的默认选项就足够了,因为它们的设计考虑了通用用途。调整大小操作符经过精心设计,旨在为现实世界的图像生成非常好的结果。也就是说,这并不是说您不能将其用于图表或线条图,尽管对于那种类型的图像,您可能需要使用我们稍后将介绍的一些更高级的选项。
在指定要调整大小的图像时,您首先应该考虑的是...
您真的想修改图像吗? 调整大小会对图像造成巨大变化,避免或最大程度地减少不需要的“伪像”至关重要。也许只是边缘的轻微修剪,或者图像的更一般的裁剪将比图像的整体调整大小产生更好、更理想的结果。它通常看起来会更好,并且剩余的区域将是原始图像的完美副本。因为它通常最好不要调整图像大小...
如果调整后的图像大小相同,则调整大小将不会执行任何操作。
对此的例外情况(总有例外情况)是,如果您实际上使用“-filter”设置指定了重新采样滤镜。在这种情况下,正常的“如果图像未调整大小则不执行任何操作”将被覆盖,并且将应用滤镜。但是,许多滤镜(即使是默认滤镜)也会稍微模糊图像。这是它们性质的一部分。因此,通常情况下,此“短路”用于无操作调整大小是一件好事。调整大小操作符的参数是要将图像拟合到的区域。此区域不是图像的最终大小,而是要将图像拟合到的区域的最大大小。也就是说,因为 IM 尝试比最终大小(除非给出“!”标志)更保留图像的纵横比,但最终尺寸中至少有一个(如果不是两个)应该与给定图像的参数匹配。所以让我明确一下...
调整大小会将图像拟合到请求的大小中。
不会填充请求的框大小。
纵横比基本上保持不变,以便输入图像中的任何圆圈在输出图像中都保持圆圈。也就是说,图像不会被压缩或挤压,只会调整大小,除非您另行说明。例如,我尝试将两个源图像(一个较大的图像和一个较小的图像)拟合到一个 64x64 像素的正方形框中。

  magick dragon_sm.gif    -resize 64x64  resize_dragon.gif
  magick terminal_sm.gif  -resize 64x64  resize_terminal.gif
[IM Output] ==> [IM Output]  [IM Output] ==> [IM Output]
如您所见,“-resize没有生成 64x64 像素的正方形图像。事实上,图像仅放大或缩小到足以最佳地适应给定大小。 忽略纵横比('!' 标志)
如果需要,您可以强制“-resize”忽略纵横比并扭曲图像,以便它始终生成完全指定大小的图像。这是通过在大小中添加字符“!”来完成的。不幸的是,此字符有时也会被各种 UNIX 命令行 shell 用于特殊用途。因此,您可能需要以某种方式转义该字符以保留它。

  magick dragon_sm.gif    -resize 64x64\!  exact_dragon.gif
  magick terminal.gif  -resize 64x64\!  exact_terminal.gif
[IM Output] ==> [IM Output]  [IM Output] ==> [IM Output]
仅缩小较大图像('>' 标志)
另一个常用的选项是限制 IM,使其仅缩小图像以适应给定大小。从不放大。这是“>”调整大小选项。将其视为仅应用于“大于”给定大小的图像(有点违反直觉)。

  magick dragon_sm.gif    -resize 64x64\>  shrink_dragon.gif
  magick terminal.gif  -resize 64x64\>  shrink_terminal.gif
[IM Output] ==> [IM Output]  [IM Output] ==> [IM Output]
此选项对于节省图像的磁盘空间或在缩略图生成中通常非常重要,因为放大图像通常可能不可取,因为它往往会产生“模糊”的放大效果。
仅缩小标志('>' 标志)是 UNIX Shell 和 Window 批处理脚本中的特殊字符,您需要转义该字符(在 shell 中使用反斜杠“\>”,在 windows 批处理中使用“^>”)。它在 HTML 网页中也是特殊的,因此 PHP 脚本也可能需要一些特殊处理。
仅放大较小图像('<' 标志)
前面标志的反向是“<”,它仅放大小于给定大小的图像,很少使用。最值得注意的用途是使用诸如“1x1<”之类的参数。此调整大小参数永远不会实际调整任何图像的大小。换句话说,它是一个无操作,它允许您在始终使用“-resize”的程序和脚本中短路调整大小操作。除此之外,您可能实际上并不想使用此功能。使用此“短路”参数的一个示例是“magick montage”的“-geometry”设置。有关更多详细信息,请参阅蒙太奇和几何,注意
仅放大标志('<' 标志)是 UNIX Shell 和 Window 批处理脚本中的特殊字符,您需要转义该字符(在 shell 中使用反斜杠“\<”,在 windows 批处理中使用“^<”)。它在 HTML 网页中也是特殊的,因此 PHP 脚本也可能需要一些特殊处理。
填充区域标志('^' 标志)
从 IM v6.3.8-3 开始,IM 现在有一个新的几何形状选项标志“^”,用于根据最小的拟合尺寸调整图像大小。也就是说,图像被调整大小以完全填充(甚至溢出)给定的像素区域。

  magick dragon_sm.gif    -resize 64x64^  fill_dragon.gif
  magick terminal.gif  -resize 64x64^  fill_terminal.gif
[IM Output] ==> [IM Output]  [IM Output] ==> [IM Output]
就目前而言,此选项似乎不太有用,但当与居中(或非居中)“-crop”或“-extent”结合使用以去除图像的过多部分时,您可以拟合图像以完全填充指定区域。调整大小和最终图像大小参数都应为相同的值。尽管“-crop”最合乎逻辑,但它可能需要额外的“+repage”以去除虚拟画布分层信息。“-extent”不需要此清理,但仍然允许使用“-gravity”进行定位。有关更多信息,请参阅剪裁和边框

  magick dragon_sm.gif      -resize 64x64^ \
          -gravity center -extent 64x64  fill_crop_dragon.gif
  magick terminal.gif    -resize 64x64^ \
          -gravity center -extent 64x64  fill_crop_terminal.gif
[IM Output] ==> [IM Output]  [IM Output] ==> [IM Output]
此外,“-extent”可用于填充使用正常调整大小(使用“-background”颜色设置)的图像。有关此类操作的更多信息,请参阅缩略图,适合给定空间摘要
请记住,这需要 IM v6.3.8-3 或更高版本才能使用它。否则,请使用下面较旧的调整大小以填充给定空间技术。
填充区域标志('^' 标志)是 Window 批处理脚本中的特殊字符,您需要通过将其加倍来转义该字符。例如“^^”,否则它将不起作用。有关此和其他窗口特定功能,请参阅Windows 批处理脚本
百分比调整大小('%' 标志)
在“-resize”参数中添加百分号“%”会导致调整大小按指定量缩放图像。

  magick dragon_sm.gif    -resize 50%  half_dragon.gif
  magick terminal.gif  -resize 50%  half_terminal.gif
[IM Output] ==> [IM Output]  [IM Output] ==> [IM Output]
但是请注意,图像的最终像素大小将四舍五入到最接近的整数。也就是说,您不会在图像边缘生成部分像素!因此,实际比例可能与您提供的缩放因子不完全匹配,甚至在 X 和 Y 方向上可能略有不同,但它会非常接近。(请参阅使用扭曲调整大小)。
如果确实需要调整图像大小,使其最终大小看起来像具有部分像素大小差异,则可以使用通用扭曲操作符,特别是缩放-旋转-平移(请参阅下面扭曲调整大小)。
百分比调整大小标志('%' 标志)是 Window 批处理脚本中的特殊字符,您需要通过将其加倍来转义该字符。例如“%%”,否则它将不起作用。有关此和其他窗口特定功能,请参阅Windows 批处理脚本
所有这些“标记”选项“!”,“<”,“>”,“^”,“%”和“@”都只是“-resize”操作符的开关。只有字符在调整大小参数中存在(或不存在)才重要,位置无关紧要。它们可以出现在参数的开头或结尾,或者在各个数字之前或之后(但不能在数字中间)。

也就是说,“%50”与“50%”的效果完全相同,尽管后者更易于阅读。同样,“50%x30”实际上表示“50%x30%”,而不是您可能认为的 50% 宽度和 30 像素高度。

对于所有使用“几何”样式(“WxH”或“+X+Y”)参数的 IM 参数,情况都是如此。但是,诸如“+X+Y”之类的偏移量永远不会被视为百分比。
使用像素区域计数限制(“@”标记)调整大小
还有一个最终的“-resize”选项标记。“at”符号“@”将调整图像大小,使其包含的像素不超过给定数量。例如,这可以用于使所有不同尺寸的图像集合大致相同的大小。例如,这里我们将两个图像都调整为大约 64x64 大小,或 4096 像素大小。

  magick dragon_sm.gif    -resize 4096@  pixel_dragon.gif
  magick terminal.gif  -resize 4096@  pixel_terminal.gif
[IM Output] ==> [IM Output]  [IM Output] ==> [IM Output]
请注意,最终图像大小不限于 64 像素高或宽,但将具有一个面积,该面积尽可能接近(但小于)此大小,IM 可以管理。这意味着一个维度通常会略大于 64 像素,另一个会略小于 64 像素。在某些方面,这是缩略图图像的理想折衷方案。请参阅 区域拟合缩略图大小。您还可以添加“>”标记,仅缩小像素数超过计算值的图像,而保留已小于该尺寸的图像。
不幸的是,当使用“区域调整大小”时,当前会忽略“<”(放大较小图像)标记。

读取图像期间调整大小
调整大小操作符还可以应用于图像读取后立即应用,然后将其添加到当前图像序列中并读取下一个图像。这样,读取大量图像所需的内存最少。有关更多详细信息,请参阅 图像读取修改器。例如……

  magick dragon_sm.gif'[64x64]'    read_dragon.gif
  magick terminal.gif'[64x64]'  read_terminal.gif
[IM Output] ==> [IM Output]  [IM Output] ==> [IM Output]
这种技术的唯一问题是,在图像读取过程中无法使用任何特殊的调整大小选项。
在 v6.2.4 之前的 ImageMagick 中,调整大小和透明度存在问题,在透明度上的浅色物体周围产生黑色光晕效果。对此进行了研究,并从该版本开始最终修复。有关此旧错误的更多详细信息,请参阅 调整大小光晕错误

其他调整大小操作符

Geometry - 仅调整最后一个图像的大小

Geometry 是一个非常特殊的选项。该操作符在每个 IM 命令中的行为略有不同,并且通常以特殊和神奇的方式。这样做的原因主要是由于遗留用法,如果可能,应避免使用。首先,在“magick display”中,它用于调整正在显示的图像窗口的大小和位置。这是 IM 首次启动时的原始用法和含义。正是从这里产生了它的其他“调整大小”功能。对于 "
montage" "-geometry" 是一个保存设置,直到所有参数都已读取。此时,它定义最终的图块(单元格)大小(或将其留给“magick montage”来确定),而位置参数用于指定图块单元格周围的空间。请参阅 蒙太奇控制设置。在“composite”中,“-geometry”也会保存到参数结束。然后,它用于在将叠加图像(给定的第一个图像)叠加到背景图像(第二个图像)上之前调整其大小和位置。例如,请参阅 合成多个图像。正如您所看到的,它在大多数 IM 命令中用作“设置”,但在“magick”中,“-geometry”既是特殊的图像调整大小操作符,也是位置设置。它所做的是“-resize”当前图像序列中的最后一个图像。这是唯一一个专门设计用于影响当前图像序列中一个图像(最后一个)的图像处理操作符。为了进一步使这个特殊选项复杂化,“-geometry”选项的位置部分由“magick”命令保存,就像在“composite”中一样。也就是说,任何位置都会保留以供“-composite”稍后使用,以将“叠加”图像(当前图像序列中的倒数第二个图像)定位在“背景”图像(图像序列中的第一个图像)上。因此,您应该将“-geometry”在“magick”命令中的使用限制在“-composite”或“-layers composite”操作之前。总而言之,此操作符仅在读取或创建第二个图像后,在您执行某种类型的 Alpha 合成 来处理这些图像之前才真正有用。有关使用“-geometry”调整图像大小/位置的实际示例,请参阅 合成多个图像

Thumbnail - 带有配置文件剥离的调整大小

"
-thumbnail" 操作符是“-resize”的变体,专为将非常大的图像缩小为小型缩略图而设计。首先,它使用“-strip”删除图像中的所有配置文件和其他填充内容。然后,它使用“-sample”将图像缩小到最终高度的 5 倍。最后,它执行正常的“-resize”以将图像缩小到其最终大小。所有这些基本上是为了加快从非常大的文件中生成缩略图的速度。但是,对于 JPEG 图像的缩略图,您可以使用特殊选项“-define jpeg:size={size}”设置限制从磁盘读取的图像大小。有关更多详细信息,请参阅 读取 JPEG 图像。因此,在缩略图生成中,JPEG 很少需要此速度改进,尽管配置文件剥离仍然非常重要。对于其他图像格式,例如 TIFF,配置文件剥离和速度改进仍然至关重要。因此,它仍然是为缩略图创建调整图像大小的推荐方法。
在 IM v6.5.4-7 之前,“-thumbnail”会剥离图像中的所有配置文件,包括 ICC 颜色配置文件。从该版本开始,将保留颜色配置文件。如果不希望使用颜色配置文件,则“-strip”所有配置文件。

Resample - 更改图像的分辨率

就像在前面的替代调整大小操作符中一样,“
-resample" 也是正常“-resize”操作符的简单包装器。但是,其目的是调整图像中的像素数量,以便在以给定的 分辨率或密度 显示时,图像在现实世界中的尺寸仍然看起来相同。也就是说,给定图像在像素数量方面被放大或缩小,而图像在现实世界单位中的大小保持不变。它旨在用于从程序或设备读取或写入特定分辨率或密度的图像。这对于调整图像以适合特定的硬件输出设备尤其重要,无论是显示器、打印机还是特定分辨率的 Postscript 或 PDF 图像格式。请记住,图像的现实世界大小不会改变,只有其分辨率以及用于表示图像的像素数量会改变。例如,假设您有一个以 300dpi(每英寸点数)扫描的图像。该图像以此分辨率(密度)保存,或者当您将其读入 IM 时,您将其指定为 300dpi 图像(使用“-density”)。现在您决定在分辨率为 90dpi 的屏幕上显示它,因此您执行“-resample 90”。IM 现在将图像调整为 90/300 或图像原始尺寸的 30%,并将图像的新密度设置为 90dpi。现在,图像在使用的像素数量方面更小,但如果在 90dpi 显示器上显示,则会显示为与您扫描的原始图像相同的物理尺寸。也就是说,它现在具有适合 90dpi 显示器的分辨率,因此它将以其原始现实世界尺寸显示给用户。“-units”设置(带参数“PixelsPerInch”或“PixelsPerCentimeter”)在某些情况下可能需要才能使此操作符正常工作。此设置对于输出到 Postscript 和 PDF 图像文件格式也很重要。请注意,只有少量图像文件格式(例如 JPEG、PNG 和 TIFF)能够将图像分辨率或密度与图像数据一起存储。对于不支持图像分辨率或为多分辨率(基于矢量)图像格式的格式,必须通过“-density”属性(请参阅 密度图像元数据)在读取之前指定图像的原始分辨率。如果未设置密度属性,IM 将假设其默认密度为 72dpi。在读取此类图像后设置密度只会影响其输出分辨率,而不会影响其最终像素尺寸。

Scale - 使用像素平均缩小

"
-scale" 调整大小操作符是调整大小命令的简化、更快的形式。当放大图像时,图像中的像素会被复制以形成大的矩形色块。这非常适合显示图像的清晰、未模糊的放大效果。例如,以下是内置图块图案之一的放大视图……

  magick -size 8x8 pattern:CrossHatch30 -scale 800% scale_crosshatch.gif
[IM Output]
通常,图像放大的单个百分比值是 100% 的倍数,以确保所有像素都以相同的量放大,否则您可能会有不同大小的像素行和列,从而产生大规模的莫尔图案。
例如,这里我使用不是原始图像大小倍数的大小,错误地缩放了外观平滑的“50% 灰色格子”图案。


  magick pattern:gray50 scale_gray_norm.gif
  magick pattern:gray50 -scale 36 scale_gray_mag.gif
[IM Output]
==>
[IM Output]
缩小图像时,相邻像素会平均到一起生成一个新的彩色像素。例如,将图像缩放到原始尺寸的 50% 将有效地将 4 个像素的块平均到一起以创建一个新像素(假设图像尺寸也是 2 的倍数)。但是,建议谨慎操作,因为缩小的图像也可能产生莫尔纹,除非新图像是精确的整数缩减(一种称为“合并”的技术),这也要求原始图像尺寸是最终尺寸的某个精确整数倍。此外,使用“-scale”大幅缩小的真实照片往往看起来过于锐利,在锐利的边缘会出现锯齿(“阶梯”)效果。“-scale”的像素平均使其能够生成“像素化”图像。你基本上是减小图像尺寸以平均像素,然后再次放大回图像的原始尺寸。

  magick rose: -scale 25%  -scale 70x46\!  rose_pixelated.gif
[IM Output] ==> [IM Output]
您可以使用蒙版将上述像素化图像与原始图像组合,从而“隐藏”原始图像中存在的一个更小的“不良”部分。请参阅保护某人的匿名性示例以了解使用此技术的演示。该算法还设计为循环遍历像素的行,然后是列,这与“-resize”相反。这可能允许“-scale”更好地处理“mpc:”磁盘缓存的图像。
直到 IM v6.4.7,“-scale”仍然包含旧的调整大小光晕错误

缩放内部(像素混合)...

在许多方面,
缩放运算符类似于普通的调整大小运算符,但使用“Box重采样滤波器。但是,它实际上使用了一种完全不同的算法,其结果在准确性上略高于Box 滤波器产生的结果。Box 滤波器的工作方式是简单地平均落在滤波器“支持窗口”内的任何像素(样本)(请参阅滤波器支持专家控制)。这意味着,当缩小图像非常小的量时,Box 滤波器调整大小只会产生精确的像素值或完全平均的像素值。缩放运算符使用不同的算法,该算法被称为(因为缺少更好的名称)像素混合。它不是根据“像素平均值”生成颜色,而是在“支持窗口”内使用更准确的“像素区域”。例如,在这里,我采用“棋盘格”像素图案,并将其缩小 2 个像素,比较缩放的结果与使用非常简单的Box 和 Triangle 滤波器调整大小的结果。

  magick -size 10x10 pattern:gray50  checks.gif
  magick checks.gif  -filter box      -resize 8x8  checks_box.gif
  magick checks.gif                   -scale  8x8  checks_scale.gif
  magick checks.gif  -filter triangle -resize 8x8  checks_triangle.gif
[IM Output]
10 像素“哈希”
==> [IM Output]
Box 滤波器
调整大小
[IM Output]
像素混合
缩放
[IM Output]
三角滤波器
调整大小
以上图像已大幅放大
以上显示了“纯平均”、 “像素混合”和“线性插值”的结果。它还显示了缩放运算符实际上类似于三角滤波器,但仅在对图像进行非常小的缩小操作时。在其他情况下(大幅缩小、放大或精确整数大小),它将产生更类似于Box 滤波器的结果。基本上,它生成的内容更像是 Box 和 Triangle 滤波器的混合,具体取决于图像缩小的程度。在放大时也会看到类似的效果。

  magick -size 8x8 pattern:gray50  checks_sm.gif
  magick checks_sm.gif -filter box      -resize 10x10 checks_sm_box.gif
  magick checks_sm.gif                  -scale  10x10 checks_sm_scale.gif
  magick checks_sm.gif -filter triangle -resize 10x10 checks_sm_triangle.gif
[IM Output]
10 像素“哈希”
==> [IM Output]
Box 滤波器
调整大小
[IM Output]
像素混合
缩放
[IM Output]
三角滤波器
调整大小
以上图像已大幅放大
放大时,Box 滤波器永远不会产生“平均像素”,只会产生像素行/列复制。但是,缩放将在边缘生成平均的颜色像素,这再次非常类似于但不完全相同于三角滤波器。当然,这种效果对于小的非整数放大才真正可见,在更大的缩放中,仅在边缘可见,而在更典型的情况下,您可能会得到一个或两个平均像素。总而言之:缩放比普通的调整大小运算符快得多,因为它在图像处理需求方面不那么通用。但它也是一种完全不同的算法,在使用非整数缩放调整图像大小时会产生略微不同的结果。有关更多详细信息,请参阅像素混合页面,以及 IM 论坛讨论线性放大几个像素。特别感谢论坛用户atnbueno,他指出了上述差异。

示例- 通过行/列复制/删除调整大小

-sample”调整大小运算符是最快的调整大小运算符,尤其是在大规模图像缩减中。事实上,它甚至比“-scale”运算符(见上文)更快。在放大或放大图像时,它只执行像素复制(如Box 滤波器,生成像素颜色的矩形“块”。但是,在缩小图像时,“-sample”只是删除像素的行和列。因为只是简单地添加或删除了整行和整列的像素,“-sample”不会生成任何新的或额外的颜色。这一事实对于某些图像处理技术(例如调整 GIF 动画大小)可能很重要。另一种看待它的方式是,图像在整个图像中以非常均匀的规则模式“采样”单个像素。您可以将图像视为被划分为一系列区域,并从每个区域中选择一个像素作为结果图像。但是,这种单个像素的“采样”(或整行/列的移除)可能会产生非常糟糕的结果,尤其是在包含细线(就像素宽度而言)的图像中。例如,在这里,我绘制了一条线,但随后减小了图像尺寸,导致只有一条点线。

  magick -size 150x60 xc: -draw 'line 0,59 149,0' line_orig.gif
  magick line_orig.gif  -sample 50x20  line_sample.gif
[IM Output] ==> [IM Output]
这是使用图像采样通常会产生的效果,被称为严重的混叠效果。

采样像素的偏移

从 IM v6.8.4-7 开始,现在将每个采样子区域中采样的精确像素定义为每个区域中点处的像素(如果子区域是偶数个像素,则为左上角中心像素)。这意味着,如果您对图像进行单个像素采样,您将获得图像的中间像素。
在 IM v6.8.4-7 之前,选择的像素是每个区域的左上角像素。但是,有报告称某些版本中这可能是右下角,或者由于错误而可能略有变化。
此类信息对于图像通过原始图像尺寸的整数除法进行缩减尤其有用。例如,当您创建或采样像素化图像或
隔行扫描视频帧时。此外,从该版本开始,您可以使用definesample:offset”控制每个子区域中选择哪个像素,它接受一个或两个百分比值(默认为“50”表示中点)。使用百分比是因为在一般情况下,“采样子区域”可能与像素边界不一致。也就是说,为什么需要百分比而不是“像素偏移”。但是,如果图像大小可以被样本数整除,那么您可以轻松计算出您想要从每个子区域获取哪个像素。例如,如果一个图像被采样,使得您有 5 个像素子区域,那么(例如,将一个跨度为 100 像素的图像采样到 20 个像素样本),那么您可以使用 0 到 19.9 范围内的采样偏移百分比来选择每个区域中的第一个像素,20.1 到 39.9 表示第二个像素,依此类推。换句话说,您可以使用 10、30、50、70 和 90 的百分比值来精确指定您想要从每个恒定大小的采样区域获取哪个像素。有关采样偏移的更多信息,请参阅 IM 论坛讨论采样点

放大- 像素缩放

-magnify”选项将图像大小加倍,但它通过使用称为“像素缩放”的技术来实现,使用Scale2X 算法。该算法试图平滑被放大的像素的角,而不添加额外的颜色。因此,非常小的像素化图像放大得更干净,同时保留原始颜色和较小图像的“复古像素外观”。

  magick -size 8x8 pattern:CrossHatch30 -virtual-pixel tile \
          -magnify -magnify -magnify magnify_crosshatch.gif
[IM Output] ==> [IM Output]
请注意,使用了虚拟像素设置以确保放大理解此特定图像“环绕”图像边缘。
在 IM v6.8.4-10 之前,放大只是围绕调整大小的包装器,用于将图像大小加倍。没什么用,而且很少使用。使用“像素缩放”使此选项更有用。有关更多信息,请参阅 IM 用户论坛上的像素缩放
API 中通常也提供“Minify()”函数,该函数将图像大小减半,但它只是围绕调整大小的包装器。但是,“-minify”在命令行 API 中不可用,至少在撰写本文时不可用。

自适应调整大小- 无需模糊的小调整大小

-adaptive-resize”运算符使用特殊的网格插值方法来调整图像大小。例如,在这里,我首先使用普通的“-resize”调整简单线条的大小,然后再次使用“-adaptive-resize”调整大小。

  magick -size 50x50 xc: -draw 'line 0,49 49,0'  line_orig2.gif
  magick line_orig2.gif           -resize 80x80  line_resize.gif
  magick line_orig2.gif  -adaptive-resize 80x80  line_adaptive.gif
[IM Output] ==> [IM Output] [IM Output]
如果您查看两个结果的放大图...
[IM Output] [IM Output]
您可以看到右侧的自适应调整大小图像看起来比左侧使用普通的“-resize”运算符生成的图像干净得多,并且模糊度更低。基本上,该运算符避免了“-resize”运算符在颜色发生急剧变化时可能产生的过度模糊。这对于轻微的图像尺寸调整非常有效,特别是对于放大,尤其是在具有颜色急剧变化的图像中。但是,与所有像素插值方法一样,当图像放大或缩小超过 50% 时,它会产生混叠和莫尔纹效果。您还可以使用扭曲调整大小操作生成完全等效的结果,但使用选项“-filter point -interpolate mesh”。也就是说,使用简单的网格插值查找方法而不是更复杂的重采样滤波器来调整图像大小。

插值调整大小- 使用插值方法调整大小

-interpolative-resize”运算符实际上与之前的自适应调整大小运算符相同。但是,此运算符将使用当前的“-interpolate”设置而不是固定的“Mesh”插值方法。

如果您使用“-interpolate”设置为“Nearest”,您将实质上获得等效于采样操作符的结果。类似地,许多其他的简单插值方法将等同于使用等效的插值缩放滤镜。但是,有一些插值方法,例如Mesh,作为缩放滤镜没有等效项。

这同样也是一个未缩放的调整大小,这意味着它非常适合放大和少量缩小,但当缩小超过50%时,可能会出现严重的锯齿效应,如上文中其他“采样调整大小操作符”所示。

液体缩放 - 缝合雕刻

就像
采样图像通过直接移除或复制图像中的整列和整行来调整大小一样,特殊的IM操作符“-liquid-rescale”也会从图像中移除或复制像素列和行来缩小/放大图像。不同之处在于它尝试以更智能的方式做到这一点。首先,它不是移除简单的像素行,而是移除“缝合线”像素。也就是说,该列(或行)可以以高达45度的角度穿过图像。其次,它试图移除在图像内容方面“不重要”的缝合线。它如何选择这一点是根据图像的能量,或者更简单地说,是特定“缝合线”涉及的颜色变化量。“能量”变化最少的“缝合线”将首先被移除,然后是“能量”更高的缝合线,直到图像达到所需的大小。有关液体调整大小和缝合线雕刻的更多详细信息,请参阅维基百科:缝合线雕刻YouTube视频演示PDF论文:用于内容感知图像调整大小的缝合线雕刻。例如,以下是使用IM“-liquid-rescale”操作符缩小尺寸的IM徽标。

  magick logo: -resize 50% -trim +repage  logo_trimmed.jpg
  magick logo_trimmed.jpg  -liquid-rescale 75x100%\!  logo_lqr.jpg
  magick logo_trimmed.jpg  -sample 75x100%\!  logo_sample.jpg
[IM Output]
原始图像
==> [IM Output]
液体缩放
[IM Output]
采样
请注意“-liquid-rescale”如何保留复杂的魔法师,同时压缩图像中不太复杂的星星和标题部分。它还稍微压缩了魔法师的右脚,在斗篷的边缘产生了轻微的锯齿状,就像它对魔法师的细而简单的魔杖所做的那样。另一方面,采样调整大小图像只是移除等间距的像素列,这导致整个图像变得同样失真。星星没有完好地保留,并且所有边缘都具有明显的但均匀的锯齿效应。基本上,“-liquid-rescale”将生成一个看起来更佳的“压缩”图像,而不会生成额外的“混合颜色”或图像模糊。但是,您可能会在某个位置(在本例中为魔法师的魔杖)看到一些轻微但局部的锯齿效应,而不是将该效应扩散到整个图像。它还可以通过“加倍”图像中找到的缝合线来扩展图像。

  magick logo_trimmed.jpg  -liquid-rescale 130x100%\!  logo_lqr_expand.jpg
[IM Output] ==> [IM Output]
正如您所看到的,它首先尝试加倍各个对象之间的空间量(在可能的情况下),将其扩展开来。尽管在本例中,最左边的星星和“m”会发生变形,因为穿过这些“低能量”区域的“缝合线”会聚集在一起。但是请注意,它只会加倍每条缝合线一次,因此当图像过度扩展时,此技术开始失效。更好的方法通常是先将图像调整为更大的尺寸,然后使用液体缩放将其缩小到所需的大小。或者以多个较小的步骤使用“-liquid-rescale”。为了更好地展示“-liquid-rescale”的效果,这里有一个动画,它将同一张图像缩小到非常窄的图像,然后再次放大。此动画是使用shell脚本animate_lqr创建的。
[IM Output]
再次注意,当图像压缩到越来越小的区域时,它试图保留图像中最复杂的部分。也就是说,标题中的空格会优先压缩,然后是魔法师的手臂,然后是魔法师的右侧,最后保留魔法师最复杂的中部。尤其要注意星星在最终受到液体缩放实施的重采样像素移除影响之前是如何被推到一起的。(请参见后面的问题)您可以将液体缩放视为尝试压缩图像,就像海绵一样,开放区域首先被压缩,最后保留体积大和结构化的部分。缝合线雕刻问题液体缩放或缝合线雕刻完全通过从图像中移除整个像素来工作。因此,与采样一样,它不会生成或合并颜色,并且图像中的直线和图案可能会因操作而严重变形。基本上,除非还应用某种平滑方法,否则它可能会导致严重的锯齿效应。但是,锯齿效应通常会分组并局限于图像不太复杂的区域,而不是扩散到整个图像中。这正是它如此有效的原因!由于“缝合线”可以穿过图像,因此“缝合线”可以并且通常看起来会绕过复杂的对象,在尝试压缩对象本身之前移除对象之间的空间。例如,请注意上面演示中“图像”一词是如何在没有太多失真地塞到标题中的其他字母下面的。但是,这种左右移动仅限于45度角。对于具有“繁忙”背景和不太“繁忙”前景对象的图像,例如包含人脸的照片,能量函数可能会认为前景对象不如背景重要。这会导致一些严重的负面副作用,可能需要人工干预才能解决。
液体缩放目前是为IM v6.3.8-4添加的一项高度实验性操作。它需要安装“liblqr”委托库才能正常工作。

目前尚未提供专家用户控制。例如,修改使用的内容能量函数,或使用用户提供的保留/移除滤镜(调整能量函数),或访问中间缝合线雕刻图像以及库也提供的功能。假设这些控制将在将来某个时间提供,因为用户需要它们,并且我们对库功能有了更多的内部控制。

警告不要期望它完全保留为当前实现的方式。它处于高度实验阶段,预计其功能将发生变化和扩展。

扭曲缩放 - 自由形式调整大小

上述所有调整大小方法都存在一个我们之前提到的限制,它们会将新图像的大小四舍五入为整数个像素,然后将旧图像的像素映射到新的像素数组。这有两个影响。首先,当调整为非常小的尺寸时,X比例尺可能与所得图像的Y比例尺不完全匹配(略微不同的纵横比)。这种差异很小,除非您得到非常小的尺寸,否则通常不会注意到。另一个影响是,您无法将图像调整大小以适应包含部分像素边缘的区域,这在进一步处理(例如图像叠加)中可能很重要。这也意味着您无法使用调整大小来将图像向右移动半像素(无需实际调整大小),即使算法可以很容易地做到这一点。在IM v6.3.6中,
通用扭曲操作符-distort”将允许您使用其缩放-旋转-平移扭曲方法来实现此目的以及更多功能。您也可以使用基于控制点移动的仿射扭曲来实现此目的。但是请注意,由于图像的边缘可以包含部分像素,因此最终图像可能比您预期的大2到3个像素。周围的额外像素将根据当前的虚拟像素设置混合,您通常将其设置为透明。例如,这里我将玫瑰图像调整为其原始大小的90%(.9),不旋转(0),围绕图像中心(如果未指定,则为默认控制点)缩小...

  magick rose: -alpha set -virtual-pixel transparent \
          +distort SRT '.9,0' +repage  rose_distort_scale.png
[IM Output]
它可能看起来不像改进,事实上它具有模糊的边缘,但它是一个精确的调整大小,没有针对最终整数图像大小进行调整,就像您请求的那样。因此,边缘是模糊的,因为像素颜色被散布在像素大小的一部分上,而不仅仅是散布到整数上。请注意,我使用了“+distort”的“加号”形式,以允许此图像的处理操作符在虚拟画布上正确设置最终图像的大小和偏移量,以便进行进一步的处理和分层。如果不需要此偏移量,则可以使用“+repage”操作符将其移除。但是,如果保留在原位,则图像在较大画布上的实际位置将被保留,允许您使用其“模糊边缘”将其精确地定位在正确的位置。这里我将其调整大小,以便左上角(0,0)向右移动了0.5像素(到.5,0),其余图像围绕该控制点缩放...

  magick rose: -alpha set -virtual-pixel transparent \
          +distort SRT '0,0  .9  0  .5,0' +repage  rose_distort_shift.png
[IM Output]
请注意,由于顶部边缘实际上没有移动,因此它保持相对清晰,而所有其他边缘都变得模糊。这里是对左上角的像素放大,显示了扭曲为了提供亚像素调整大小而添加的透明度...

  magick rose_distort_shift.png -crop 15x15+0+0 +repage \
          -scale 600%   rose_distort_shift_mag.png
[IM Output]
您可以看到顶部边缘保持清晰,而左侧(以及所有其他边缘)现在是半透明的。这就是重点。您可以精确控制调整大小以及所得图像的最终亚像素位置。而不仅仅是将调整大小的图像量化为整数个像素的拟合。也就是说,扭曲是对图像的精确重新缩放和定位到像素的一部分,允许您将其精确地拟合到其他图像中。这在进行视频工作时变得尤其重要,因为嵌入图像的不精确调整大小可能会产生“刺耳”的效果。
从技术上讲,图像调整大小是图像扭曲的简化形式,两者都是图像重采样的技术。它是一种非常快速的双通滤波技术,仅限于正交对齐的像素缩放,并且最终结果为整数个像素。
仿射,变换从IM v6.4.2-8开始,与“-transform”或“-draw”操作符一起使用的旧的“-affine”设置提供了类似的自由形式调整大小功能。但是,实际上它等同于使用“AffineProjection”扭曲方法调用“+distort”。因此,所有先前的扭曲说明都适用。它需要更多的数学运算,这使得普通用户难以使用。通常,您最好使用上述扭曲方法,它提供了多种指定要应用的仿射扭曲的替代方法。

扭曲与缩放

如果您实际上想要在使用扭曲缩放之间进行直接比较,则需要专门限制图像的扭曲,以便与您要比较的调整大小的图像完全匹配。这不是一项简单的任务。为了使这项工作更容易,IM v6.6.9-2中添加了一个特殊的缩放扭曲方法。例如,这里我使用快速缩放大大放大了内置的“rose:”,然后使用扭曲...

  magick rose: -filter Lanczos -resize 300x rose_resize.png

  magick rose: -filter Lanczos -distort Resize 300x rose_distort.png
[IM Text]
缩放(Lanczos - Sinc)
[IM Text]
扭曲(Lanczos - Jinc)

如果你沿着玫瑰的底部边缘观察,你会发现扭曲操作符实际上比缩放操作符产生了更好、更干净的结果。在放大图像时,常见的阻塞伪影非常少。除了这个底部边缘之外,图像的其余部分实际上是完全相同的,即使使用“flicker_cmp”脚本进行比较也是如此。但是请记住,扭曲缩放慢得多,因为它使用了一种更直接但更复杂的区域重采样技术,而没有缩放使用的两遍速度优化。
上面这两个图像的真正区别在于扭曲操作符使用了一种二维椭圆区域重采样滤波器方法(也称为圆柱滤波或重采样)进行图像处理。这比本节中显示的所有其他缩放方法使用的一维、两遍重采样方法慢。这也是它在上面放大的玫瑰图像的对角线底部边缘产生更好结果的原因。它不限于仅进行水平和垂直滤波。

你可以在振铃伪影上的示例中看到这对振铃的影响。



缩放技术

使用色彩空间校正调整大小

虽然缩放效果非常好,但大多数人没有正确使用它。即使我通常也直接在图像上使用缩放,按原样,因此从技术上讲,我的图像缩放方式不正确。图像通常使用非线性的“sRGB”颜色空间或伽马校正进行存储。有关详细信息,请参阅人类颜色感知。但缩放(像大多数其他图像处理操作符一样)是一个数学线性处理器,它假设图像值直接表示线性颜色亮度。“sRGB”颜色空间基本上包含大约 2.2 的伽马校正。实际上,它比涉及两条独立曲线的要复杂。请参阅维基百科,sRGBW3org,sRGB互联网的默认颜色空间。从 6.7.5 版本开始,ImageMagick 遵循此约定并将图像的默认颜色空间(至少对于大多数图像文件格式)定义为 sRGB。这意味着我们只需要使用“-colorspace”将图像转换为线性空间,然后进行缩放。
不建议在低质量 Q8 版本的 IM(请参阅质量)上使用颜色校正,因为如此低的内存质量会造成精度损失。
NASA 图像“地球城市灯光”是一个非常极端的案例,其中非线性颜色空间效应对图像缩放结果有很大影响。在这里,我们直接缩放图像,不进行颜色空间校正……

  magick earth_lights_4800.tif -resize 500 earth_lights_direct.png
[IM Text]
在这里,我们将图像从非线性 sRGB 转换为线性 RGB,然后缩放,再转换回来……

  magick earth_lights_4800.tif -colorspace RGB     -resize 500    \
          -colorspace sRGB  earth_lights_colorspace.png
[IM Text]
如你所见,图像中的“灯光”亮得多,因为它们没有受到源图像非线性颜色空间的很大影响。虽然大多数图像的影响不如上述示例中那样大,但它确实存在,并且可能产生许多影响。从 sRBG 的非线性效应中可以看到的主要影响是,较暗的颜色被保存为更暗的值(以便在感知上更相关)。但由于它们较暗,因此在数学上无法正确处理,因此生成的 sRGB 图像比在像 RGB(或 LAB 或 LUV)这样的线性颜色空间中处理的图像更暗。另请参阅颜色处理真实图像使用伽马和颜色空间校正绘图。相同的正确颜色空间处理也适用于扭曲(椭圆滤波器)、图像模糊的使用,并且会对图像量化、抖动和有序抖动产生很大的影响。这将在重采样滤波器中详细介绍。警告:RGB 颜色空间可能会在涉及强烈原色变化(不仅仅是在黑色和白色之间)的边缘产生裁剪问题。请参阅下一节。
在 IM 6.7.5 之前的版本中,默认输入颜色空间是“RGB”。“sRGB”颜色空间实际上意味着“从 sRGB 转换为线性 RGB”。结果是这两个标签被交换了!奇怪但真实。由于此原因,旧版本的 ImageMagick 需要使用交换后的颜色空间名称进行上述颜色空间校正。像这样……

  magick earth_lights_4800.tif -colorspace sRGB \
          -resize 500  -colorspace RGB  earth_lights_colorspace.png
*** 此示例已弃用 ***
请注意,“-colorspace RGB”操作实际上并不需要,因为它在保存到 PNG 图像文件格式时会自动执行。以上内容来自 IM 论坛讨论正确缩放

使用伽马校正缩放

这是使用伽马校正正确缩放图像的方法。

  magick earth_lights_4800.tif   -gamma 0.454545 \
          -resize 500    -gamma 2.2  earth_lights_gamma.png
[IM Text]
伽马逆运算“-gamma 0.454545”的替代方法是使用“-evaluate POW 2.2”。请注意,伽马校正只是对将图像从/到 sRGB 颜色空间正确转换的大致匹配,但它非常接近,以至于你很难看出颜色空间与伽马校正之间的任何区别。伽马校正也不会干扰 IMv7 的 RGB/sRGB 颜色空间设置,因此在确切版本未知时可能是更好的选择。你可能还想看看“-auto-gamma”操作符,它尝试调整图像,以便生成相等数量的明暗区域(假设图像位于线性颜色空间中)。

在 LAB 色彩空间中调整大小

使用 sRGB、RGB 甚至 XYZ 颜色空间进行缩放或任何类型的图像处理的一个问题是,3 个颜色通道不仅表示颜色,还表示强度或亮度。这意味着,如果一个通道发生失真(例如被裁剪),则像素颜色也会发生失真,并可能导致奇怪的外观。LAB 颜色空间不仅是线性颜色空间,而且设计为将强度(L 通道)与两个颜色通道(A* 和 B* 通道)分离。这意味着,如果任何一个通道被裁剪,它不会产生颜色偏差。这也意味着,除非你专门处理纯黑和白图像,否则通常没有一个通道实际接近裁剪限制,这在现实生活中的图像中并不常见。因此,通过使用 LAB 颜色空间处理图像,实际上效果更好,并且避免了在使用 RGB 或 XYZ 颜色空间时可能出现的裁剪和颜色偏差。
在 IM v6.7.8-2 之前,A* 和 B* 通道的 LAB 值使用有符号整数存储在无符号整数内存空间中。这在负值和正值之间造成了不连续性,不允许正常处理工作,只能进行图像格式转换。

这意味着在旧版本的 IM 中,LAB 颜色空间中的图像处理不起作用,尤其是在涉及正值到负值的颜色的情况下。即在处理蓝黄和红绿之间变化的颜色时。

在此版本之后,这些值在内部使用 50% 的偏差进行存储,消除了不连续性,从而允许线性运算按预期工作。

对于涉及“锐化”重采样滤波器(非常常用)的缩放,使用 Lab 颜色空间也将缓和极端的强度变化,这会在主要 RGB 颜色中产生过度强烈(以及范围裁剪)的振铃伪影。例如……

  magick rose: -colorspace RGB  -filter Lanczos  -distort resize 300x \
          -colorspace sRGB rose_distort_rgb.png
  magick rose: -colorspace LAB  -filter Lanczos  -distort resize 300x \
          -colorspace sRGB rose_distort_lab.png
[IM Output]
原始图像
==> [IM Output]
RGB 颜色空间
[IM Output]
LAB 颜色空间
如你所见,虽然玫瑰的边缘在线性 RGB 颜色空间中被裁剪了,但在 LAB 颜色空间中却没有被裁剪。在 RGB 颜色空间中,玫瑰的底部边缘的颜色从近乎纯白色变为近乎纯红色,导致“绿色”和“蓝色”通道发生强烈的(负)变化。这会产生非常强的“负叶”振铃效应,然后在 RGB 颜色空间中被裁剪。最终结果是由于滤波器的锐化效果导致严重的色彩失真。在 LAB 颜色空间中,从白色到红色的转变在强度或颜色通道中都不那么强烈,因此虽然我们在强度上获得了良好的锐化,但它和颜色通道都没有被裁剪,从而避免了颜色失真。结果是一个更好的缩放图像,滤波器具有更合适的锐化效果。只需将强度与颜色分离。

使用 LUV 颜色空间缩放

从 IM v6.7.8-8 开始,IM 还实现了密切相关的颜色空间 LUV。它们都旨在感知上保持一致(线性),甚至共享相同的关键强度“L”或“亮度”通道结果,尽管计算颜色通道的方式不同。主要区别在于 LUV 颜色轴进行了调整,以便具有感知上相等的色差(颜色差异),这导致与 LAB 颜色空间略微不同的颜色刻度,尽管两者之间的强度保持不变。请参阅Adams 色彩价颜色空间。LAB 和 LUV 之间的缩放结果实际上是相同的。

  magick rose: -colorspace LUV  -filter Lanczos  -distort resize 300x \
          -colorspace sRGB  rose_distort_luv.png
[IM Output]
有关这两个颜色空间的更多信息,请参阅颜色空间

使用不同色彩空间调整大小的总结
或者为什么不使用 LAB 或 LUV 进行缩放呢?

因为像 sRGB 一样,LAB 和 LUV 颜色空间是非线性感知颜色空间!数学运算只适用于线性值。例如,以下是“地球城市灯光”图像在“Lab”颜色空间中缩放的结果。

  magick earth_lights_4800.tif -colorspace Lab     -resize 500    \
          -colorspace sRGB  earth_lights_lab.png
[IM Text]
结果与你直接在感知 sRGB 颜色空间中缩放时获得的结果几乎相同。但在感知颜色空间中缩放真的是一件坏事吗?这确实是一个有争议的问题。避免颜色通道裁剪似乎很重要,而颜色偏移(不同颜色通道的不等变化)则不太重要。但 LAB 和 LUV 图像是线性的、感知上的!因此,在线性感知颜色空间中混合颜色(这实际上是重采样滤波器所做的)可能实际上是一件好事。最后一点,sRGB 仅在主要颜色分量的强度上感知线性。它实际上在颜色上并不是感知线性的,因此它仍然是一个不利于进行任何形式的图像缩放的颜色空间。Nicolas Robidoux 对此做了很好的总结……
通常,线性光颜色空间(线性 RGB 和 XYZ)会产生夸大的暗晕,而“感知”颜色空间(sRGB、LAB、LUV)会产生夸大的亮晕。

如果你思考一分钟,这完全说得通,因为感知颜色空间在强度谱的较暗端打包了大量比特,并“掏空”了较亮端,以便模仿 HVS(人类视觉系统)。因此,在 sRGB 中,1 个单位的暗过冲比在线性 RGB 中“更远”,但在线性 RGB 中,1 个单位的光过冲比在 sRGB 中“更远”。

S 形化(见下文)平等地对待暗和亮过冲,并且通常会抑制两者的极端。


使用 S 形色彩空间调整大小

在 ImageMagick 讨论论坛上的一个冗长讨论中,重采样滤波器晕影的 S 形最小化。已经开发了一种新技术,而不是尝试在线性颜色空间中缩放图像,而是使用S 形颜色修改操作符-sigmoidal-contrast)在修改后的颜色空间中缩放图像。这可以减少可能沿着非常锐利的边缘产生的极端晕影或振铃伪影的裁剪。例如,以下是一系列在数字图像处理论坛上讨论过的“改进”缩放技术……

  magick rose: -colorspace RGB  -filter Lanczos  -resize 200x \
          -colorspace sRGB rose_resize_RGB.png
  magick rose: -colorspace RGB  -filter Lanczos  -distort resize 200x \
          -colorspace sRGB rose_distort_RGB.png
  magick rose: -colorspace RGB   +sigmoidal-contrast 6.5,50% \
          -filter Lanczos  -distort resize 200x \
          -sigmoidal-contrast 6.5,50% -colorspace sRGB  rose_sigmoidal_RGB.png
[IM Output]
缩放(普通线性)
[IM Output]
扭曲(圆柱形)
[IM Output]
S 形变化

上面最后一个示例实际上做的是降低图像的对比度,将中间调的灰色压缩到更窄的线性范围内,同时在调整大小之前将极值从裁剪边缘进一步拉开。然后它在之后删除了该修改。这反过来会弱化颜色值的极端影响,同时仍然允许滤镜以线性方式处理中间调,从而减少颜色失真。在很多方面,这类似于在默认的非线性 sRGB 色彩空间中调整图像大小(这是一种过于普遍的做法),但对明亮和黑暗的环绕伪影都同样有效。也就是说,它在整个颜色值范围内是对称的,而 sRGB 色彩空间中的调整大小仅适用于颜色范围的较低暗端(上面提到的蓝色和绿色值)。也就是说,这是一种更受控的技术。也有人评论说,这种 S 形变化可能只对放大有效。还可以针对不同的图像尝试 S 形对比度强度(上面为 6.5)的不同值。请记住,就像每种调整大小技术一样,结果是高度主观的,可能不适合所有图像类型。
S 形变换本质上是生成一个特殊的 DIY 非线性色彩空间,它建立在使用非线性感知色彩空间(sRGB)时获得的先前结果的基础上。

请注意,在 RGB 色彩空间中使用非线性颜色通道调整图像大小(扭曲)会导致每个颜色通道的结果略有不同。这会导致轻微的颜色偏移(与我们之前看到的颜色裁剪相反)。

这仅在具有混合颜色强度通道的非线性色彩空间(如 sRGB 或 S 形色彩空间)中存在问题。


锐化调整大小 (USM)-- Photoshop 调整大小技巧

通常,调整图像大小(缩小或放大)会增加一些模糊度(模糊伪影)到图像中。因此,许多人喜欢使用各种滤镜(请参阅 重采样滤镜)进行尝试,以使结果更清晰。但这可能会在图像结果中添加其他 调整大小伪影。一种常用的方法是在调整大小后锐化图像。通常,这是使用特殊且名称奇怪的 锐化操作 完成的,该操作包含更多控件来控制结果的质量。例如,让我们“锐化”非常模糊的 '样条曲线' 滤镜图像的结果...

  magick logo: -filter spline -resize 150x logo_spline.png
  magick logo: -filter spline -resize 150x \
          -unsharp 0x1  logo_spline_unsharp.png
[IM Output]
样条曲线
==> [IM Output]
锐化
如您所见,在调整大小后锐化图像可以改善结果。特别是查看星星和帽子的细节。您将获得非常清晰的图像,没有任何混叠、环绕或甚至效果变暗。虽然 样条曲线滤镜 本身并不是一个特别好的滤镜,但这种锐化(实际上是“去锐化”)方法适用于任何滤镜。它还提供了更多控件来微调结果。实际上,这就是“photoshop”用来提高其调整大小图像质量的方法,尽管我不知道它对 锐化操作 使用了哪些设置。“GIMP”的默认值(半径=6,量=0.5,阈值=0)用于锐化相当于“-unsharp 12x6+0.5+0”,这是正确的(除了忽略 GIMP 将硬半径设置为 sigma 的两倍)。但是请记住,您确实不需要在 ImageMagick 中指定内核半径,因此“-unsharp 0x6+0.5+0”的值将效果更好。另请参阅 IM 论坛主题 GIMP 中的锐化参数。帖子 图像调整大小 建议使用“-unsharp 0x0.75+0.75+0.008”作为大于 500 像素的图像的良好选择。而 Open Photography Forum 讨论 使用 ImageMagick 进行下采样 建议使用“-unsharp 1.5x1+0.7+0.02”。

调整大小以填充给定空间

基本上:将大型图像调整大小以完全填充特定图像大小,但裁剪任何不适合图像的部分。
从 IM v6.3.8-3 开始,新的调整大小标志“^”将允许您将其直接作为单个调整大小步骤执行。这些示例表示可用于旧版本 IM 用户的替代方法。请参阅上面 调整大小填充标志
解决方案相当棘手,因为用户在调整图像大小时通常需要将整个图像放入给定大小中。由于图像的纵横比保持不变,因此在您尝试填充的区域中会留下额外的未使用空间。这里我们尝试将图像调整大小以填充 80x80 的框。

  magick logo: -resize 80x80\> \
          -size 80x80 xc:blue +swap -gravity center  -composite \
          space_resize.jpg
[IM Output]
在上面,我们添加了一个背景画布来填充调整大小框中未使用的部分,以显示我们希望图像填充的空间,但它没有填充,因为它保留了图像的纵横比。现在,如果您的所有图像都是横向样式(宽度大于高度),那么您当然可以将图像调整大小以适合区域的高度或宽度,然后使用“-crop”将图像裁剪以使其完全适合。

  magick logo:    -resize x80  \
          -gravity center  -crop 80x80+0+0 +repage   space_crop.jpg
[IM Output]
问题是,以上方法仅处理横向样式的图像。如果图像是纵向样式(高度大于宽度),则会严重失败。当然,可以通过脚本首先获取图像的尺寸,然后选择正确的方法将图像放入所需空间中来解决此问题。但更好的解决方案是让 IM 为所有图像完成所有工作。IM 中的解决方案是通过分别调整每个图像尺寸的大小来处理图像。然后选择两个结果中较大的图像。为了简化操作,调整大小本身具有内置的测试选项,该选项仅在调整大小会使图像变大时才会调整图像大小。这允许我们使用非常巧妙的解决方案来解决我们的问题。

  magick logo: \
          -resize x160 -resize '160x<'   -resize 50% \
          -gravity center  -crop 80x80+0+0 +repage  space_fill.jpg
[IM Output]
在上面,该系列中的第二次调整大小仅在第一次调整大小产生的宽度小于我们尝试填充的区域时才会调整大小。选择调整大小的特定顺序(先高度,然后宽度),因为大多数图像都是照片,通常水平较长。使用上述排序,这种情况下将导致跳过第二次调整大小操作。如果您的图像更常见的是纵向图像(垂直较长),则更改参数以先按高度调整图像大小,然后按宽度调整图像大小。例如...

  magick logo: \
          -resize 160x -resize 'x160<'   -resize 50% \
          -gravity center  -crop 80x80+0+0 +repage   space_fill_2.jpg
[IM Output]
这两个示例的结果应该非常相似,并且该命令适用于横向和纵向样式的图像,尽管它对其中一种样式效果更好。此方法最大的问题是图像现在被调整大小 2 到 3 次,在最终结果中产生额外的模糊和其他可能的伪影。为了减少这种情况,初始调整大小是在最终尺寸的两倍处执行的,这假设原始图像至少是最终所需结果的 3 倍或更多。对于缩略图制作来说这不是问题,但需要牢记这一点。

调整线条图大小

对包含细线的图像进行强力调整大小可能会带来很大问题……将图像调整大小为非常小的缩略图会导致只有几个像素宽的细线逐渐消失并融入背景。这可能会变得非常糟糕,我见过线条图的缩略图完全空白!也就是说,原始图纸的每个细节都“消失了”,使缩略图变得毫无用处。如果这是问题,有一些技术可以提供帮助……
  • 调整大小,然后调整对比度以使线条更清晰。但这会使线条出现更多混叠(阶梯状)。它还限制了此技术的应用范围。
  • 模糊并阈值化图像(一种与形态“膨胀”或“腐蚀”非常相似的方法),以使单像素线条变厚约 300%。现在,在将图像调整大小 1/3 后,图像会变小,但线条会像以前一样保持强劲和可见。
  • 使用 加厚形态 技术加粗线条。您可能希望分阶段进行调整大小,每次将图像加粗并调整大小 50%,直到达到最终大小。尽管随着线条之间间距的缩小,您可能会发现最终得到的是“斑点”而不是线条图。也就是说,您可能会遇到相反的问题。但是,调整加粗与调整大小的比率应该会产生可接受的结果。
  • 将图像中的线条边缘与纯色区域分开,并使用不同的方法调整每个区域的大小(使用上述方法调整线条)。之后,可以将这两个部分合并回一起,从而允许您保留图像的线条边缘。这实际上会重现您在调整矢量图像大小时经常获得的效果。
  • 将图像转换为矢量图像,然后调整大小。这可能很棘手,但也可能为调整线条图大小提供最佳结果,具有完美的抗锯齿(清晰)边缘和清晰的图像。
如果您想出了其他有效调整线条图大小的方法,或者尝试了上述一些技术,请告诉我(以及其他 IM 用户)。