如何叠加图片并实现深色背景透明?paste函数仅显示单图问题解析
问题解答
为什么paste()只显示test2?
PIL.Image.paste()是直接像素替换操作,会把im2的所有像素完全覆盖到im1对应位置,不会做任何混合,所以原im1被完全覆盖,最终只能看到im2。
实现图片叠加并让深色背景透明的方案
1. 先将test2的深色背景转为透明
因为你的图片是RGB格式,首先要转为带Alpha通道的RGBA格式,再通过像素阈值过滤深色背景:
from PIL import Image import numpy as np # 打开并转为RGBA格式 im1 = Image.open('test1.jpg').convert('RGBA') im2 = Image.open('test2.jpg').convert('RGBA') # 转为numpy数组处理背景 im2_arr = np.array(im2) # 设定深色阈值(RGB值均低于该值则判定为背景) dark_thresh = 50 # 筛选出深色区域 dark_area = (im2_arr[:, :, 0] < dark_thresh) & (im2_arr[:, :, 1] < dark_thresh) & (im2_arr[:, :, 2] < dark_thresh) # 将深色区域的Alpha通道设为0(完全透明) im2_arr[dark_area, 3] = 0 # 转回PIL图像 im2_trans = Image.fromarray(im2_arr)
2. 叠加透明后的图片到test1
有两种常用方法:
方法一:用alpha_composite()实现透明叠加
该方法要求两张图都为RGBA格式,会自动处理透明通道:
# 直接合成 final_img = Image.alpha_composite(im1, im2_trans) # 保存为PNG(JPG不支持透明通道) final_img.save('final_transparent.png')
方法二:用paste()配合掩码粘贴
指定im2的Alpha通道作为掩码,只粘贴非透明区域:
im1.paste(im2_trans, mask=im2_trans) im1.save('final_transparent.png')
额外:实现半透明混合叠加(无需背景透明)
如果只是想让两张图半透明混合显示,不用处理背景,直接用blend():
im1_rgba = im1.convert('RGBA') im2_rgba = im2.convert('RGBA') # alpha参数控制im2的透明度,0.0显示全im1,1.0显示全im2 blended_img = Image.blend(im1_rgba, im2_rgba, alpha=0.5) blended_img.save('blended_result.png')
内容的提问来源于stack exchange,提问作者Harsh Ambardekar
相关产品推荐
相关产品推荐

