在Python3-x中解码字节数组

时间:2019-07-08 18:03:24

标签: python arrays python-3.x numpy

我一直在尝试使用套接字发送图像,但是我遇到了很大的编码问题。我正在使用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解码字节数组以获得与python2.7相同的结果的等效方法是什么?

image是一个bytes值。

2 个答案:

答案 0 :(得分:1)

您应decode bytearray

imageArray = bytearray(image).decode()

这是一个示例(从the docs修改):

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

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

答案 1 :(得分:1)

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

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

str(bytearray(image))

返回bytearray()对象的 Python表示形式

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

str()返回了一个字符串,该字符串具有与第一个表达式所回显的数据相同的数据。您正在将bytearray(b'前缀,文字\x字符和数字传递给numpy。那是围绕您的数据的14个字节的额外数据,并且数据本身已经膨胀了很大一部分,因为所有不可打印的字符都被分割为ASCII十六进制数字加上反斜杠和x字符。这就是为什么您的数据无法整形的原因,您的二进制数据长230400字节,但已被“整形”为恰好使用597048个字符的字符串表示形式,因此每个输入字节大约2.6个字母

如果image是一个bytes值或一个实现Python缓冲区接口的对象,只需将此值直接传递给numpy.frombuffer()

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

如果image可以是整数(0-255)或整数可迭代,则只需根据该值创建一个bytes()对象。因此,无论哪种类型的image,以下行都将正确运行:

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

bytearray()可能接受并仍然可以使用其他类型,但是在您的特定代码示例中将不起作用。