使用ImageMagick扩展 canvas 不让透明部分成为新图片的背景色

Use ImageMagick to extend canvas and not have transparent section become the background colour of the new image

这道题:Use ImageMagick to place an image inside a larger canvas我已经做过了,但是我想修改一下,让新的区域有不同的颜色,而不是让原图的透明部分变成相同的颜色。

这将如何实现?

编辑:

输入图像:

xxxxxxxx
xx...xxx
xxxxxxxx

输出图像:

xxxxxxxxiii
xx...xxxiii
xxxxxxxxiii
iiiiiiiiiii

我想到的命令是这样的:

dwidth = newWidth-origWidth
dheight = newHeight-origHeight
convert in.png -background yellow -splice (dwidth)x(height)+(origHeight)+(0) -splice (width)x(dheight)+(0)+(origHeight) out.png

括号只是为了清楚起见。实际数字将显示而不带括号。

该代码实际上崩溃了。使用 -gravity 出于某种原因停止了崩溃。

使用 ImageMagick 6.9.1-Q16.

如果您将带有透明部分的图像放在另一幅图像的顶部,则顶部图像之前透明的部分将采用下面图像的颜色。

除非你明确说明你希望透明部分变成什么颜色(如果不是底层图像的颜色),否则没有办法解决这个问题!

由于您没有提供示例图片,我将不得不提供自己的图片。我将使用这些命令生成它们:

convert -size 310x400 xc:red 310x400red-bg.png
convert -size 200x300 xc:gray +noise gaussian 200x300noise.png

结果如下:

现在把它们放在一起:

convert 310x400red-bg.png 200x300noise.png -gravity center -composite result.png

结果:

我认为你在混淆自己,Kurt 和我说你想放置你的新图像 "inside a larger canvas" 而你实际上不想影响现有图像canvas(即它的透明区域必须保持透明)。我认为,根据您的图表,您想要做的是在现有图表周围附加一些新的 canvas - 如果是这种情况,您需要 -splice 添加 canvas 而不是比 -composite 覆盖现有的。

因此,如果您从这个中间透明的空心绿色矩形开始:

你实际上想在它周围拼接(添加)一些额外的canvas而不影响原来的透明区域和canvas,所以你需要这个:

convert a.png -background pink -gravity southeast -splice 100x200 b.png

当然,我可能和 Kurt 一样大错特错 :-)

如果你需要一些帮助来理解 -splice,我会举一些例子:

要将粉红色拼接到图像的顶部,如下所示,请使用 -gravity north:

convert a.png -gravity north -background pink -splice x10 n.png

要将粉红色拼接到图像底部,如下所示,请使用 -gravity south:

convert a.png -gravity south -background pink -splice x10 s.png

要将粉红色拼接到图像的左侧,如下所示,使用 -gravity west 并注意额外的宽度是 before the x this时间:

convert a.png -gravity west -background pink -splice 10x w.png

要将粉红色拼接到图像的右侧,如下所示,使用 -gravity east 并注意额外的宽度是 before the x this时间:

convert a.png -gravity east -background pink -splice 10x e.png

要在底部和左侧拼接,使用-gravity southwest并将额外的宽度放在x之前,额外的高度放在x之后:

convert a.png -gravity southwest -background pink -splice 10x50 sw.png