【问题标题】:ImageMagick rotate and crop batch imagesImageMagick 旋转和裁剪批量图像
【发布时间】:2020-02-01 23:17:00
【问题描述】:

我正在尝试使用 ImageMagick 来模拟 Gimp 的旋转和裁剪功能,以便在一批图像上使用它。

我在 Gimp 中要做的是打开 .jpg 图像,使用具有以下选项的旋转工具:0.2°、三次插值和以原始图像比例裁剪。之后,在图像边框周围再进行一次裁剪,该过程就完成了,我可以将图像另存为 .png

我没有使用 Gimp,因为内置程序 gimp-drawable-transform-rotate-default 只接受带两位小数的弧度。我试图找到一种方法来编辑该 procudere 并创建自己的,但我无法这样做

我还建议使用 ImageMagick,因为批量非常大(50k+ 图像),因此,您能帮我使用控制台命令来模拟我对 Gimp 的操作吗?特别重要的部分是与原始图像比例的裁剪

编辑:

当您旋转图像时,如果° 不是 90-180-270 等...,图像的大小会增加,因此必须创建新的像素。以下作物必须:

  1. 删除在旋转过程中添加的所有像素以填充空白空间
  2. 最终比例必须尽可能接近初始比例
  3. 原始图像中出现的要裁剪的内容(裁剪必须居中)必须尽可能少

基本上,您应该无法仅通过查看原始图像和编辑后的图像来发现它们之间的差异

我为 Gimp 描述的程序已经完成了所有操作,但一次只能处理一张图像

【问题讨论】:

  • 如果所有图像的旋转都相同,您可以使用 ImageMagick 中的 mogrify 对整个文件夹的文件执行此操作。它遍历文件夹中的每个图像。或者,您可以编写一个脚本来遍历每个图像并执行此操作。三次卷积将是 -filter Catrom。如果您了解 Python,那么您可以在 Python Wand 中进行脚本循环和处理。见imagemagick.org/Usage/basics/#mogrifydocs.wand-py.org/en/0.5.7
  • 是的,我确实知道 python,但我可以看到旋转和裁剪在魔杖中基本不同,例如在旋转期间我无法指定要使用的插值。另外,我认为 Gimp 裁剪经过优化,可以找出既保持图像原始比例又削减旋转添加的边框的最小裁剪。我决定不使用 PIL,因为没有办法对 50k+ 图像这样做,而不会冒着裁剪太多图像的风险。我可能会更多地研究 IM,看看我是否能找到如何更改他们的基本脚本
  • docs.wand-py.org/en/0.5.7/wand/image.html。使用过滤器类型 Catrom。使用带有失真方法 scale_rotate_translate 的 distort 并将缩放和平移固定为 0 以进行旋转。查看crop进行裁剪并计算宽度和高度以保持输入的纵横比。
  • 请说明您的裁剪要求。您可能对 imagemagick.org/discourse-server/viewtopic.php?f=4&t=35579 的 ImageMagick -trim 的内部修剪选项感兴趣
  • 编辑更多关于作物的细节

标签: imagemagick


【解决方案1】:

这可能是一种更好的方法(使用 ImageMagick 6)。与其依靠模糊值来修剪旋转的图像黑色边框,不如在给定旋转角度和图像尺寸的情况下计算需要从每一侧剃掉的量。 (Unix 语法)

输入(原始)

angle=0.2
convert barn.jpg -background black -rotate $angle barn_rotated.png


旋转图像:

WxH=`convert barn.jpg -format "%wx%h" info:`
ww=`echo "$WxH" | cut -dx -f1`
hh=`echo "$WxH" | cut -dx -f2`
aspect="${ww}:${hh}"
xshave=`convert xc: -format "%[fx:ceil($hh*sin($angle*pi/180))+1]" info:`
yshave=`convert xc: -format "%[fx:ceil($ww*sin($angle*pi/180))+1]" info:`
convert barn_rotated.png -shave ${xshave}x${yshave} \
-gravity center -crop "$aspect" +repage barn_rotated_shaved_cropped.png


剃光并裁剪成纵横比图像:

如果使用 ImageMagick 7,请将 convert 替换为 magick。

【讨论】:

  • 您的第一个回复对我来说不合适,因为它裁剪太多,您可以清楚地看到原始图像和编辑版本之间的差异。此回复非常适合您使用的图像!现在我将尝试将您的代码转换为处理一批图像,看看它是否也适用于不同的示例。谢谢!
【解决方案2】:

这是一个使用 ImageMagick 6 的示例。

首先,我获取并打印输入的纵横比。然后我将它旋转了 0.2 度。然后我修剪它以去除黑色边框。然后我将其裁剪为输入纵横比并打印输出纵横比。 Unix 语法如下。

输入:

aspect=`convert barn.jpg -format "%w:%h" info:`
convert barn.jpg -format "input_aspect=%[fx:w/h]\n" -write info: -background black -rotate 0.2 barn_rotated.png

input_aspect=1.33779


convert barn_rotated.png -fuzz 16% -define trim:percent-background=0% -trim +repage \
-gravity center -crop "$aspect" +repage -format "output_aspect=%[fx:w/h]\n" -write info: barn_cropped.jpg

output_aspect=1.33969


如果使用 ImageMagick 7,您可以在一个命令行中完成所有操作:

magick barn.jpg -set option:aspect "%w:%h" -format "input_aspect=%[fx:w/h]\n" -write info: \
-background black -rotate 0.2 +write barn_rotated.png \
-fuzz 16% -define trim:percent-background=0% -trim +repage \
-gravity center -crop "%[aspect]" \
+repage -format "output_aspect=%[fx:w/h]\n" -write info: \
barn_cropped.jpg


模糊值将取决于图像。

【讨论】:

    猜你喜欢
    • 2015-05-28
    • 2020-07-28
    • 1970-01-01
    • 2015-02-18
    • 2016-11-22
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多