Image.frombytes不写方块

时间:2018-02-15 23:58:26

标签: python-3.x python-imaging-library pillow

我有一个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")

但这写得像这样:

How to avoid imports with very long relative paths in Angular 2?

其中有行而不是我试图编写的10x10块。在我看来,好像块以某种方式移动了,但我无法弄清楚如何移位它们。为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

我相信您只需要更改size参数即可获得所需的结果。替换此行应更正错误:

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")

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

这是一个有效的例子:

...
click_button('Do something')
expect(MyObject.last.some_attribute).to be true
...