围绕自定义焦点裁剪图像并调整图像大小

Crop and resize image around a custom focus point

故事

我想要完成的事情的概述:我有一些照片需要裁剪和调整大小,一次用于缩略图视图(大约 295x195),一次用于 "header-image" 样式视图(大约 1400x560) .原始照片大小不一,最大的约为 2440x1600。这不是要解决的问题。

但是,不应使用 "North" 或 "Center" 重力裁剪图像,而应具有定义的中心位置 图像应该被裁剪。为此,图像具有 xy 值,以百分比表示中心点; x=50,y=50 表示 图像的焦点实际上在中间。

我在这里和 imagemagick 论坛上进行了搜索,但找不到任何合适的东西,除了 "cutting off a certain part of an image and then resize it"。 我不确定这是否可以在一个 imagemagick 命令中完成,或者我是否需要自己计算所有内容并基本上创建一个空 canvas,将图像放在上面,移动图像并调整图像大小,然后剃须关闭其他一切来实现这一目标。

我想达到的目标

我需要一个 imagemagick 命令来

我将为每个图像和所需的每个尺寸使用一个命令。

这是我用草图和演示图片制作的简短可视化图,希望能让我更容易理解我正在尝试做的事情:

左边的图像是我在282,282处设置对焦点的基础图像。右边的是我想要的295x195px尺寸的裁剪(上面没有线条,它们只是为了演示问题)。如您所见,裁剪的中心点就是原始图像上的焦点。

我试过的

我的第一次尝试是尝试使用 -crop 的偏移值来设置图像的焦点:

convert photo.jpg -resize 1440x560^ -crop "1440x560+25%+25%" result.jpg

但我很快了解到这不是它的工作方式,因为它会导致图像太小(例如当坐标位于图像的左下角时)并且通常会被截断 图像中可以通过焦点看到的部分,这在阅读文档后很有意义。

然后我看到了 -region 选项并尝试使用它,图像大小为 2400x1600 并从我的图像中进行各种剪切:

convert photo.jpg -region 610x400 -resize 1440x560^ -crop 1440x560+0+0 result.jpg

区域选项的唯一影响是,无论我输入什么值,我都会得到相同的图像剪切,并且它总是在图像上放置扭曲的白色水平条纹。

任何指向正确方向的提示(有或没有代码示例)都会有所帮助,所以我知道在哪里可以更深入地挖掘。

环境

ImageMagick 中的“-distort SRT”运算符可以一次缩放图像、调整 canvas 大小以及将一个点从一组坐标移动到另一组坐标。

此命令将读取您的输入图像并将输出视口设置为 295x195。然后它使用“-distort SRT”将输入图像缩放到 50%,将起始中心点 +282+282 移动到新的输出中心点 +147.5+97.5,并将视口大小更改为 295x195.

convert input.png -set option:distort:viewport 295x195 \
   -distort SRT "282,282 0.5 0 147.5,97.5" result.png

扭曲参数以您希望成为操作中心的点“+282+282”开头。然后比例“0.5”将尺寸减小到 50%。 “0”参数表示旋转了多少度,但你没有旋转图像,所以是“0”。最后一个参数是着陆点,“+147.5+97.5”,作为起点,因此它成为 295x195 输出的新中心 canvas.

当然,如果您使用各种大小的输入,则必须手动插入和调整参数。

编辑添加...

ImageMagick 可以使用 FX 表达式计算缩放图像的量。这是相同的命令,其中 FX 表达式将 X 偏移量或输出视口的中心除以输入图像使用的 X 偏移量。

convert input.png -set option:distort:viewport 295x195 \
   -distort SRT "282,282 %[fx:147.5/282] 0 147.5,97.5" result.png

将原始 282 X 坐标点置于 147.5,并将图像缩放到该比例。