Python PIL库有Image.getdata()
方法,它返回原始图像数据,写成:
list(im.convert("1").getdata())
将返回一个位数组。每个位对应一个图像像素 - 由于“1”模式,像素只能是黑色或白色。
我想要一个大小小8倍的数组。每个数组元素都包含一个字节。
我的问题是:
答案 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数据类型和操作。您可以执行“位”操作,但没有“位”数据类型。