在ImageMagick中,我该如何将图像缩小到刚好裁剪为特定尺寸?

14
例如,如果我有一张尺寸为1600x1200的大图像,但是我想要生成一个250x200的缩略图(高度和宽度比例不同)——如何将其缩小到指定的尺寸并居中裁剪?是否可以使用convert在一行命令中完成此操作?
2个回答

28

缩小图片并填充给定区域(如果必要,拉伸输出图像)

如果您想将图像缩小到250x200像素(不保持宽高比),完全填充250x200的空间(必要时拉伸/扭曲图像),请使用以下代码:

  convert            \
     input.jpeg      \
    -scale 250x200\! \
     output1.png

(注意在比例尺几何设置后面的 \! 字符!)
.jpeg.png后缀替换为您所拥有和想要的任何格式后缀,ImageMagick 将自动处理它。


缩小 + 适应给定区域(保持纵横比,如果需要,可以放弃一些给定的区域)

如果您想缩小图像并将其适应到 250x200 像素内,并保持原始图像的长宽比(高度与宽度的比率),并且裁剪未使用的 250x200 像素中的那个维度,请使用:

  convert          \
     input.jpeg    \
    -scale 250x200 \
     output2.png
默认情况下,-resize 参数中给定的宽度和高度是最大值(除非您将其指定为百分比)。这意味着: 输出图像会扩展或缩小以适应指定的尺寸,并保持图像的纵横比。

以下命令“尝试”将尺寸设置为250x200:

  • 当高度从原来的1200像素缩小到200像素时(占原始值的16.6666%),宽度现在为266.66像素。所以它还不符合要求....

  • 当宽度从原来的1600像素缩小到250像素时(占原始值的15.625%),高度现在为187.5像素。所以它现在符合要求,并且可以在顶部和底部留下一些空间。

因此,最终的尺寸将是250x187或更可能是250x188像素(在高度上无法有像素分数,需要使用整数!)。


缩小 + 在指定区域居中显示结果 (并使用某些背景颜色填充剩余空间)

如果您想将大小缩小到250x200像素内,并保持原始图像的纵横比,并创建一个完整的250x200像素大小的图像,通过添加一些黄色背景使真实图像在该空间中居中显示,请使用:

  convert              \
     input.jpeg        \
    -scale 250x200     \
    -gravity center    \
    -background yellow \
    -extent 250x200    \
     output3.png

更改背景颜色为你喜欢的其他颜色,或使用none设置透明背景(不支持JPEG输出!)。


按比例缩小 + 无需剪裁到给定区域

如果您想将图像按比例缩小到250x200像素并完全填充250x200的空间(但不裁剪任何溢出),请使用以下代码:

  convert             \
     input.jpeg       \
    -scale '250x200^' \
     output4.png

(注意,在设置比例尺几何图形后,加上了^字符。这个^特性需要ImageMagick版本至少为6.3.8-2 )
当使用-scale-resize参数并添加^时,修改宽度和高度的值将被视为最小值,只有其中一个维度达到指定的值。这意味着:输出图像会扩展或收缩,直到宽度或高度与其指定的维度匹配,并保持图像的纵横比。

下面的命令“尝试”将尺寸设置为250x200:

  • 当高度从原始1200像素缩小到200像素(仅为原始值的16.6666%)时,所需的缩放效果就已实现。此时宽度为266.66像素。四舍五入后为267像素。

  • 因此,最终的尺寸将是267x200像素。


保持纵横比缩小+ 裁剪到给定区域

如果要将图像缩放到250x200像素并保持其纵横比,完全填充250x200的空间(从左侧和右侧边缘裁剪掉条纹),请使用:

  convert             \
     input.jpeg       \
    -scale '250x200^' \
    -gravity center   \
    -extent 250x250   \
     output5.png

最终图像的尺寸将为250x200。与之前的命令相比(得到了一个250x267的结果),左右两侧的一些像素列将被移除。


谢谢。-extent和-crop有什么区别? - ensnare
@ensnare:-crop从图像中剪切出一个或多个矩形区域。-extent设置图像大小(如果给定,则设置图像偏移量),如果图像被放大,则未填充的区域将设置为当前背景颜色。这两个选项都可以使用比当前图像更大或更小的尺寸,但这看起来有点违反直觉:将“裁剪”到更大的区域,或将“扩展”到更小的区域。 - Kurt Pfeifle
...所以这两者之间并没有太大的区别——除了-crop通常需要额外的+repage参数:(1)在裁剪之前,将裁剪坐标框架重新定位到当前可见图像的左上角;(2)或者在裁剪之后,删除可能留下的页面偏移量。 - Kurt Pfeifle
1
在您的“保持纵横比缩小+裁剪到给定区域”示例中,“-extent 250x250”是否应该是“-extent 250x200”? - kanitw

3

被采纳的答案并没有满足问题的要求。

如果您需要精确的输出尺寸(例如250x200),请使用以下命令:从原始图像中提取最大信息,并裁剪多余部分以保持纵横比,然后使用以下命令:

convert input.jpg -scale "250x200^" -gravity center -crop 250x200+0+0 output.jpg


1
他的“缩小保持纵横比+裁剪到给定区域”的解决方案对我很有效。 - MichaelHabib

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接