Closed. This question needs to be more focused。它目前不接受答案。
想改进这个问题吗?更新问题,使其只关注一个问题editing this post
两年前关闭。
我想做以下工作:
将png图像加载到Python代码中
在三个数组中逐像素获取R G B数据,R,G和B各一个。我的意思是R[I,j]应该给出图像第I,j个像素处的R值。
一旦我有了数组,我就可以随时编辑数据。
使用三个数组R、G和B绘制编辑后的数据,并将其保存为另一个png图像
用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)

还有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')

关于python - Python中的逐像素数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16373258/

10-12 17:02
查看更多