官方说法:
The point()
method can be used to translate the pixel values of an image (e.g. image contrast manipulation). In most cases, a function object expecting one argument can be passed to this method. Each pixel is processed according to that function:
当使用point时,第一个参数可以传递一个函数,而函数一般模式下接受的是从0到255的数值,这些数值代表着不同的色彩值,如果你知道颜色是0-255就好办了,这个函数返回值也是0-255的一个数值,为什么是这样呢?
其实point要生成一张对照表,也就是说当接收的值是0时返回的值是多少,如果默认把接收的值都返回那么颜色是不变的,因为该是0色的还是0色,该是255色的还是255色,图像颜色没变化。
举例说明
from PIL import Image
with Image.open("./rgb.png") as im: # type:Image.Image
source = im.split()
R, G, B = 0, 1, 2
# 创建一个遮罩,红色通道中纯红色使用0色,否则选255色,遮罩中纯黑色(0)代表无法操作的区域
mask = source[R].point(lambda x: 0 if x == 255 else 255)
# 红色通道把蓝色通道粘贴上去,红色通道区域和蓝色通道区域变成了一摸一样的
# 想象一下,图片中源蓝色区域充斥了红色和蓝色,而源红色区域什么颜色都没有了所以成了黑色
# source[R].paste(source[B], None)
# 不想让源红色区域被修改
# 加上述遮罩,上述遮罩描述了源红色区域是0色也就是无法操作区域,加了遮罩源红色区域就不变了
# 蓝色就变粉色(源蓝色区域有了红色和蓝色)了
source[R].paste(source[B], None, mask)
# 将单通道合并成多通道
im = Image.merge(im.mode, source)
im.save("./out.png")
总结
蓝色区域变成了粉色,请参考代码中的注释进行理解,如果你不理解什么是蒙板,请先下载ps等软件尝试添加蒙板操作进行理解。