PythonのPillowで画像に図形やテキストを描画する方法

この記事では、Pythonの画像処理ライブラリPillowを使い、画像上に線、矩形、円、多角形といった図形や、様々なフォント・サイズのテキストを描画する方法を解説します。これらの機能は、ImageDrawモジュールとImageFontモジュールによって提供されます。


目次

1. 準備:ImageDrawオブジェクトの作成

図形やテキストを描画するには、まず土台となるImageオブジェクトを作成し、それをImageDraw.Draw()に渡してDrawオブジェクトを生成する必要があります。以降の描画操作は、すべてこのDrawオブジェクトを介して行います。

from PIL import Image, ImageDraw

# 300x200の白い画像を作成
img = Image.new('RGBA', (300, 200), 'white')

# 描画用のDrawオブジェクトを生成
draw = ImageDraw.Draw(img)

2. 図形を描画する

Drawオブジェクトは、様々な図形を描画するためのメソッドを持っています。

  • line(xy, fill, width): 線分を描画します。xyは座標のリスト [(x1,y1), (x2,y2), ...] です。
  • rectangle(xy, fill, outline): 矩形を描画します。xy(左, 上, 右, 下) の座標です。
  • ellipse(xy, fill, outline): 矩形領域に内接する楕円を描画します。
  • polygon(xy, fill, outline): 各頂点を結ぶ多角形を描画します。

fillは塗りつぶしの色、outlineは枠線の色を指定します。

from PIL import Image, ImageDraw

img = Image.new('RGBA', (300, 300), 'white')
draw = ImageDraw.Draw(img)

# 黒い枠線を描画
draw.line([(0,0), (299,0), (299,299), (0,299), (0,0)], fill='black')

# 青い矩形を描画
draw.rectangle((20, 30, 80, 80), fill='blue')

# 赤い楕円を描画
draw.ellipse((120, 30, 200, 90), fill='red', outline='black')

# 茶色の多角形を描画
draw.polygon(((150, 150), (200, 200), (180, 250), (120, 200)), fill='brown')

# 緑色の線を複数描画
for i in range(100, 300, 20):
    draw.line([(i, 100), (300, i)], fill='green')

img.save('drawing_example.png')
print("drawing_example.png を保存しました。")

3. テキストを描画する

draw.text()メソッドを使うと、画像上にテキストを描画できます。カスタムフォントやサイズを指定するにはImageFontモジュールを使用します。

ImageFont.truetype(font, size) .ttf.ttcといったTrueTypeフォントファイルからフォントオブジェクトを生成します。fontには、システムに存在するフォントファイルへのパスを指定する必要があります。

from PIL import Image, ImageDraw, ImageFont

img = Image.new('RGBA', (400, 200), 'white')
draw = ImageDraw.Draw(img)

# デフォルトフォントでテキストを描画
draw.text((20, 20), 'Hello, World!', fill='purple')

# TrueTypeフォントを読み込んで描画
# 'arial.ttf'がシステムに存在する必要があります
try:
    # Windows: C:/Windows/Fonts/arial.ttf
    # macOS: /System/Library/Fonts/Supplemental/Arial.ttf
    arial_font = ImageFont.truetype('arial.ttf', 32)
    draw.text((20, 80), 'Custom Font Text', fill='gray', font=arial_font)
except IOError:
    print("Arialフォントが見つかりません。")

# 日本語を描画するには、日本語に対応したフォントファイルを指定
try:
    # Windowsの場合の例
    jp_font = ImageFont.truetype('meiryo.ttc', 24)
    draw.text((20, 140), 'こんにちは、世界!', fill='black', font=jp_font)
except IOError:
    print("メイリオフォントが見つかりません。")

img.save('text_example.png')
print("text_example.png を保存しました。")

まとめ

PillowのImageDrawモジュールは、画像上に図形やテキストをプログラムで描画するためのシンプルで強力なインターフェースです。まずベースとなるImageオブジェクトからDrawオブジェクトを生成し、.line().rectangle()などのメソッドで図形を、.text()でテキストを描画します。カスタムフォントを使用する際は、ImageFont.truetype()でフォントファイルを読み込む必要があります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次