PIL:如何从POST解码Base 64?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (150)

我正在用烧瓶制作一个简单的API,它接受一个用Base 64编码的图像,然后用Pillow对其进行解码以进行进一步的处理。

我总是会遇到一个错误,就是Pillow看不懂我给它的字符串。代码如下:

import cStringIO
from PIL import Image
import base64

data = request.form
image_string = cStringIO.StringIO(base64.b64decode(data['img']))
image = Image.open(image_string)

这就产生了错误:

IOError: cannot identify image file <cStringIO.StringIO object at 0x10f84c7a0>
提问于
用户回答回答于

有一个元数据前缀data:image/jpeg;base64,包括在img场。通常,当将图像数据嵌入到文档或样式表中时,这些元数据将在CSS或HTML数据URI中使用。它可以向呈现浏览器提供嵌入式数据的MIME类型和编码。

您可以在Base 64解码之前去掉前缀,这将导致PIL可以加载的有效图像数据,但您确实需要询问元数据是如何像通常不应该提交的那样提交到服务器上的。

import re
import cStringIO
from PIL import Image

image_data = re.sub('^data:image/.+;base64,', '', data['img']).decode('base64')
image = Image.open(cStringIO.StringIO(image_data))
用户回答回答于

你应该尝试这样的方法:我将更改Google中的一个示例的图像字符串。

from PIL import Image
from io import BytesIO
import base64

data['img'] = '''R0lGODlhDwAPAKECAAAAzMzM/////wAAACwAAAAADwAPAAACIISPeQHsrZ5ModrLlN48CXF8m2iQ3YmmKqVlRtW4MLwWACH+H09wdGltaXplZCBieSBVbGVhZCBTbWFydFNhdmVyIQAAOw==''' 

im = Image.open(BytesIO(base64.b64decode(data)))

你的数据‘img’字符串不应包括html标记或参数。资料:Image/jpeg;base 64,在例子中。

扫码关注云+社区

领取腾讯云代金券