使用Pillow根据灰度值设置图片透明度 像素越亮透明度越高的实现
基于Pillow 6.2.2实现灰度值映射透明度的方案
1. 基于你原有代码的修改版本(新手易理解)
你的原有代码是通过计算像素和白色的差值生成alpha,只需要改成先计算像素灰度值,再用灰度值映射alpha即可适配全灰度区间,修改后代码如下:
from PIL import Image img = Image.open('Image.jpg') img_out = img.convert("RGBA") datas = img.getdata() newData = list() for item in datas: # 标准公式计算当前像素的灰度值,范围0-255,0为纯黑、255为纯白 gray = int(0.299 * item[0] + 0.587 * item[1] + 0.114 * item[2]) # 灰度越高,alpha值越低(透明度越高),纯黑时alpha=255(完全不透明,无透明度) alpha = 255 - gray newData.append((item[0], item[1], item[2], alpha)) img_out.putdata(newData) img_out.save('ConvertedImage.png', 'PNG')
这个版本逻辑直观,和你原有代码结构一致,方便你理解修改点,缺点是逐像素遍历,大尺寸图片处理速度较慢。
2. 更高效率的内置API实现(性能提升10倍以上)
Pillow底层内置的通道操作是C语言实现的,不需要写Python层的循环,处理速度快很多,适配Pillow 6.2.2版本的代码如下:
from PIL import Image # 读取图片并转为RGBA模式 img = Image.open('Image.jpg').convert('RGBA') # 提取原图的灰度通道 gray_channel = img.convert('L') # 反转灰度值生成alpha通道:灰度越高alpha越低,对应越亮越透明 alpha_channel = Image.eval(gray_channel, lambda x: 255 - x) # 为原图绑定alpha通道 img.putalpha(alpha_channel) # 保存结果 img.save('ConvertedImage.png', 'PNG')
可选调整项
如果需要让接近黑色的像素完全不透明,可以在生成alpha通道时增加阈值判断,比如设置灰度低于30的像素都无透明度,只需要修改alpha_channel生成逻辑即可:
# 灰度值低于30的像素alpha固定为255(完全不透明),其余按规则映射 alpha_channel = Image.eval(gray_channel, lambda x: 255 if x < 30 else 255 - x)
内容的提问来源于stack exchange,提问作者Zax
相关产品推荐
相关产品推荐

