我想做以下事情:
如何在python中完成?
答案 0 :(得分:5)
使用PIL加载图像:
from PIL import Image
img = Image.open('yourimage.png')
我将建议一种直接与图像数据混淆的方法,而不是通过坐标访问单个像素。
您可以在一个大字节字符串中获取图像数据:
data = img.tostring()
您应该检查img.mode
像素格式。
假设它是'RGBA',以下代码将为您提供单独的通道:
R = data[::4]
G = data[1::4]
B = data[2::4]
A = data[3::4]
如果您想通过坐标访问像素,可以执行以下操作:
width = img.size[0]
pixel = (R[x+y*width],G[x+y*width],B[x+y*width],A[x+y*width])
现在把它重新组合起来,可能有更好的方法,但你可以使用zip
:
new_data = zip(R,G,B,A)
和reuce:
new_data = ''.join(reduce(lambda x,y: x+y, zip(R,G,B,A)))
然后保存图片:
new_img = Image.fromstring('RGBA', img.size, new_data)
new_img.save('output.png')
以下是将红色通道归零的示例中的所有内容:
from PIL import Image
img = Image.open('yourimage.png')
data = img.tostring()
R = data[::4]
G = data[1::4]
B = data[2::4]
A = data[3::4]
R = '\0' * len(R)
new_data = ''.join(reduce(lambda x,y: x+y, zip(R,G,B,A)))
new_img = Image.fromstring('RGBA', img.size, new_data)
new_img.save('output.png')