我使用OpenCV上传了一张图片,然后使用base64
的b64encode
使用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'>
)看起来很相似。我试图使用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
我完全理解错误试图告诉我什么,但我的问题是,如何将编码图像(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.frombuffer
和PIL.frombytes
,但是,当我非常确定图像的大小时,他们返回了not enough data
值(在本例中为(256, 256)
)。
所以我的问题是,**如何将base64图像转换为PIL对象?**我希望这有助于更好地理解我的问题。
2条答案
按热度按时间ijxebb2r1#
Base64是一个二进制-〉字符编码,所以编码图像是有意义的,你得到文本字节,其中一组6位被认为是一个字符。
现在,即使上面的字节是字符,它们也不是python字符串,因为python字符串是utf-8。
当你把字节转换成字符串时,它会把它们转换成UTF-8,并把base64的填充搞得一团糟(只允许用=填充),你得到的是一个python字符串。
现在当你解码它的时候会得到错误,因为它不再是base64编码了。你也不能对字符串编码,因为base64是bytes -〉char,而字符串不是bytes。
你为什么要把编码后的字节转换成字符串呢?多描述一下你的用例会有帮助。
k3fezbri2#
在找到here的小演示之后,如果调用
decode()
将bytes更改为str而不是强制转换,则可以正确地重新编码为bytes。