如何使用Python PIL将一张带有Alpha通道的图像叠加在另一张没有Alpha通道的图像上?

7 浏览
0 Comments

如何使用Python PIL将一张带有Alpha通道的图像叠加在另一张没有Alpha通道的图像上?

我有一个类似的问题:

使用Python Imaging Library(PIL),如何将带有alpha通道的图像叠加在另一张图像上?

我有两张图像,顶部的图像带有alpha通道,底部的图像没有。我想将顶部的图像放在底部的图像上,得到一张新的图像,就像它们在图层中呈现一样。我想用Python PIL来实现这个目标。如果有任何建议,将不胜感激,谢谢!

0
0 Comments

问题的原因是:在Python PIL库中,如果要将一个带有alpha通道的图片覆盖到没有alpha通道的RGB图片上,需要进行一些处理才能实现。因为两种图片的通道数不同,无法直接合成。

解决方法是:将RGB图片扩展为RGBA,其中A通道设置为"1"。然后使用compose方法进行合成。如果使用Pillow库,可以直接使用putalpha和alpha_composite方法实现合成。

下面是完整的解决方案代码:

# 使用numpy库
import numpy as np
# 扩展RGB图片为RGBA
rgba = np.dstack((rgb, np.ones(rgb.shape[:-1])))
# 使用compose方法进行合成
result = compose(rgb, rgba)
# 使用Pillow库
from PIL import Image
# 打开RGB图片
imRGB = Image.open('rgb_image.jpg')
# 打开带有alpha通道的图片
im2RGBA = Image.open('rgba_image.png')
# 设置RGB图片的alpha通道
alpha = Image.new('L', imRGB.size, 255)
# 合成图片
imRGB.putalpha(alpha)
composite = Image.alpha_composite(imRGB, im2RGBA)

通过以上方法,可以实现将带有alpha通道的图片覆盖到没有alpha通道的RGB图片上。

0
0 Comments

问题的原因是:在RGBA图像中,alpha通道的值只能是0或255。因此,当使用一个带有alpha通道的图像覆盖没有alpha通道的RGB图像时,整个顶部图像会完全覆盖底部图像。

解决方法是将顶部图像的alpha通道的值从255改为220,这样顶部图像就不会完全覆盖底部图像。以下是解决问题的Python PIL代码:

from PIL import Image
from random import randint
def transPNG(srcImageName, dstImageName):
    img = Image.open(srcImageName)
    img = img.convert("RGBA")
    datas = img.getdata()
    newData = list()
    for item in datas:
        if item[0] > 200 and item[1] > 200 and item[2] > 200:
            newData.append((255, 255, 255, 0))
        else:
            newData.append((item[0], item[1], item[2], randint(220, 220)))
    img.putdata(newData)
    img.save(dstImageName, "PNG")

以上代码通过将顶部图像中的RGB通道的值大于200的像素的alpha通道的值设置为0,并将RGB通道的值小于等于200的像素的alpha通道的值设置为一个随机值(220到220之间)来实现底部图像和顶部图像的合成。

0