如何从 Python 中的像素值列表创建 PNG 图像文件?
How can I create a PNG image file from a list of pixel values in Python?
我可以使用如下过程从现有图像文件生成像素值列表:
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)]
如何将这个像素值列表转换回图像文件?
快速修复
首先,您需要将像素元组放在一个未嵌套的列表中:
pixels_out = []
for row in pixels:
for tup in row:
pixels_out.append(tup)
接下来,使用输入图像的属性创建一个新的图像对象,并将数据放入其中:
image_out = Image.new(image.mode,image.size)
image_out.putdata(pixels_out)
最后保存一下:
image_out.save('test_out.png')
基本问题
您的列表推导生成列表的列表,后者由切片生成 (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')
你可以开罗。很简单。
#!/usr/bin/python
# Extracting pixels from an image ------
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)]
# Putting pixels back to an image ------
import cairo
Width=len(pixels[0])
Height=len(pixels)
surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, Width, Height)
context = cairo.Context (surface)
y=0
for row in pixels:
x=0
for rgb in row:
r=rgb[0] /255.0
g=rgb[1] /255.0
b=rgb[2] /255.0
context.set_source_rgb(r, g, b)
context.rectangle(x, y, 1, 1)
context.fill()
x+=1
y+=1
surface.write_to_png ("out.png") # Output to PNG
我可以使用如下过程从现有图像文件生成像素值列表:
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)]
如何将这个像素值列表转换回图像文件?
快速修复
首先,您需要将像素元组放在一个未嵌套的列表中:
pixels_out = []
for row in pixels:
for tup in row:
pixels_out.append(tup)
接下来,使用输入图像的属性创建一个新的图像对象,并将数据放入其中:
image_out = Image.new(image.mode,image.size)
image_out.putdata(pixels_out)
最后保存一下:
image_out.save('test_out.png')
基本问题
您的列表推导生成列表的列表,后者由切片生成 (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')
你可以开罗。很简单。
#!/usr/bin/python
# Extracting pixels from an image ------
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)]
# Putting pixels back to an image ------
import cairo
Width=len(pixels[0])
Height=len(pixels)
surface = cairo.ImageSurface (cairo.FORMAT_ARGB32, Width, Height)
context = cairo.Context (surface)
y=0
for row in pixels:
x=0
for rgb in row:
r=rgb[0] /255.0
g=rgb[1] /255.0
b=rgb[2] /255.0
context.set_source_rgb(r, g, b)
context.rectangle(x, y, 1, 1)
context.fill()
x+=1
y+=1
surface.write_to_png ("out.png") # Output to PNG