使用Python 3的Pillow(PIL)库实现图像颜色反转的方法是什么?
PIL实现图像颜色反转操作指南
实现原理
8位深度彩色图像的每个RGB通道取值范围为0-255,颜色反转本质是将每个通道的取值映射到区间的对立位置,即新通道值 = 255 - 原通道值,即可得到色谱对立的视觉效果。
具体实现代码
方案1:调用封装好的API(最简实现)
直接使用PIL的ImageOps.invert()方法完成反转,适合不需要自定义映射规则的场景:
from PIL import Image, ImageOps # 读取原始图像 original_img = Image.open("tree_frog.jpg") # 统一转为RGB模式,避免透明通道/灰度模式处理异常 original_img = original_img.convert("RGB") # 执行颜色反转 inverted_img = ImageOps.invert(original_img) # 保存结果 inverted_img.save("inverted_tree_frog.jpg")
方案2:手动遍历像素实现(高自由度)
如果后续需要针对你的物理项目调整映射规则,可以手动处理每个像素的通道值:
from PIL import Image original_img = Image.open("tree_frog.jpg").convert("RGB") width, height = original_img.size # 逐像素处理 for x in range(width): for y in range(height): r, g, b = original_img.getpixel((x, y)) # 自定义反转逻辑,可按需修改 inverted_r = 255 - r inverted_g = 255 - g inverted_b = 255 - b original_img.putpixel((x, y), (inverted_r, inverted_g, inverted_b)) original_img.save("inverted_tree_frog.jpg")
常见问题说明
- 若处理带透明通道的RGBA图像,不想修改透明值的话,读取像素时单独保留alpha通道原值即可:
r, g, b, a = original_img.getpixel((x,y)),写入时拼接为(inverted_r, inverted_g, inverted_b, a) - 非8位深度的特殊图像需先获取当前图像的像素最大值,替换公式中的255完成计算
- 如需实现局部色域的定向映射而非全通道反转,直接修改对应通道的计算规则即可适配你的项目需求
内容的提问来源于stack exchange,提问作者newguy69
相关产品推荐
相关产品推荐

