Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Python numpy数组转换为base64输出_Python_Arrays_Base64 - Fatal编程技术网

如何将Python numpy数组转换为base64输出

如何将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

我基本上需要这样做,但是用Python而不是Javascript。我从socketio连接接收base64编码的字符串,将其转换为uint8并处理它,然后需要将其转换为base64字符串,以便将其发送回

因此,到目前为止,我已经得到了这个(我正在从socketio服务器获取
数据
字典):

如何反转此过程以从
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
to
JPEG
是一个丢失函数。然后解码的图像字符串是no不再等同于原始图像。@MeadowMuffins只使用另一种无损格式,例如PNG。这太神奇了!但是,当我反序列化时,我的3-D
numpy
数组仅显示为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)