如何从Python中的像素值列表创建PNG图像文件?

d3p*_*3pd 5 python image file list python-imaging-library

我可以使用如下过程从现有图像文件生成像素值列表:

from PIL import Image
image = Image.open("test.png")
pixels = list(image.getdata())
width, height = image.size
pixels = [pixels[i * width:(i + 1) * width] for i in xrange(height)]
Run Code Online (Sandbox Code Playgroud)

如何将此像素值列表转换回图像文件?

rjo*_*nal 7

快速解决

首先,您需要将像素元组放在一个非嵌套列表中:

pixels_out = []
for row in pixels:
    for tup in row:
        pixels_out.append(tup)
Run Code Online (Sandbox Code Playgroud)

接下来,使用输入图像的属性创建一个新的图像对象,并将数据放入其中:

image_out = Image.new(image.mode,image.size)
image_out.putdata(pixels_out)
Run Code Online (Sandbox Code Playgroud)

最后,保存它:

image_out.save('test_out.png')
Run Code Online (Sandbox Code Playgroud)

基本问题

列表推导会生成列表列表,后者由切片(i*width:(i+1)*width)生成.你的理解可以更容易:pixels = [pixel for pixel in pixels].显然,这会输出相同的列表,pixels但您可以使用该想法对像素执行操作,例如pixels = [operation(pixel) for pixel in pixels].

真的,你打败了它.您无需管理图像尺寸.获取列表中的像素,然后将它们放入相同大小的图像中,putdata保持顺序,因为它们通过PIL以相同的方式线性化.

简而言之,这就是您的原始代码段应该是:

from PIL import Image
image = Image.open("test.png")
image_out = Image.new(image.mode,image.size)

pixels = list(image.getdata())
image_out.putdata(pixels)
image_out.save('test_out.png')
Run Code Online (Sandbox Code Playgroud)