Python 2.6:从数组创建图像

时间:2014-02-25 16:04:17

标签: python python-imaging-library

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 个答案:

答案 0 :(得分:3)

第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部分

这有点偏僻,但它很可能是相关的:你知道你使用的PIL版本是什么吗?如果您正在使用实际的原始Python成像库,那么您可能还会遇到该库中的一些问题 - 从2009年开始它就是超级错误并且不受支持。

如果你是,我高度建议摆脱它并抓住Pillow fork代替,这是实时的功能版本。您不必更改任何代码(它仍然会安装名为PIL的模块),但Pillow库的优势远远超过原始PIL