26

我有两张尺寸完全相同的图像,我要做的就是拍摄一张,使其透明 50%,然后将其直接放在另一张的顶部,如下所示:

import Image

background = Image.open("bg.png")
overlay = Image.open("over.png")

background = background.convert("RGBA")
overlay = overlay.convert("RGBA")

background_pixels = background.load()
overlay_pixels = overlay.load()

for y in xrange(overlay.size[1]):
    for x in xrange(overlay.size[0]):
         background_pixels[x,y] = (background_pixels[x,y][0], background_pixels[x,y][1], background_pixels[x,y][2], 255)

for y in xrange(overlay.size[1]):
    for x in xrange(overlay.size[0]):
         overlay_pixels[x,y] = (overlay_pixels[x,y][0], overlay_pixels[x,y][1], overlay_pixels[x,y][2], 128)

background.paste(overlay)
background.save("new.png","PNG")

但我得到的只是 50% 的透明覆盖层(所以到了一半!)。

4

5 回答 5

34

尝试使用blend()而不是 paste() - 似乎 paste() 只是用您粘贴的内容替换原始图像。

try:
    from PIL import Image
except ImportError:
    import Image

background = Image.open("bg.png")
overlay = Image.open("ol.jpg")

background = background.convert("RGBA")
overlay = overlay.convert("RGBA")

new_img = Image.blend(background, overlay, 0.5)
new_img.save("new.png","PNG")
于 2012-05-17T17:01:25.280 回答
15

也许太老的问题,可以轻松使用opencv

cv2.addWeighted(img1, alpha, img2, beta, gamma)
#setting alpha=1, beta=1, gamma=0 gives direct overlay of two images

文档链接

于 2017-06-25T19:31:01.437 回答
0

提供覆盖 alpha 掩码参数,看看这是否会产生您预期的结果:

background.paste(overlay, overlay.size, overlay)
于 2014-06-02T21:48:53.123 回答
0

如果您想将它们调整为相同的形状:

b_h, b_w, b_ch = background.shape
W = 800
imgScale = W/b_w
new_b_h,new_b_w = int(b_h*imgScale), int(b_w*imgScale)
new_background = cv2.resize(background,(new_b_w, new_b_h))

然后你可以填充适合背景和前景的形状。

square= np.zeros((new_b_h, new_b_w, b_ch), np.uint8)
square.fill(255)
x= new_b_w
y= new_b_h
offset =0
square[int(y - new_b_h) - offset:int(y)- offset, int(x-new_b_w)- offset:int(x)- offset] = new_background 

现在您可以叠加:

OPACITY = 0.7
added_image = cv2.addWeighted(new_background,OPACITY,square, 1-OPACITY, 0)

详情在github上

于 2019-10-29T23:37:47.613 回答
0

此处的脚本也将使用混合来完成任务,它还具有调整图像大小的功能,以便在它们当前不具有相同大小的情况下使它们具有相同的大小。

于 2019-05-16T06:11:49.667 回答