【发布时间】:2017-06-01 23:59:46
【问题描述】:
我有两张图片:
a.jpgb.jpg
两张图片都是正方形的(100x100 像素)。我想从图像a.jpg 中剪出一个半径为50 的圆,并将其粘贴到图像b.jpg 的中间。我想将结果保存在c.jpg。
如何使用 Linux 命令行工具执行此操作?我需要在 shell 脚本中完成。
【问题讨论】:
标签: bash imagemagick imagemagick-convert gimp
我有两张图片:
a.jpgb.jpg两张图片都是正方形的(100x100 像素)。我想从图像a.jpg 中剪出一个半径为50 的圆,并将其粘贴到图像b.jpg 的中间。我想将结果保存在c.jpg。
如何使用 Linux 命令行工具执行此操作?我需要在 shell 脚本中完成。
【问题讨论】:
标签: bash imagemagick imagemagick-convert gimp
可以使用许多不同的技术。 ImageMagick 有FX language 可以执行复杂的计算。
convert a.jpg b.jpg -fx 'Wi=w/2; Hi=h/2; hypot(Wi-i, Hi-j) < 50 ? u : v' c.jpg
例如...
convert -size 100x100 PLASMA: a.jpg
convert -size 100x100 GRADIENT:LIME-ORANGE b.jpg
convert a.jpg b.jpg -fx 'hypot(50-i, 50-j) < 50 ? u : v' c.jpg
用另一种技术更新。
一种更快的方法是利用您希望裁剪的形状的图像蒙版,并在两个图像之间进行合成/合成。它需要一种支持 Alpha 通道的格式,但仅限于初始工作。比如……
创建一个圆形遮罩,并将值复制到 Alpha 通道。
convert -size 100x100 xc:White -fill Black \
-draw 'circle 50 50 50 5' -alpha Copy mask.png
convert \( a.png mask.png -alpha Set -compose Dst_Out -composite \) \
b.png -compose Dst_Atop -composite c.png
【讨论】:
Eric 的方法要简洁得多,而且可能更可取,但无论如何这里还有另一种方法。我非常注重环保和回收 ;-) 他的初始图片:
magick b.jpg \( a.jpg \( +clone -threshold 101% -fill white -draw "circle 49,49, 49,99" \) -channel-fx '| gray=>alpha' \) -flatten result.png
也就是说... “加载b.jpg 作为背景。加载a.jpg 然后通过克隆整个a.jpg 将其设置为黑色并在其中绘制一个白色圆圈并推动它来创建透明蒙版进入 alpha 通道。然后将其压平到 b.jpg" 的顶部。
结果和艾瑞克的一样。
【讨论】: