代码之家  ›  专栏  ›  技术社区  ›  Karnivaurus

Python 2.6:从数组创建图像

  •  1
  • Karnivaurus  · 技术社区  · 12 年前

    Python新手来了!所以,我有一个数据文件,它存储了一个字节列表,表示图像中的像素值。我知道图像是3×3像素。这是我迄今为止的代码:

    # Part 1: read the data
    data = []
    file = open("test.dat", "rb")
    for i in range(0, 9)
        byte = file.read(1)
        data[i] = byte
    file.close()
    
    # Part2: create the image
    image = PIL.Image.frombytes('L', (3, 3), data)
    image.save('image.bmp')
    

    我有几个问题:

    在第1部分中,这是读取二进制文件并将数据存储在数组中的最佳方法吗?

    在第2部分中,我得到了错误“TypeError:必须是字符串或只读缓冲区,而不是列表。

    这两个有什么帮助吗?

    非常感谢。

    1 回复  |  直到 12 年前
        1
  •  3
  •   Henry Keiter    12 年前

    第1部分

    如果您知道您需要正好九个字节的数据,那么这看起来是一个很好的方法,尽管使用上下文管理器并跳过显式循环可能会更干净/更清晰:

    with open('test.dat', 'rb') as infile:
        data = list(infile.read(9)) # read nine bytes and convert to a list
    

    第2部分

    According to the documentation ,必须传递给的数据 PIL.Image.frombytes 是:

    data包含给定模式的原始数据的字节缓冲区。

    列表不是字节缓冲区,因此您可能会浪费时间将输入转换为列表。我的 猜测 如果你直接传递字节字符串,你就会得到你想要的。这是我会尝试的:

    with open('test.dat', 'rb') as infile:
        data = infile.read(9) # Don't convert the bytestring to a list
    image = PIL.Image.frombytes('L', (3, 3), data) # pass in the bytestring
    image.save('image.bmp')
    

    希望这会有所帮助;显然我不能在这里测试它,因为我不知道你的文件内容是什么。

    当然,如果您确实出于其他原因需要将字节作为列表(值得怀疑的是,您可以遍历字符串和列表),那么您可以在需要时将它们转换为列表( datalist = list(data) )或在调用时将它们连接成字符串 PIL :

    image = PIL.Image.frombytes('L', (3, 3), ''.join(datalist))
    

    第3部分

    这有点旁敲侧击,但很可能是相关的:你知道什么版本的 皮尔 你在用什么?如果您使用的是真正的、原始的Python映像库,那么您也可能会遇到该库中的一些问题——自2009年以来,它非常bug,不受支持。

    如果你是,我 非常 建议去掉它并抓住 Pillow fork 相反,这是实时的功能版本。您不必更改任何代码(它仍然安装一个名为 皮尔 ),但枕头库优于原始库 皮尔 跳跃和跳跃。