有没有办法使用PIL中的
eval
函数遍历所有像素并检查每个值?该程序通过图像以查看每个像素是否为某种rgb,如果是,则将该像素变为透明。 PIL中的eval
函数似乎可以完成此任务,但是我的转换像素的功能能够检查它所在的像素的值吗?谢谢提前。eval
函数遍历所有像素并检查每个值?该程序通过图像以查看每个像素是否为某种rgb,如果是,则将该像素变为透明。 PIL中的eval
函数似乎可以完成此任务,但是我的转换像素的功能能够检查它所在的像素的值吗?谢谢提前。更新:啊,我明白你想做什么了。这里有一个只使用PIL的示例。它将所有白色像素转换为带有50%透明度的红色:
import Image
img = Image.open('stack.png').convert('RGBA')
width, _ = img.size
for i, px in enumerate(img.getdata()):
if px[:3] == (255, 255, 255):
y = i / width
x = i % width
img.putpixel((x, y), (255, 0, 0, 127))
img.save('stack-red.png')
原始回答: 是的,Image.eval()
函数允许您传入一个函数来评估每个像素,并允许您确定新的像素值:
import Image
img1 = Image.open('foo.png')
# replace dark pixels with black
img2 = Image.eval(img1, lambda px: 0 if px <= 64 else px)
eval
不会将RGB元组传递给函数。它会将函数映射到每个波段。但是,您可以使用eval
处理每个波段,然后使用ImageChops
操作逻辑地组合这些波段,并获得像素元组特定的掩码。import numpy as np
import Image
import ImageChops
im_and = ImageChops.lighter
im = Image.open('test.png')
a = np.array(im)
R,G,B,A = im.split()
color_matches = []
for level,band in zip((255,255,255), (R,G,B)):
b = Image.eval(band, lambda px: 255-(255*(px==level)))
color_matches.append(b)
r,g,b = color_matches
mask = im_and(r, im_and(g, b))
im.putalpha(mask)
im.save('test2.png')
putpixel
不比img.getdata()
上的__setitem__
慢得多吗?换句话说:d=img.getdata()
for i,px in enumerate(d):
...
d[i] = (255,0,0,127)
。 - Pauly = i / width
必须改为y = i // width
。 - sougonde