2013-05-04 44 views
0

像素数据欲执行以下操作:像素由在Python

  • 负载PNG图像与Python代码
  • 由像素RGB数据获取像素在三个阵列,每一个用于R,G一个和B.我的意思是R [i,j]应该给我R值在图像的第i,j个像素处。
  • 一旦我有阵列,我总是可以编辑数据。
  • 剧情使用三个阵列R,G和B,并保存为另一个png图片

如何去做在python编辑的数据?

+1

见答案:http://stackoverflow.com/questions/138250/read-the-rgb-value-of-given-pixel-in-python-programatically – ojs 2013-05-04 13:17:13

+1

@lovespeed。既然你已经知道你想要做什么的高水平,你就在中途。另一半则试图完成各个步骤。为什么不去学习如何在python中加载图像,并在*之后发布一个问题*你被困住了。 – jpaugh 2017-08-21 15:35:41

回答

4

使用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') 
+0

'tostring()'被弃用,而使用'data = str(img.tobytes)'' – Akshay 2016-06-25 08:03:28