我一直在尝试使用套接字发送图像,但是我有一个很大的编码问题。我正在使用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相同的结果?
image
是bytes
值。
您不需要解码数据,也不需要在这里使用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个字母,每个输入字节。。
如果image
是bytes
值或实现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'"
。