如何使用Python的PIL库为透明图片添加边缘渐变效果?
用PIL实现带透明背景图片的边缘渐变效果
当然可以实现,直接用ImageFilter.BLUR会模糊整张图,没法只针对边缘做渐变。要达成需求,得通过提取alpha通道、生成边缘渐变遮罩再合并的方式来实现,具体步骤和代码如下:
实现思路
- 加载原图并分离RGBA通道,保留原有的颜色和透明信息
- 生成基于边缘距离的渐变alpha遮罩:像素离边缘越近,透明度越高;超出渐变范围的区域保留原透明度
- 将原颜色通道和新的渐变alpha通道合并,得到最终效果
代码示例
from PIL import Image def add_edge_gradient(image_path, gradient_width=50): # 加载图片并转为RGBA模式(确保支持透明) img = Image.open(image_path).convert("RGBA") width, height = img.size r, g, b, original_alpha = img.split() # 创建新的alpha遮罩画布 gradient_alpha = Image.new("L", (width, height), 0) alpha_pixels = gradient_alpha.load() # 遍历每个像素计算渐变透明度 for x in range(width): for y in range(height): # 计算当前像素到最近边缘的距离 edge_distance = min(x, width - x - 1, y, height - y - 1) # 生成渐变值:渐变宽度内从0到255过渡,超出则用原透明度 if edge_distance < gradient_width: alpha_val = int(255 * (edge_distance / gradient_width)) else: alpha_val = original_alpha.getpixel((x, y)) alpha_pixels[x, y] = alpha_val # 合并通道得到最终图片 result_img = Image.merge("RGBA", (r, g, b, gradient_alpha)) return result_img # 使用示例:替换为你的图片路径,调整渐变宽度 final_image = add_edge_gradient("input_image.png", gradient_width=30) final_image.save("output_gradient_edge.png")
说明
- 调整
gradient_width参数可以控制渐变区域的宽度,数值越大,边缘渐变的过渡范围越宽 - 代码会保留原图本身的透明区域,同时在图片边缘添加平滑的渐变透明效果
- 这种像素级的计算比模糊滤镜更精准,能完全控制渐变的范围和过渡效果
内容的提问来源于stack exchange,提问作者Sam Matar
相关产品推荐
相关产品推荐

