この記事では、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()
でフォントファイルを読み込む必要があります。