AWS Lambdaでpillowを使って画像に日本語の文字を描画する
日本語のフォントをLambdaで使います。
pillowを使って画像に日本語の文字を描画するためには、日本語のフォントが必要です。AWS Lambdaでどのように実現するのか気になったので、試してみました。
おすすめの方
- AWS Lambdaでpillowを利用したい方
- AWS Lambdaでpillowを使って画像に日本語の文字を描画したい方
フォントファイルを用意する
本記事では、IPAexフォントで試してみます。
Lambdaをデプロイする
sam init
sam init \
--runtime python3.11 \
--name lambda-pillow-japanese-sample \
--app-template hello-world \
--no-tracing \
--no-application-insights \
--structured-logging \
--package-type Zip
SAMテンプレート
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: lambda-pillow-japanese-sample
Globals:
Function:
Timeout: 10
LoggingConfig:
LogFormat: JSON
Resources:
Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: blog-lambda-pillow-japanese-sample-bucket
HelloWorldFunction:
Type: AWS::Serverless::Function
Properties:
FunctionName: blog-lambda-pillow-japanese-sample-function
CodeUri: hello_world/
Handler: app.lambda_handler
Runtime: python3.11
Policies:
- arn:aws:iam::aws:policy/AmazonS3FullAccess
Environment:
Variables:
BUCKET_NAME: !Ref Bucket
Architectures:
- x86_64
HelloWorldFunctionLogGroup:
Type: AWS::Logs::LogGroup
Properties:
LogGroupName: !Sub /aws/lambda/${HelloWorldFunction}
requirements.txt
pillow
Lambdaコード
次の2つを試します。
- 日本語フォントを未指定で、日本語を描画する
- 日本語フォントを指定して、日本語を描画する
import os
import boto3
from PIL import Image, ImageDraw, ImageFont
BUCKET_NAME = os.environ["BUCKET_NAME"]
s3 = boto3.client("s3")
def lambda_handler(event, context):
image = Image.new("RGB", (400, 200), "white")
draw = ImageDraw.Draw(image)
draw.text((10, 10), "Hello World", fill="black")
# これは文字化けする(日本語フォントが未指定のため)
draw.text((10, 110), "はろー??", fill="black")
font = ImageFont.truetype("ipaexg.ttf", 20)
draw.text((110, 10), "Hello World!!!", font=font, fill="red")
draw.text((110, 110), "はろー!", font=font, fill="red")
# 画像を/tmpに保存する
output_file_name = f"{context.aws_request_id}.png"
output_file_path = os.path.join("/tmp", output_file_name)
image.save(output_file_path)
# S3にアップロードする
s3.upload_file(output_file_path, BUCKET_NAME, output_file_name)
フォントファイル(ipaexg.ttf)をLambdaコードと同じディレクトリに格納する
└── hello_world
├── __init__.py
├── app.py
├── ipaexg.ttf
└── requirements.txt
デプロイ
sam build --use-container
sam deploy \
--region ap-northeast-1 \
--stack-name lambda-pillow-japanese-sample-stack
Lambdaを実行し、S3バケットの画像を確認する
Lambdaを実行する
aws lambda invoke \
--function-name blog-lambda-pillow-japanese-sample-function \
output.txt
S3バケットを確認する
期待通り、画像ファイルがありました。
画像を確認する
日本語フォントが未指定の日本語は文字化けしており、日本語フォントを指定した日本語は文字化けしていません。
さいごに
フォントファイルを置くだけで利用できました。簡単に利用できて良かったです。