如何修复我的图像未正确粘贴?

How do I fix my image not being pasted correctly?

我正在尝试将图像裁剪成圆形(有效),然后将其粘贴到白色背景。

from PIL import Image,ImageFont,ImageDraw, ImageOps, ImageFilter
from io import BytesIO
import numpy as np



pfp = Image.open(avatar)

# cropping to circle
img=pfp.convert("RGB")
npImage=np.array(img)
h,w=img.size

alpha = Image.new('L', img.size,0)
draw = ImageDraw.Draw(alpha)
draw.pieslice([0,0,h,w],0,360,fill=255)
npAlpha=np.array(alpha)
npImage=np.dstack((npImage,npAlpha))
Image.fromarray(npImage).save('result.png')

background = Image.open('white2.png')

background.paste(Image.open('result.png'), (200, 200, h, w))
background.save('combined.png')

这是裁剪后的图像的样子(看起来它有白色背景,但那是透明的): Cropped Image

但是当我将它粘贴到白色背景时,它变成了一个正方形: Pasted Image

这是我正在处理的原始图像: Image

您正在做的是将该圆圈外的任何像素的 Alpha 设置为 0,因此当您渲染它时,它消失了,但该像素数据仍然存在。这不是问题,但了解这一点很重要。

问题
您的“white2.png”图像没有 alpha 通道。即使它是 PNG 文件,您也必须使用图像编辑工具添加 alpha 通道。您可以print("BGN:", background.getbands()),查看它拥有的频道。您会看到它显示 'R'、'G'、'B',但没有显示 'A'.

解决方案 1
将您的粘贴行替换为:
background.paste(pfp, (200, 200), alpha)
在这里,我们按原样使用加载的头像,第三个参数是一个掩码,PIL 在粘贴之前计算出如何使用它来掩码图像。

解决方案 2
给你的白色背景图像一个 alpha 通道。
MS Paint 不会这样做。你必须使用其他东西。
对于 GIMP,您只需右键单击图层并单击添加 Alpha 通道。

哦,还有一点值得注意。
Paste.

的文档

See alpha_composite() if you want to combine images with respect to their alpha channels.