我想做以下事情:
- 将 png 图像加载到 Python 代码
- 在三个数组中逐个像素地获取 RGB 数据,R、G 和 B 各一个。我的意思是 R[i,j] 应该在图像的第 i,j 个像素处给出 R 的值。
- 一旦我有了数组,我就可以随时编辑数据。
- 使用三个数组 R、G 和 B 绘制编辑后的数据,并将其另存为另一个 png 图像
如何在python中做到这一点?
我想做以下事情:
如何在python中做到这一点?
使用 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')