PIL的putdata需要什么格式的数据?

2 投票
1 回答
5685 浏览
提问于 2025-04-17 11:13

我把图像的像素存储在一个整数的多进程数组里,这样可以方便地通过索引来访问。

self.data[x*height + y]

这样做是为了方便与进程间通信(IPC)。

我想用PIL库的putdata()方法把像素保存到文件里,这样比用putpixel()或者直接索引要快。但是我搞不清楚putdata()需要什么格式的图像数据。

我以为用同样的索引方式可以直接用在putdata()上。

def write(self):
    im = Image.new("RGB", (self.width, self.height))
    imagedata = [self.intToRGB(self.data[i*self.height + j]) 
                     for i in range(self.width) 
                        for j in range(self.height)]
    im.putdata(imagedata)
    im.save(self.filename, "PNG")

self.intToRGB()这个方法返回一个包含红、绿、蓝值的元组。

但上面的代码运行后,图像却变成了-90度的旋转,并且出现了很多重复的部分。

crooked

如果我用putpixel()而不是putdata(),像这样:

    pic = im.load()
    for i in range(self.width):
        offset = i * self.height
        for j in range(self.height):
            pic[i, j] =  imagedata[i * self.height + j]

结果就变成了

this

1 个回答

4

我觉得我在你第一行代码里看到了问题:

self.data[x*height + y]

图像数据通常是以另一种方式组织的:

self.data[y*width + x]

撰写回答