围绕自定义焦点裁剪图像并调整图像大小
Crop and resize image around a custom focus point
故事
我想要完成的事情的概述:我有一些照片需要裁剪和调整大小,一次用于缩略图视图(大约 295x195),一次用于 "header-image" 样式视图(大约 1400x560) .原始照片大小不一,最大的约为 2440x1600。这不是要解决的问题。
但是,不应使用 "North" 或 "Center" 重力裁剪图像,而应具有定义的中心位置
图像应该被裁剪。为此,图像具有 x
和 y
值,以百分比表示中心点; x=50,y=50
表示
图像的焦点实际上在中间。
我在这里和 imagemagick 论坛上进行了搜索,但找不到任何合适的东西,除了 "cutting off a certain part of an image and then resize it"。
我不确定这是否可以在一个 imagemagick 命令中完成,或者我是否需要自己计算所有内容并基本上创建一个空 canvas,将图像放在上面,移动图像并调整图像大小,然后剃须关闭其他一切来实现这一目标。
我想达到的目标
我需要一个 imagemagick 命令来
- 取一张图像作为输入
- 根据我的焦点(百分比或像素)调整大小并将其裁剪为给定大小(例如 295x195)
- 输出给定大小的图像,焦点在中间
我将为每个图像和所需的每个尺寸使用一个命令。
这是我用草图和演示图片制作的简短可视化图,希望能让我更容易理解我正在尝试做的事情:
左边的图像是我在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
区域选项的唯一影响是,无论我输入什么值,我都会得到相同的图像剪切,并且它总是在图像上放置扭曲的白色水平条纹。
任何指向正确方向的提示(有或没有代码示例)都会有所帮助,所以我知道在哪里可以更深入地挖掘。
环境
- 用于开发的 macOS Catalina
- 包含代码的应用程序将 运行 在 debian buster
上
- 本地imagemagick版本为7.0.8-66
- 服务器 imagemagick 版本是 6.9.10-23(我可以通过手动构建更新它,不过,有一个只适用于 IM7 的解决方案就可以了)
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,并将图像缩放到该比例。
故事
我想要完成的事情的概述:我有一些照片需要裁剪和调整大小,一次用于缩略图视图(大约 295x195),一次用于 "header-image" 样式视图(大约 1400x560) .原始照片大小不一,最大的约为 2440x1600。这不是要解决的问题。
但是,不应使用 "North" 或 "Center" 重力裁剪图像,而应具有定义的中心位置
图像应该被裁剪。为此,图像具有 x
和 y
值,以百分比表示中心点; x=50,y=50
表示
图像的焦点实际上在中间。
我在这里和 imagemagick 论坛上进行了搜索,但找不到任何合适的东西,除了 "cutting off a certain part of an image and then resize it"。 我不确定这是否可以在一个 imagemagick 命令中完成,或者我是否需要自己计算所有内容并基本上创建一个空 canvas,将图像放在上面,移动图像并调整图像大小,然后剃须关闭其他一切来实现这一目标。
我想达到的目标
我需要一个 imagemagick 命令来
- 取一张图像作为输入
- 根据我的焦点(百分比或像素)调整大小并将其裁剪为给定大小(例如 295x195)
- 输出给定大小的图像,焦点在中间
我将为每个图像和所需的每个尺寸使用一个命令。
这是我用草图和演示图片制作的简短可视化图,希望能让我更容易理解我正在尝试做的事情:
左边的图像是我在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
区域选项的唯一影响是,无论我输入什么值,我都会得到相同的图像剪切,并且它总是在图像上放置扭曲的白色水平条纹。
任何指向正确方向的提示(有或没有代码示例)都会有所帮助,所以我知道在哪里可以更深入地挖掘。
环境
- 用于开发的 macOS Catalina
- 包含代码的应用程序将 运行 在 debian buster 上
- 本地imagemagick版本为7.0.8-66
- 服务器 imagemagick 版本是 6.9.10-23(我可以通过手动构建更新它,不过,有一个只适用于 IM7 的解决方案就可以了)
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,并将图像缩放到该比例。