2

我想做以下事情:

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

如何在python中做到这一点?

4

1 回答 1

8

使用 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)

并减少:

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')
于 2013-05-04T16:36:39.307 回答