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怎么做?
我将建议一种直接处理图像数据的方法,而不需要通过坐标访问单个像素。
您可以在一个大字节字符串中获取图像数据:
您应该检查
假设是“RGBA”,下面的代码将为您提供单独的频道:
如果要通过坐标访问像素,可以执行以下操作:
现在把它放回一起,可能有更好的方法,但是您可以使用
还有reuce:
然后要保存图片:
下面是一个将红色通道归零的例子中的所有内容:
想改进这个问题吗?更新问题,使其只关注一个问题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/