将base64的字符串转换回base64字节

时间:2018-06-24 22:41:25

标签: python python-3.x base64 aws-api-gateway

我已经使用OpenCV上传了图片,然后使用base64的{​​{1}}使用base64编码对其进行了编码。

b64encode

然后使用>>> import cv2 >>> import base64 >>> image = cv2.cvtColor(cv2.imread("some_image.jpg"), cv2.COLOR_BGR2RGB) >>> image_64 = base64.b64encode(image) >>> image_64 b'//////////////////... >>> type(image_64) <class 'bytes'> 方法将其转换为字符串。这将创建一个字符串的编码图像。

str()

两者(>>> image_64str = str(image_64) >>> image_64str b'//////////////////... >>> type(image_64str) <class 'str'> 类型和<class 'bytes'>)看起来都很相似。我尝试使用<class 'str'>的{​​{1}}和base64函数对它们进行解码。但是,当我解码b64decode时发生了错误。

decode()

我完全理解错误试图告诉我什么。但是我的问题是,如何将编码图像(image_64str)的字符串转换回字节?

我尝试再次在字符串上使用>>> image_64str.decode() Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'str' object has no attribute 'decode' >>> base64.b64decode(image_64str) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/base64.py", line 87, in b64decode return binascii.a2b_base64(s) binascii.Error: Incorrect padding 的'b64encode`。但是,它返回一个错误。

image_64str

请告知是否有人注意到我所缺少的东西。我正在使用Python 3.6。预先感谢。

编辑:为我的问题添加更多说明。

我能够启用AWS API Gateway二进制支持。我的目的是通过POST请求将图像作为二进制数据传递给API,并将其转换为PIL对象,以便我可以使用AWS Lambda在后端对其进行处理。使用API​​ Gateway,二进制数据使用base64二进制编码。

我使用python的base64函数将图像作为二进制数据打开(我想通过API传递两个图像)。然后我用字典来保存两个图像的二进制数据,例如

>>> str_to_b64 = base64.b64encode(image_64str) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6/lib/python3.6/base64.py", line 58, in b64encode encoded = binascii.b2a_base64(s, newline=False) TypeError: a bytes-like object is required, not 'str'

我使用python open库发送POST请求。我可以在data = {"data1": img_binary_data_1, "data2": img_binary_data_2}函数中传递的参数之一是request,因此我使用该参数传递了图像数据。

我能够发送请求。在Lambda后端中,我想将二进制数据转换为PIL对象以进行进一步处理。但是,似乎数据已打包为JSON格式,并且base64编码的二进制映像已上载为python字符串。我通过在AWS CloudWatch日志中打印数据来确认这一点。

我尝试使用post,但是以here为基础,您无法解码字符串。

我能够使用data解码字符串,并返回一个字节对象。但是,当尝试将其转换为PIL对象

.decode()

我收到一条错误消息

b64decode()

我尝试了this link中的一些解决方案,但是显然您不能使用字节对象来做到这一点。

我尝试使用img = imread(io.BytesIO(base64.b64decode(b64_string)))OSError: cannot identify image file <_io.BytesIO object at 0x1101dadb0>。但是,当我非常确定图像的大小(在这种情况下为PIL.frombuffer)时,他们返回了PIL.frombytes值。

所以我的问题是,如何将base64图像转换为PIL对象? 我希望这有助于更好地理解我的问题。预先感谢。

1 个答案:

答案 0 :(得分:0)

Base64是二进制-> char编码,因此对图像进行编码很有意义,您会得到 text 字节,其中6位一组被视为字符。

现在,即使以上字节是字符,它们也不是python字符串,因为python字符串是utf-8。

当您将字节转换为字符串时,会将其转换为utf-8并弄乱了base64填充(只允许填充=),而得到的是一个python字符串。

现在在解码它时会得到错误,因为它不再是base64编码。 您还不能对字符串进行编码,因为base64是字节-> char并且字符串不是字节。

为什么您仍要将编码的字节转换为字符串?对用例进行更多描述会有所帮助。