ImageMagick转换中的sample / resample / scale / resize / adaptive-resize / thumbnail运算符有什么区别?

我发现了多种方法来改变使用convert的图像分辨率:

 -sample -resample -scale -resize -adaptive-resize -thumbnail 

那些有什么不同?

如果我需要制作具有固定宽高比(裁剪需要)的各种尺寸的大图片缩略图 – 我最好的select是什么?

调整

-resize 400x300+20+30 (如-resize 400x300+20+30和示例示例)将input转换为像素尺寸为400x300的输出图像。 它还将输出向右移动20个像素,向底部移动30个像素。 另外,还有一些不同之处在于:

  • -resize确实支持-filter的额外设置( 使用-resize 之前 ,这应该发生在命令行上)。

  • -filter确定在放大的情况下用于添加像素的颜色的精确algorithm,或者在缩小的情况下删除其中一些邻居时用于其余像素的颜色。

  • 有关支持的filter列表,只需运行convert -list filter

  • -filter point -resize 400x300创build与-filter point -resize 400x300完全相同的结果,但运行速度仍然较慢。

  • 如果没有设置(之前) -resize ,转换将默默地默认为 – -filter Lanczos这是较慢,但生成一个更好的质量(因为它考虑到所有周围的像素为新添加的颜色)比-filter point产生(使用最近邻居规则来确定新添加的像素的颜色)。

样品

-sample 400x300将input图像转换为像素尺寸为400x300的输出图像。 但是,有一些非常重要的差异,

  • -sample不支持-filter的附加设置; 如果无论如何设置,那么简单地忽略-filter器。

  • 放大时(因为input的图像尺寸可能小于400x300 ),像素会以块的forms进行复制。

  • 缩小时(因为input的图像尺寸可能大于400x300 ),像素采用一种非常简单的algorithm进行400x300采样:一些行和列被简单地跳过。

  • -resize几何参数不支持任何偏移量部分(不同于-resize ,它表示输出的偏移量指令)。

  • 输出永远不会有比input图像更多(不同)的颜色; 它可能会有更less的颜色。

  • 因此 – -resize非常快(比-resize ),但是输出质量(通常)更糟糕:在结果输出中可以很容易地得到极端的阻塞和混叠效应。

  • 一个重要的特征是新图像不会包含任何新的颜色,尽pipe原始图像中的一些颜色可能会消失。

重采样

-resample使用所需的-resample 分辨率作为参数,而不是目标图像的XxY像素几何体 。 这个操作符的目的是为了保留一个图像的渲染大小:假设你的图像尺寸为4英寸乘3英寸的设备呈现在300 DPI。 然后,要求“ -resample 72或“ -resample 72x72将调整图像大小,使其在72 DPI设备上再次测量4英寸x 3英寸。

  • 此操作仅适用于已经在其元数据中存储了所需分辨率的图像(并非所有图像格式都支持图像分辨率的概念 – JPEG,PNG和TIFF)。

  • 如果源图像的格式缺less对图像分辨率的内部支持,则必须指定“ -resample分辨率” 之前通过命令行上的-resample指定图像的(假定的)原始分辨率。

规模

-scale 400x300产生相同的结果(但速度更快,因为它避免了所有的filter处理),就像使用-filter box -resize 400x300 。 它也完全忽略了任何当前的-filter设置。

  • 缩小时,只需通过将各个input像素颜色平均在一起来replace像素颜色,即可改变图像大小。

  • 放大时,只需复制所需的附加像素的相应input像素。

自适应resize

-adaptive-resize 400x300不支持(或者忽略,如果设置) 几何参数的偏移量部分,并且还忽略-gravity设置(如果存在)。

  • 它在resize时默认使用与数据相关的三angular剖分 (除非通过额外指定-filter [something]覆盖resize方法)。

缩略图

-thumbnail工作方式就像-resize一样,有一些不同之处:

  • 它针对速度进行了优化。

  • 它还会删除任何embedded的颜色configuration文件以减less缩略图的文件大小。


以下答案显示了-resize指令的一些(说明!)示例。 每个插图显示了不同的结果,具体取决于精确resize方法的“细节”:

  • ImageMagick裁剪命令没有给出完美的结果