从稀疏数据创建PNG图像

5
我想在Python中存储一张PNG图像,其中RGB值由列表给出。
entries = [
    [1, 2, [255, 255, 0]],
    [1, 5, [255, 100, 0]],
    [2, 5, [0, 255, 110]],
    # ...
    ]

(行,列,RGB三元组)与默认值[255, 255, 255]以及图像的总尺寸信息一起使用。

使用PIL,当然可以将entries翻译成一个密集的m-by-n-by-3矩阵,但这不适合内存;矩阵的维数可以达到数万个。

还有其他方法可以创建具有上述信息的PNG图像吗?


1
你是如何创建PNG的?那个库是否带有逐行处理的方法? - Jongware
1
有人可能会想知道创建一个无法适应内存的图像的目的是什么。 - user1196549
无论如何,PNG进行了一些压缩,使得磁盘上的文件比内存中的密集图像要小得多。 - Nico Schlömer
2个回答

7

PurePNG库逐行写入文件,只需要一个行迭代器:

def write_png(A, filename):
    m, n = A.shape

    w = png.Writer(n, m, greyscale=True, bitdepth=1)

    class RowIterator:
        def __init__(self, A):
            self.A = A.tocsr()
            self.current = 0
            return

        def __iter__(self):
            return self

        def __next__(self):
            if self.current+1 > A.shape[0]:
                raise StopIteration
            out = numpy.ones(A.shape[1], dtype=bool)
            out[self.A[self.current].indices] = False
            self.current += 1
            return out

    with open(filename, 'wb') as f:
        w.write(f, RowIterator(A))

    return

1
你可以这样做:

from PIL import Image

sparse = [
    [1, 2, [255, 255, 0]],
    [1, 5, [255, 100, 0]],
    [2, 5, [0, 255, 110]],
    ]

im = Image.new("RGB", (20, 20), (255, 255, 255))
for item in sparse:
    x, y, color = item
    im.putpixel((x, y), tuple(color))

im.save("schlomer.png")
im.show()

在实例化“Image”时,这也会占用大量的内存空间。 - Nico Schlömer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接