PIL的贴法如何制作合适的mask?

How to make a proper mask for PIL's paste method?

我不明白为什么我不能用我制作的蒙版遮盖图像:

img = Image.open("image.jpg") 
mask_card = Image.open("images/mask_card.png").convert("RGBA")


essai = Image.new('RGBA', (img.width,img.height))
essai.paste(img,(0 , 0),mask_card)
essai.show()

然后我尝试强制蒙版只有黑白,但效果并不好:

img = Image.open("image.jpg") 
mask_card = Image.open("images/mask_card.png").convert("RGBA")


datas = mask_card.getdata()

newData = []
for item in datas:
    if (max(item[0], item[1], item[2]) > 100 ) :
        newData.append((255, 255, 255, 255))
    else:
        newData.append((0, 0, 0, 255))
mask_card.putdata(newData)

mask_card.show()

essai = Image.new('RGBA', (img.width,img.height))
essai.paste(img,(0 , 0),mask_card)
essai.show()

在 image.png 的情况下(我想遮住白角):

和mask_card.png是:

我错过了什么?

您的 mask_image 是包含透明通道的 rgba 图像,因此您必须设置透明度 = 0 以使白色像素在合并时消失。另外,您使用的粘贴方法不正确。不要创建新图像,而是直接将蒙版粘贴到图像中。
从技术上讲,mask 参数告诉 PIL 源图像像素值的哪些地方应该被替换,哪些地方不应该。因此将 mask_card 传递到 paste 方法不会将蒙版合并到图像中。

import PIL
from PIL import Image


img = Image.open("image.jpg")
mask_card = Image.open("images/mask_card.png").convert("RGBA")
data = mask_card.getdata()
newData = []
for item in data:
    if item[0] == 255 and item[1] == 255 and item[2] == 255:
        newData.append((255, 255, 255, 0))
    else:
        newData.append(item)

mask_card.putdata(newData)
img.paste(mask_card,(0,0),mask_card)
img.save('res.png')

res.png