官方说法:
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色,图像颜色没变化。
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")