Python中的逐像素数据

时间:2013-05-04 10:26:11

标签: python python-imaging-library pixel

我想做以下事情:

  • 将png图像加载到Python代码
  • 获取三个数组中的逐像素RGB数据,分别为R,G和B各一个。我的意思是R [i,j]应该在图像的第i个和第j个像素处给出R的值。 / LI>
  • 一旦我拥有数组,我就可以随时编辑数据。
  • 使用三个数组R,G和B绘制已编辑的数据,并将其另存为另一个png图像

如何在python中完成?

1 个答案:

答案 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')