AWS Lambdaでpillowを使って画像に日本語の文字を描画する

AWS Lambdaでpillowを使って画像に日本語の文字を描画する

日本語のフォントをLambdaで使います。
Clock Icon2025.05.14

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バケットを確認する

期待通り、画像ファイルがありました。

01_s3

画像を確認する

日本語フォントが未指定の日本語は文字化けしており、日本語フォントを指定した日本語は文字化けしていません。

11_output

さいごに

フォントファイルを置くだけで利用できました。簡単に利用できて良かったです。

参考

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.