我有一个相机的原始数据,它是mono12packed格式的。这是一种交错的位格式,可以将2 12位整数存储在3字节内,以消除开销。显式地,每3个字节的内存布局如下:
Byte 1 = Pixel0 Bits 11-4
Byte 2 = Pixel1 Bits 3-0 + Pixel0 Bits 3-0
Byte 3 = Pixel1 Bits 11-4我有一个文件,其中所有的字节都可以使用二进制读取读取,让我们假设它被称为binfile。
要从文件中获取像素数据,我需要:
from bitstring import BitArray as Bit
f = open(binfile, 'rb')
bytestring = f.read()
f.close()
a = []
for i in range(len(bytestring)/3): #reading 2 pixels = 3 bytes at a time
s = Bit(bytes = bytestring[i*3:i*3+3], length = 24)
p0 = s[0:8]+s[12:16]
p1 = s[16:]+s[8:12]
a.append(p0.unpack('uint:12'))
a.append(p1.unpack('uint:12'))这是可行的,但速度慢得可怕,我希望能更有效地做到这一点,因为我必须为大量的数据做到这一点。
我的想法是,通过一次读取超过3个字节,我可以在转换步骤中抽出一些时间,但我想不出如何做到这一点。
另一个想法是,由于比特是由4包组成的,所以也许有一种方法可以用来处理比特而不是比特。
数据示例:
字节
'\x07\x85\x07\x05\x9d\x06'引向数据
[117, 120, 93, 105]发布于 2017-03-02 11:27:48
你试过按位运算符吗?也许这是个更快的方法:
with open('binfile.txt', 'rb') as binfile:
bytestring = list(bytearray(binfile.read()))
a = []
for i in range(0, len(bytestring), 3):
px_bytes = bytestring[i:i+3]
p0 = (px_bytes[0] << 4) | (px_bytes[1] & 0x0F)
p1 = (px_bytes[2] << 4) | (px_bytes[1] >> 4 & 0x0F)
a.append(p0)
a.append(p1)
print a这也是输出:[117, 120, 93, 105]
希望能帮上忙!
https://stackoverflow.com/questions/42553534
复制相似问题