python-3.x 将base64字符串转换回base64字节

xxe27gdn  于 2023-03-04  发布在  Python
关注(0)|答案(2)|浏览(303)

我使用OpenCV上传了一张图片,然后使用base64b64encode使用base64编码对其进行编码。

>>> 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'>)看起来很相似。我试图使用base64b64decodedecode()函数对它们进行解码。但是,当我解码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

我完全理解错误试图告诉我什么,但我的问题是,如何将编码图像(image_64str)的字符串转换回字节?
我尝试在字符串上再次使用base64的'b64 encode',但是,它返回了一个错误。

>>> 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 3. 6。提前感谢。

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

我能够启用AWS API Gateway二进制支持。我的目的是通过POST请求将图像作为二进制数据传递给API,并将其转换为PIL对象,以便我可以使用AWS Lambda在后端处理它。使用API Gateway,二进制数据使用base64二进制编码。
我使用python的open函数将图像作为二进制数据打开(我希望通过API传递两个图像),然后使用字典保存这两个图像的二进制数据,如下所示
data = {"data1": img_binary_data_1, "data2": img_binary_data_2}
我使用python request库发送POST请求。我可以在post函数中传递的参数之一是data,因此我使用它传递图像数据。
我可以发送请求。在Lambda后端,我想将二进制数据转换为PIL对象以进行进一步处理。但是,数据似乎被打包为JSON格式,base64编码的二进制图像已被转换为python字符串。我通过打印AWS CloudWatch日志中的数据确认了这一点。
我尝试使用.decode(),但基本here不能解码字符串。
我可以使用b64decode()解码字符串,返回一个byte对象。但是,当尝试将其转换为PIL对象时,如
img = imread(io.BytesIO(base64.b64decode(b64_string)))
我收到一条错误消息
OSError: cannot identify image file <_io.BytesIO object at 0x1101dadb0>
我尝试了this link中的一些解决方案,但显然不能用byte-object来实现。
我试过使用PIL.frombufferPIL.frombytes,但是,当我非常确定图像的大小时,他们返回了not enough data值(在本例中为(256, 256))。
所以我的问题是,**如何将base64图像转换为PIL对象?**我希望这有助于更好地理解我的问题。

ijxebb2r

ijxebb2r1#

Base64是一个二进制-〉字符编码,所以编码图像是有意义的,你得到文本字节,其中一组6位被认为是一个字符。
现在,即使上面的字节是字符,它们也不是python字符串,因为python字符串是utf-8。
当你把字节转换成字符串时,它会把它们转换成UTF-8,并把base64的填充搞得一团糟(只允许用=填充),你得到的是一个python字符串。
现在当你解码它的时候会得到错误,因为它不再是base64编码了。你也不能对字符串编码,因为base64是bytes -〉char,而字符串不是bytes。
你为什么要把编码后的字节转换成字符串呢?多描述一下你的用例会有帮助。

k3fezbri

k3fezbri2#

在找到here的小演示之后,如果调用decode()将bytes更改为str而不是强制转换,则可以正确地重新编码为bytes。

>>> image_64str = image_64.decode()
>>> image_64str
b'//////////////////...'
>>> type(image_64str)
<class 'str'>
>>> image_64_2 = image_64str.encode()
>>> image_2 = base64.b64decode(image_64str_2)

相关问题