在Python中,如何将位数组转换为字节数组?

时间:2013-12-12 10:32:26

标签: python arrays bitmap bytearray python-imaging-library

Python PIL库有Image.getdata()方法,它返回原始图像数据,写成:

list(im.convert("1").getdata())

将返回一个位数组。每个位对应一个图像像素 - 由于“1”模式,像素只能是黑色或白色。

我想要一个大小小8倍的数组。每个数组元素都包含一个字节。

我的问题是:

  • 1。我可以直接从PIL获得这样的字节数组吗?
  • 2。如果没有,如何将PIL返回的位数转换为较小的字节数组?

2 个答案:

答案 0 :(得分:2)

我不知道关于PIL的事情,我有一段时间没有使用过Python,但这是我对这个位到字节转换问题的看法。

import itertools
# assuming that `bits` is your array of bits (0 or 1)
# ordered from LSB to MSB in consecutive bytes they represent
# e.g. bits = [0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1] will give you bytes = [128,255]
bytes = [sum([byte[b] << b for b in range(0,8)])
            for byte in zip(*(iter(bits),) * 8)
        ]
# warning! if len(bits) % 8 != 0, then these last bits will be lost

这段代码应该是不言自明的。

答案 1 :(得分:0)

PIL的ImagingCore可以很容易地转换为字节:

from PIL import Image


img = Image.open("python.jpg", "r")
data = img.convert("1").getdata()
bytes = bytearray(data)

这为您提供了一个bytearray()字节列表,然后可以将其操作或写入文件。您可以通过执行以下操作将其写入文件:

with open("filename", "w") as f:
    f.write(b"".join(map(bytes, data)))

我希望这有帮助!

值得注意的是Python实际上并非如此 有的数据类型。 list(data)返回 您以为int(s)列表而不是“位”?

示例:

>>> list(data)[:10]
[255, 255, 255, 255, 255, 255, 255, 255, 255, 255]
>>> set(list(data))
set([0, 255])
>>> set(map(type, list(data)))
set([<type 'int'>])

所以实际上你并没有通过这样做来保存任何数据。

请参阅:http://docs.python.org/2/library/stdtypes.html了解Python数据类型和操作。您可以执行“位”操作,但没有“位”数据类型。