在python中将列表另存为图像
我试图将2D列表保存为python中的图像(灰度图像),因此数组中的0值将为黑色,255值将为白色。例如:在python中将列表另存为图像,python,image-processing,python-imaging-library,Python,Image Processing,Python Imaging Library,我试图将2D列表保存为python中的图像(灰度图像),因此数组中的0值将为黑色,255值将为白色。例如: 255 255 255 255 0 255 255 0 255 255 0 255 255 255 255 将保存一个类似l的形状。 我使用PIL库尝试了以下代码,正如关于堆栈溢出的其他问题所建议的: WIDTH, HEIGHT = img.size imgData = list(img.getdata()) imgData = [imgData[offset:offse
255 255 255
255 0 255
255 0 255
255 0 255
255 255 255
将保存一个类似l的形状。
我使用PIL库尝试了以下代码,正如关于堆栈溢出的其他问题所建议的:
WIDTH, HEIGHT = img.size
imgData = list(img.getdata())
imgData = [imgData[offset:offset + WIDTH] for offset in range(0, WIDTH * HEIGHT, WIDTH)]
#to print the image
for row in data:
print(' '.join('{:3}'.format(value) for value in row))
imgData = np.array(imgData)
**IMG VALUES AUGMENTED HERE**
newimg = Image.new('L', (WIDTH, HEIGHT), 'white')
newimg.putdata(imgData)
newimg.save('C:/File/Name.png')
但是,这样创建的图像根本不反映列表。如果我将0和255放在不同的位置,就会创建相同的图像。有人知道解决方案吗?而不是:
newimg.putdata(imgData)
你需要排队:
newimg.putdata([j[0] for i in imgData for j in i])
灰度数据在1d列表中指定,而不是在2d列表中指定
这将创建以下列表:
>>> [j[0] for i in imgData for j in i]
[255, 255, 255, 255, 0, 255, 255, 0, 255, 255, 0, 255, 255, 255, 255]
即:
[255, 255, 255,
255, 0 , 255,
255, 0 , 255,
255, 0 , 255,
255, 255, 255]
编辑
如果使用imgData[0][0]=[0,0,0,255]
编辑imgData,则上述解决方案有效。如果您正在使用imgData[0][0]=0
编辑imgData
,则需要将行设置为:
[j[0] if hasattr(j, '__iter__') else j for i in imgData for j in i]
或者,您可以通过以下方式让它变得更好:
imgData = np.array([[j[0] for j in i] for i in imgData])
imgData[0][0] = 0
newimg.putdata(imgData.flatten())
由于您的示例缺少任何输入数据,我只是按照您的描述键入它,制作图像,然后将其放大。我还人为添加了一个红色边框,以便您可以在StackOverflow的白色背景上看到它的范围:
#!/usr/bin/env python3
from PIL import Image
import numpy as np
pixels = [[255,255,255],
[255,0,255],
[255,0,255],
[255,0,255],
[255,255,255]]
# Make list of pixels into Image
im = Image.fromarray(np.array(pixels,dtype=np.uint8))
im.save('result.png')
imgData的确切结构是什么?它是[[255,255,255],[255,0,255],…
,还是[255,255,255,0,255,…]`?所以对于我使用的代码,它是一个更大的列表,大约是40 x 60,我使用的代码是:WIDTH,HEIGHT=img.size
imgData=list(img.getdata())
imgData=[imgData[offset:offset+WIDTH]表示范围内的偏移量(0,WIDTH*HEIGHT,WIDTH)]
这有帮助吗?你能将该代码编辑到问题中吗?并将for循环的其余部分放入其中吗?很抱歉,在那里对答复的格式设置有问题。你是对的,最好将此添加到主问题中,即现在添加了所有相关代码。希望这有帮助!谢谢你的建议,尽管我收到了错误消息“IndexError:标量变量的索引无效。”对于这一新行。有什么解决方法吗?我仍然遇到'imgData=np.array([[j[0]表示I中的j]表示imgData中的I]表示I]的错误)现在,这个错误是“iTo Objor”不是订阅的,只是为了确保我能正确地将代码拼合在一起:“JavaSooLoad,代码在我的系统上工作。它必须是我们的代码> IMG.GETDATABOS/Code >输出是不同的。你是如何加载图像的?非常好-请考虑接受它作为Co。点击计票旁边的勾号(复选标记)来更正答案。谢谢你,祝你的项目好运。