Imagemagick通过调整大小屏蔽图像和配件空间

Imagemagick通过调整大小屏蔽图像和配件空间,imagemagick,imagemagick-convert,image-masking,Imagemagick,Imagemagick Convert,Image Masking,导言 假设我有这样一个图像: 对于我应用遮罩的图像(它是白色的,这就是我在这里设置它的原因)。掩码基本上是一个消息气泡,右下角有一个箭头 命令(在bash中)如下所示: size=`convert Mask.png -format "%wx%h" info:` convert \( couple.jpg -channel rgba -alpha on -resize $size \) Mask.png -compose copy_opacity -composite -compose ove

导言

假设我有这样一个图像:

对于我应用遮罩的图像(它是白色的,这就是我在这里设置它的原因)。掩码基本上是一个消息气泡,右下角有一个箭头

命令(在bash中)如下所示:

size=`convert Mask.png -format "%wx%h" info:`
convert \( couple.jpg  -channel rgba -alpha on -resize $size \) Mask.png -compose copy_opacity -composite -compose over -background transparent -flatten png:result.png
结果是:

问题

现在让我们检查下面两幅图像:

图像2

图像3

如果我们对这两个进行同样的操作,我们将获得以下结果:

我们在这里看到的是,为了正确应用遮罩,比例必须相似,否则,根据原始图像的大小,可能会在底部或右侧进行裁剪

问题

如何避免裁剪问题,以及:

  • 使修剪后的图像(相对于遮罩)填充整个遮罩而不留下任何间隙,也不丢失比例?我想,通过调整大小,但如何调整
  • 让调整大小的照片相对于遮罩居中(重心)

  • 非常感谢您的回答。

    您得到了这些结果,因为遮罩和图像有两种不同的纵横比和大小。您应该调整遮罩的大小,使其与图像的尺寸完全一致,而不是以其他方式。例如,我对Imagemagick命令进行了如下修改:

    注意我添加了!要调整大小为$size!,使遮罩被迫适应输入的尺寸

    编辑:如果不想扭曲遮罩,那么唯一的方法是调整大小并将图像填充到遮罩的大小。在这里,我将背景从透明改为黑色以显示效果。您可以将其更改回透明

    infile="image.jpg"
    size=`convert mask.png -format "%wx%h" info:`
    convert \
    \( "$infile" -resize $size -background white -gravity center -extent $size \) \
    Mask.png \
    -compose copy_opacity -composite \
    -compose over -background black -flatten \
    png:result2.png
    

    由于遮罩和图像具有两种不同的纵横比和大小,因此您将获得这些结果。您应该调整遮罩的大小,使其与图像的尺寸完全一致,而不是以其他方式。例如,我对Imagemagick命令进行了如下修改:

    注意我添加了!要调整大小为$size!,使遮罩被迫适应输入的尺寸

    编辑:如果您不想扭曲遮罩,那么唯一的方法就是调整图像大小并将其填充到遮罩的大小。在这里,我将背景从透明改为黑色以显示效果。您可以将其更改回透明

    infile="image.jpg"
    size=`convert mask.png -format "%wx%h" info:`
    convert \
    \( "$infile" -resize $size -background white -gravity center -extent $size \) \
    Mask.png \
    -compose copy_opacity -composite \
    -compose over -background black -flatten \
    png:result2.png
    

    此命令应获取任何输入图像,然后缩放它以填充遮罩。接下来,它将遮罩上方居中的图像与“srcin”合成,以仅显示图像中遮罩为白色的部分。它通过在白色背景上展平来结束。输出将是遮罩的尺寸

    convert Mask.png image.jpg \
       +distort SRT "0,0 %[fx:t?max(u.w/v.w,u.h/v.h):1] 0 0,0" \
       -shave 1x1 +repage -gravity center -compose srcin -composite \
       -compose over -background white -flatten result.png
    

    此命令应适用于IM 6.8.9至IM 6.9.9。

    此命令应获取任何输入图像,然后缩放以填充遮罩。接下来,它将遮罩上方居中的图像与“srcin”合成,以仅显示图像中遮罩为白色的部分。它通过在白色背景上展平来结束。输出将是遮罩的尺寸

    convert Mask.png image.jpg \
       +distort SRT "0,0 %[fx:t?max(u.w/v.w,u.h/v.h):1] 0 0,0" \
       -shave 1x1 +repage -gravity center -compose srcin -composite \
       -compose over -background white -flatten result.png
    

    这应该适用于IM 6.8.9至IM 6.9.9。

    @Geemack
    很好地使用扭曲SRT进行在线调整大小和合成srcint这是公认的答案,特别是考虑到失真。
    @Geemack
    很好地使用扭曲SRT进行在线调整大小和合成srcint这是公认的答案,特别是考虑到失真。答案很有用,但调整遮罩以适应源图像会使遮罩失真。如果不想这样做,则必须在调整大小以适应遮罩后填充图像。请参阅上面我的答案中的我的编辑。有用的答案,但调整遮罩以适应源图像会扭曲遮罩。如果不想这样做,则必须在调整大小以适应遮罩后填充图像。见我的编辑在我的答案上面。