在python3-x中解码bytearray



我一直在尝试使用套接字发送图像,但是我有一个很大的编码问题。我正在使用Python-2.7和Python-3上的客户端运行服务器。

我认为问题出在此功能中:

def decode_image(image):
    imageArray = str(bytearray(image))
    nparr = np.fromstring(imageArray, np.uint8)
    nparr.shape = (320, 240, 3)
    nparr = cv2.cvtColor(nparr, cv2.COLOR_BGR2RGB)
    print(nparr)
    return nparr

如果我使用python2.7解释器运行代码,一切正常起作用,但是,使用Python3解释器,则不会。我遇到的错误如下:

nparr.shape = (320, 240, 3)
ValueError: cannot reshape array of size 597048 into shape (320,240,3)

这意味着代替320*240*3(230400(解码元素有597048。用python3解码bytearray的等效方法是什么,以获得与python2.7相同的结果?

imagebytes值。

您不需要解码数据,也不需要在这里使用bytearray()。Numpy可以使用numpy.frombuffer()直接接受bytes值。

您看到的错误是由于str()调用:

str(bytearray(image))

返回 bytearray()对象的 python表示

>>> bytearray(5)
bytearray(b'x00x00x00x00x00')
>>> str(bytearray(5))
"bytearray(b'\x00\x00\x00\x00\x00')"

str()返回了一个带有与第一个表达式相同的数据的字符串。您将bytearray(b'前缀,字面的x字符和数字传递给Numpy。这是围绕您数据的14个字节,并且数据本身已被一个很大的因素激增,因为任何不可打印的字符都已被分为ASCII HEX数字,再加上Backslash和x字符。这就是为什么您的数据无法重塑的原因,您的二进制数据 230400字节长,但已被"重塑"到恰好使用597048个字符的字符串表示形式,因此大约2.6个字母,每个输入字节。。

如果imagebytes值或实现Python Buffer接口的对象,则只需将此值直接传递给numpy.frombuffer() ::

nparr = np.frombuffer(image, np.uint8)

如果 image可能是整数或整数的整数(0-255(,则只需从该值创建一个bytes()对象即可。因此,以下行适用于任何类型的image可能是:

nparr = np.frombuffer(bytes(image), np.uint8)

bytearray()可能已经接受并且仍然有效,但是这些类型在您的特定代码示例中无法使用。

您应该decode bytearray;

imageArray = bytearray(image).decode()

这是一个示例(从文档进行了修改(:

>>> np.fromstring(b'1 2'.decode(), dtype=int, sep=' ')
array([1, 2])

另一方面:str(b'1 2') == "b'1 2'"

最新更新