使用AWS Lambda服务动态创建JPG图像

时间:2016-09-24 00:37:01

标签: dynamic flask jpeg aws-lambda alexa

我正在尝试创建一个动态创建的图形作为JPG文件,我可以在Alexa Skill标准卡中使用它作为响应的一部分。当我在我的计算机上本地运行JPG图像时,以下代码在使用带有URL" http://localhost:5000/image.jpg"的浏览器时会创建JPG图像。

from flask import send_file
from flask import Flask
from PIL import Image, ImageDraw
from io import BytesIO


app = Flask(__name__)
app.config['DEBUG'] = True


def serve_pil_image(pil_img):
    img_io = BytesIO()
    pil_img.save(img_io, 'JPEG', quality=70)
    img_io.seek(0)
    return send_file(img_io, mimetype='image/jpeg')

@app.route('/image.jpg')
def serve_img():
    size = (128,128)
    background = (128,128,55)
    xy = [(0,0),(10,10),(20,20),(30,12),(50,50),(70,9),(90,70)]

    img = Image.new('RGB',size,background)
    draw = ImageDraw.Draw(img)
    draw.line(xy, fill=128, width=5)
    return serve_pil_image(img)


if __name__ == '__main__':

    app.run(debug=True)

但是,当我使用Zappa将相同的代码部署到AWS Lambda服务时,我收到以下错误消息(来自CloudWatch日志):

An error occurred during JSON serialization of response: 'utf8' codec can't decode byte 0xff in position 0: invalid start byte
Traceback (most recent call last):
File "/usr/lib64/python2.7/json/__init__.py", line 250, in dumps
sort_keys=sort_keys, **kw).encode(obj)
File "/usr/lib64/python2.7/json/encoder.py", line 207, in encode
chunks = self.iterencode(o, _one_shot=True)
File "/usr/lib64/python2.7/json/encoder.py", line 270, in iterencode
return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 0: invalid start byte

是否有一些配置选项可以解决此问题?到目前为止我还没找到。

2 个答案:

答案 0 :(得分:0)

Binary Support is finally here!你应该看看它并再试一次。

答案 1 :(得分:0)

如果要通过API网关提供二进制数据(在本例中为Base64图像),则需要设置以下内容:

  1. 在您方法的方法响应中 在HTTP 200状态响应中将Content-Type设置为image/jpeg
  2. 在您方法的集成响应中 在标头映射中将Content-Type设置为'image/jpeg'注意引用!
  3. 使用AWS CLI,在集成响应中将contentHandling属性设置为CONVERT_TO_BINARY
  4. 在这个伟大的分步指南中检查整个过程:https://stackoverflow.com/a/41434295/720665
    (例如,对于base64编码的png图像,但它的要点是相同的)