【问题标题】:Crop and resize image around a custom focus point围绕自定义焦点裁剪和调整图像大小
【发布时间】:2020-07-14 15:04:31
【问题描述】:

故事

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

但是,图像不应使用“北”或“中心”重力进行裁剪,而应具有已定义的中心位置,即 图像应该被裁剪。为此,图像具有以百分比表示中心点的xy 值; x=50,y=50 意味着 图像的焦点实际上在中间。

我在这里和 imagemagick 论坛上进行了搜索,但找不到任何合适的东西,除了“切断图像的某个部分然后调整它的大小”。 我不确定这是否可以在一个 imagemagick 命令中完成,或者我是否需要自己计算所有内容并基本上创建一个空画布,将图像放在上面,移动并调整图像大小,然后将其他所有内容剃掉实现这一目标。

我想要达到的目标

我需要一个 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 的解决方案也可以)

【问题讨论】:

  • 当您使用“-crop”时,您可以通过设置重力来指定裁剪件的尺寸和中心点。试试... -gravity center -crop 1440x560+480+140 ... 之类的东西。您不能像尝试的那样将尺寸与百分比混合。此外,“-region”需要偏移量,但无论如何都不会做你想做的事情。
  • 此外,您可以通过多种方式轻松修改图像,并在单个 ImageMagick 命令中创建多个输出图像。也许澄清您对在那里尝试做的事情的描述,以便我们提供示例。
  • 添加了一个简短且希望清晰的“我想要实现的目标”部分。它基本上是一个图像和一个图像大小的一个命令
  • -region 需要偏移来指定其左上角。使用 -region 没有意义,只需为裁剪命令计算正确的左上角。您如何定义希望作物中心出现的位置? -crop 不使用 % 作为偏移量。但是您可以从 %.在 IM 7 中这很容易。对于 IM 6,您需要提前计算它们。你的平台是什么——Unix 还是 Windows?为什么不先裁剪,然后根据需要调整大小?
  • 感谢您的解释。我编辑了我的问题并添加了一个可视化,希望它会有所帮助。我还在问题的底部添加了环境信息。最后,该命令在 Rails 应用程序中使用,该应用程序将构建和缓存裁剪后的图像,因此我需要一个简单的命令来传递给 imagemagick,或者如果它更复杂,我必须构建一些东西靠我自己让它在 Rails 框架内发生。但是,如果我可以让它在终端中工作,我可以让它在轨道上工作,所以......

标签: image-processing imagemagick imagemagick-convert


【解决方案1】:

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

此命令将读取您的输入图像并将输出视口设置为 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 输出画布的新中心。

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

已编辑添加...

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,并将图像缩放到该比例。

【讨论】:

  • 只是摆弄了一下,这似乎对我有很大帮助,谢谢您的回答!所以我现在只需要计算原始图像需要按比例缩小多少,以免在图像的某些边缘周围产生填充,如果我将其缩放太多就会发生这种情况。下班后我会回到这里,等我有时间真正尝试一下。
  • ImageMagick 可以使用 FX 表达式计算命令内的比例。请参阅我对上述答案的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多