如何自定义Image.alpha_composite的图片叠加起始点?
自定义位置叠加图片的解决方法
Image.alpha_composite有个硬性限制:必须要求两张图片尺寸完全一致,而且是从左上角完全重合叠加,没法直接指定偏移坐标。要实现自定义(x,y)位置的边缘重叠效果,推荐用下面两种方法:
方法一:创建画布粘贴(最灵活)
直接建一个能容纳两张图的空白画布,分别把两张图贴到指定位置,完美保留透明度:
from PIL import Image # 打开并转成RGBA格式(确保支持透明) img1 = Image.open("图1路径").convert("RGBA") img2 = Image.open("图2路径").convert("RGBA") # 自定义叠加位置(x,y),比如想让img2左上角对齐img1的(100,50)位置 x, y = 100, 50 # 计算画布尺寸:要能放下两张图的所有内容 canvas_w = max(img1.width, img2.width + x) canvas_h = max(img1.height, img2.height + y) # 建透明画布 canvas = Image.new("RGBA", (canvas_w, canvas_h), (0,0,0,0)) # 贴第一张图到画布(这里贴左上角,也可以改位置) canvas.paste(img1, (0,0), mask=img1) # 贴第二张图到自定义(x,y)位置,mask参数保留透明效果 canvas.paste(img2, (x,y), mask=img2) # 保存结果 canvas.save("叠加结果.png")
方法二:适配alpha_composite的变通法
如果非要用Image.alpha_composite,得先把其中一张图放到和另一张同尺寸的透明画布的指定位置,再叠加:
from PIL import Image img1 = Image.open("图1路径").convert("RGBA") img2 = Image.open("图2路径").convert("RGBA") x, y = 100, 50 # 自定义偏移位置 # 建一个和img1一样大的透明画布,把img2贴到(x,y)处 offset_img = Image.new("RGBA", img1.size, (0,0,0,0)) offset_img.paste(img2, (x,y), mask=img2) # 现在可以用alpha_composite叠加了 result = Image.alpha_composite(img1, offset_img) result.save("叠加结果.png")
注意:如果img2的尺寸加上偏移后超出img1的范围,超出部分会被裁剪,这种方法更适合小图叠加在大图上的场景。
内容的提问来源于stack exchange,提问作者Jakub Pawelak
相关产品推荐
相关产品推荐

