如何将Python numpy数组转换为base64输出
我基本上需要这样做,但是用Python而不是Javascript。我从socketio连接接收base64编码的字符串,将其转换为uint8并处理它,然后需要将其转换为base64字符串,以便将其发送回 因此,到目前为止,我已经得到了这个(我正在从socketio服务器获取如何将Python numpy数组转换为base64输出,python,arrays,base64,Python,Arrays,Base64,我基本上需要这样做,但是用Python而不是Javascript。我从socketio连接接收base64编码的字符串,将其转换为uint8并处理它,然后需要将其转换为base64字符串,以便将其发送回 因此,到目前为止,我已经得到了这个(我正在从socketio服务器获取数据字典): 如何反转此过程以从img返回base64\u image\u string 更新: 我已经通过以下方式解决了这个问题(从上面的代码片段继续): 有些令人困惑的是,new_image_string与base64_i
数据字典):
如何反转此过程以从img
返回base64\u image\u string
更新:
我已经通过以下方式解决了这个问题(从上面的代码片段继续):
有些令人困惑的是,new_image_string
与base64_image_string
不同,但是从new_image_string
渲染的图像看起来是一样的,所以我很满意 来自:
是二进制读取
我相信由于numpy.array
s支持缓冲协议,您只需要以下几点:
processed_string = base64.b64encode(img)
例如:
>>> encoded = b"aGVsbG8sIHdvcmxk"
>>> img = np.frombuffer(base64.b64decode(encoded), np.uint8)
>>> img
array([104, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100], dtype=uint8)
>>> img.tobytes()
b'hello, world'
>>> base64.b64encode(img)
b'aGVsbG8sIHdvcmxk'
>>>
我也有同样的问题。经过一些搜索和尝试,我的最终解决方案几乎与你的相同
唯一的区别是base64编码字符串是png
格式数据,因此在转换为np.array之前,我需要将其从RGBA
更改为RGB
通道:
image = image.convert ("RGB")
img = np.array(image)
在相反的过程中,您将数据处理为JPEG格式,可能这就是为什么new\u image\u string
与base64\u image\u string
不同的原因?等等,为什么您必须将numpy
数组转换为utf-8?base64字母是“abcdefghijklmnopqrstuvwxyzabefghijklmnopqrstuvxyz012456789+/=”Base64是一个8位二进制数据的标准(z.B.ausführbare程序,ZIP dateen order Bilder)。这意味着Base64是编码8位二进制数据(即可执行文件、ZIP文件或图像)的标准。是的,那又怎样?它是一个字节数组(uint8)。请参阅我发布的示例。无论如何,我不确定您为什么认为转换为utf8会有帮助…好的,很好,我不知道numpy数组是以字节为单位构造的,因为通常我将它们与组合数据类型(如float、integer)一起使用,…似乎save
toJPEG
是一个丢失函数。然后解码的图像字符串是no不再等同于原始图像。@MeadowMuffins只使用另一种无损格式,例如PNG。这太神奇了!但是,当我反序列化时,我的3-Dnumpy
数组仅显示为1-D-我必须使用数组附带的原始形状的值来重塑
,还是有办法绕过重塑代码>?Thx!这很难看,但我最终做了:有效负载=('nparr',img.shape,base64.b64encode(img.copy(order='C'))
并相应地进行反序列化。有办法解决吗?非常感谢!@jtlz2没有,但是你考虑过其他类似的序列化方法吗?谢谢,我尝试过这种方法(请参阅)-但最后,我认为在网络上使用base64比使用字节字符串更安全。你对哪个更可取有看法吗?@jtlz2抱歉,但我不太明白。base64生成字节字符串。从什么意义上讲更安全?numpy.save
在跨平台上更具可移植性,可以处理字节顺序和s如果我没有任意限制的选择,我无疑会使用numpy.save
而不是base64编码。它可能更快,而且绝对不会占用太多内存
processed_string = base64.b64encode(img)
>>> encoded = b"aGVsbG8sIHdvcmxk"
>>> img = np.frombuffer(base64.b64decode(encoded), np.uint8)
>>> img
array([104, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100], dtype=uint8)
>>> img.tobytes()
b'hello, world'
>>> base64.b64encode(img)
b'aGVsbG8sIHdvcmxk'
>>>
image = image.convert ("RGB")
img = np.array(image)