6
5

More than 1 year has passed since last update.

AWS Lambda(Python)から直接画像を出力する方法(覚書)

Last updated at Posted at 2022-02-28

SVGを出力したい

特に何も考えずに Content-Type だけしっかり指定してあげればOK。

return {
	'statusCode': 200,
	'headers': {
		'Content-Type': 'image/svg+xml',
	},
	'isBase64Encoded': False,
	'body': '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">svg version="1.1" xmlns="http://www.w3.org/2000/svg">...',
}

PNGを出力したい

こっちが主題になります。
Pythonで画像を取り扱う場合、何らかのライブラリを使用することになると思いますが、今回はおそらく一番使われてるであろうPillowを使っていることにします。
他のライブラリでも応用できると思います。

import io
import base64
from PIL import Image
# :
# ここら辺で画像を色々なんとかして最終的に`image`に何か入ってると思いねぇ
# :
bytes_io = io.BytesIO()
image.save(bytes_io, format='PNG')
return {
	'statusCode': 200,
	'headers': {
		'Content-Type': 'image/png',
	},
	'isBase64Encoded': True,
	'body': base64.b64encode(bytes_io.getvalue()).decode('UTF-8'),
}

ポイントはPillow.Image.save()io.BytesIOに書き込み、getvalue()で取得したbytes型をBase64でエンコードしてやる、ってところです。
出力がバイナリの場合はisBase64EncodedTrueにした上でBase64でエンコードしたデータをbodyに入れる必要があります。
書き込み時のformatJPEG等に変更すればその形式で出力することができます。
あとはSVGと同様にContent-Typeを指定してあげればOKです。

最後に

この記事書いてる人は実はあんまりPython得意じゃありません。
なのでもっと良い方法あるよ!って方はコメントとかで教えてください。
ついで(?)に弊社ではサーバーサイドエンジニアを募集していますので、まずはざっくばらんにお話ししてみませんか?
下記からご応募お待ちしております。
https://herp.careers/v1/lanchester/Bucw0mXRKogc
https://www.wantedly.com/companies/lanchester
▼採用動画について:https://moovy.jp/job/651

6
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5