Image.frombytes 不写正方形

Image.frombytes not writing squares

我有一个 numpy 数组:

[[12 13 12  5  6  5 14  4  6 11 11 10  8 11  8 11  7  8  0  0  0]
 [ 5 14  4  6 11 11 10  8 11  8 11  8 11  8 11  7  8  0  0  0  0]
 [ 5 14  4  6 11 10 10  8 11  8 11  8 11  8 11  8 11  7  8  0  0]
 [ 5 14  4  6 11 11 10  7  8  0  0  0  0  0  0  0  0  0  0  0  0]
 [ 5 14  4  6 11 11 10  8 11  8 11  8 11  8 11  8 11  8 11  7  8]
 [ 5 14  4  6 11 10  8 11 10  8 11 10  8 11 10  7  8  0  0  0  0]
 [ 5 14  4  6 11 10 10  8 11  8 11  7  8  0  0  0  0  0  0  0  0]
 [ 5 14  4  6 11 11 10  1 11  1 11  7  8  0  0  0  0  0  0  0  0]
 [ 5 14  4  6 11 10 10  1 11  1 11  1 11  7  8  0  0  0  0  0  0]
 [ 5 14  4  6 11 10 10  8 11  8 11  8 11  7  8  0  0  0  0  0  0]
 [ 5 14  4  6 11 10  8 11 10  8 11 10  8 11 10  8 11  7  7  0  0]]

还有一个颜色字典:

{0: (0, 0, 0), 1: (17, 17, 17), 2: (34, 34, 34), 3: (51, 51, 51), 4: (68, 68, 68), 5: (85, 85, 85), 6: (102, 102, 102), 7: (119, 119, 119), 8: (136, 136, 136), 9: (153, 153, 153), 10: (170, 170, 170), 11: (187, 187, 187), 12: (204, 204, 204), 13: (221, 221, 221), 14: (238, 238, 238)}

我正在尝试通过字典编写传递数组,然后将这些颜色以 10x10 块的形式写入 .png 文件。到目前为止我有:

rows = []
for row in arr:
    for j in range(10):
        for col in row:
            for i in range(10):
                rows.extend(colors[col])

rows = bytes(rows)
img = Image.frombytes('RGB', (110, 120), rows)
img.save("generated.png")

但是这个是这样写的:

它有线条而不是我试图写的 10x10 块。在我看来,这些块似乎以某种方式移动了,但我不知道如何取消移动它们。为什么会发生这种行为?

相信您只需要更改大小参数就可以得到您想要的结果。替换此行应该更正错误:

# img = Image.frombytes('RGB', (110, 120), rows)
img = Image.frombytes('RGB', (210, 110), rows)

大小应该是图像宽度和高度的二元组(以像素为单位)。您正在创建的 列表是一个 (210,110) 像素的图像。您正在将其绘制为 (110,120) 像素的图像。这会导致图像每 110 像素换行。

这是一个工作示例:

from PIL import Image

array = [
    [12, 13, 12, 5, 6, 5, 14, 4, 6, 11, 11, 10, 8, 11, 8, 11, 7, 8, 0, 0, 0],
    [5, 14, 4, 6, 11, 11, 10, 8, 11, 8, 11, 8, 11, 8, 11, 7, 8, 0, 0, 0, 0],
    [5, 14, 4, 6, 11, 10, 10, 8, 11, 8, 11, 8, 11, 8, 11, 8, 11, 7, 8, 0, 0],
    [5, 14, 4, 6, 11, 11, 10, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [5, 14, 4, 6, 11, 11, 10, 8, 11, 8, 11, 8, 11, 8, 11, 8, 11, 8, 11, 7, 8],
    [5, 14, 4, 6, 11, 10, 8, 11, 10, 8, 11, 10, 8, 11, 10, 7, 8, 0, 0, 0, 0],
    [5, 14, 4, 6, 11, 10, 10, 8, 11, 8, 11, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0],
    [5, 14, 4, 6, 11, 11, 10, 1, 11, 1, 11, 7, 8, 0, 0, 0, 0, 0, 0, 0, 0],
    [5, 14, 4, 6, 11, 10, 10, 1, 11, 1, 11, 1, 11, 7, 8, 0, 0, 0, 0, 0, 0],
    [5, 14, 4, 6, 11, 10, 10, 8, 11, 8, 11, 8, 11, 7, 8, 0, 0, 0, 0, 0, 0],
    [5, 14, 4, 6, 11, 10, 8, 11, 10, 8, 11, 10, 8, 11, 10, 8, 11, 7, 7, 0, 0],
]
colors = {
    0: (0, 0, 0),
    1: (17, 17, 17),
    2: (34, 34, 34),
    3: (51, 51, 51),
    4: (68, 68, 68),
    5: (85, 85, 85),
    6: (102, 102, 102),
    7: (119, 119, 119),
    8: (136, 136, 136),
    9: (153, 153, 153),
    10: (170, 170, 170),
    11: (187, 187, 187),
    12: (204, 204, 204),
    13: (221, 221, 221),
    14: (238, 238, 238)
}
rows = []
for row in array:
    for _ in range(10):
        for col in row:
            for _ in range(10):
                rows.extend(colors[col])
rows = bytes(rows)
img = Image.frombytes('RGB', (210, 110), rows)
img.save("generated.png")