[Python] テキストを画像に変換したり挿入する方法
Pythonでテキストを画像に変換したり挿入するには、主にPillowライブラリを使用します。
PillowはPython Imaging Library (PIL) の後継で、画像の生成や編集が可能です。
テキストを画像に挿入するには、Image
オブジェクトを作成し、ImageDraw.Draw
を使って描画します。
フォントの指定にはImageFont.truetype
を使用します。
テキストの位置や色、フォントサイズを指定して描画することができます。
新たなプロジェクトでこれらの技術を活用してみることをお勧めします
Pillowライブラリのインストールと基本設定
Pythonで画像処理を行うためのライブラリ Pillow
を使用することで、テキストを画像に変換したり、画像にテキストを挿入することができます。
まずは、Pillowのインストール方法と基本的な設定について解説します。
Pillowのインストール方法
PillowはPythonのパッケージ管理ツール pip
を使用して簡単にインストールできます。
以下のコマンドをターミナルまたはコマンドプロンプトで実行してください。
pip install Pillow
Pillowを使った画像の基本操作
Pillowを使うと、画像の読み込み、表示、保存などの基本操作が可能です。
以下は、画像を読み込んで表示するサンプルコードです。
from PIL import Image
# 画像を読み込む
image = Image.open("sample.jpg")
# 画像を表示する
image.show()
このコードを実行すると、指定した画像ファイルが表示されます。
画像の作成と保存方法
新しい画像を作成し、保存することもできます。
以下のサンプルコードでは、白い背景の画像を作成し、PNG形式で保存します。
from PIL import Image
# 新しい画像を作成(幅: 200px, 高さ: 100px, 背景色: 白)
new_image = Image.new("RGB", (200, 100), "white")
# 画像を保存する
new_image.save("new_image.png")
このコードを実行すると、指定したサイズと背景色の新しい画像が作成され、new_image.png
として保存されます。
画像のサイズや背景色の指定
画像を作成する際に、サイズや背景色を指定することができます。
以下のサンプルコードでは、異なるサイズと背景色の画像を作成します。
from PIL import Image
# 幅: 300px, 高さ: 150px, 背景色: 青
blue_image = Image.new("RGB", (300, 150), "blue")
blue_image.save("blue_image.png")
# 幅: 400px, 高さ: 200px, 背景色: 赤
red_image = Image.new("RGB", (400, 200), "red")
red_image.save("red_image.png")
このコードを実行すると、青と赤の背景色を持つ2つの画像が作成され、それぞれblue_image.png
とred_image.png
として保存されます。
テキストを画像に挿入する基本手順
Pillowライブラリを使用すると、画像にテキストを挿入することができます。
ここでは、テキストを画像に描画するための基本的な手順を解説します。
ImageDrawモジュールの使い方
ImageDraw
モジュールを使用すると、画像に描画を行うことができます。
以下のサンプルコードでは、空の画像を作成し、ImageDraw
を使ってテキストを描画します。
from PIL import Image, ImageDraw
# 新しい画像を作成(幅: 400px, 高さ: 200px, 背景色: 白)
image = Image.new("RGB", (400, 200), "white")
# ImageDrawオブジェクトを作成
draw = ImageDraw.Draw(image)
このコードでは、白い背景の新しい画像を作成し、ImageDraw
オブジェクトを生成しています。
ImageFontモジュールでフォントを指定する
テキストを描画する際には、フォントを指定する必要があります。
ImageFont
モジュールを使用して、システムフォントやカスタムフォントを指定できます。
以下のサンプルコードでは、デフォルトのフォントを使用します。
from PIL import ImageFont
# デフォルトフォントを使用
font = ImageFont.load_default()
カスタムフォントを使用する場合は、フォントファイルのパスを指定して読み込むことができます。
# カスタムフォントを指定(例: "path/to/font.ttf")
font = ImageFont.truetype("path/to/font.ttf", size=24)
テキストの位置と色の指定
テキストを描画する位置や色を指定することができます。
以下のサンプルコードでは、テキストの位置を指定し、色を赤に設定しています。
# テキストの位置
text_position = (50, 80)
# テキストの色
text_color = "red"
# テキストを描画
draw.text(text_position, "こんにちは、世界!", fill=text_color, font=font)
このコードでは、指定した位置に赤色のテキストを描画しています。
テキストの描画と画像の保存
テキストを描画した後は、画像を保存することができます。
以下のサンプルコードでは、テキストを描画した画像をPNG形式で保存します。
# 画像を保存する
image.save("text_image.png")
このコードを実行すると、テキストが描画された画像がtext_image.png
として保存されます。
全体のコードをまとめると、以下のようになります。
from PIL import Image, ImageDraw, ImageFont
# 新しい画像を作成
image = Image.new("RGB", (400, 200), "white")
draw = ImageDraw.Draw(image)
# フォントを指定
font = ImageFont.load_default()
# テキストの位置と色を指定
text_position = (50, 80)
text_color = "red"
# テキストを描画
draw.text(text_position, "こんにちは、世界!", fill=text_color, font=font)
# 画像を保存する
image.save("text_image.png")
このコードを実行すると、指定したテキストが描画された画像が生成されます。
フォントのカスタマイズ
Pillowを使用して画像にテキストを描画する際、フォントのカスタマイズが可能です。
ここでは、システムフォントの指定方法やカスタムフォントの読み込み、フォントサイズやスタイルの調整、フォントの色や透明度の設定について解説します。
システムフォントの指定方法
Pillowでは、デフォルトのフォントを使用することができます。
以下のサンプルコードでは、デフォルトフォントを使用してテキストを描画します。
from PIL import Image, ImageDraw, ImageFont
# 新しい画像を作成
image = Image.new("RGB", (400, 200), "white")
draw = ImageDraw.Draw(image)
# デフォルトフォントを使用
font = ImageFont.load_default()
# テキストを描画
draw.text((50, 80), "デフォルトフォント", fill="black", font=font)
# 画像を保存
image.save("default_font_image.png")
このコードを実行すると、デフォルトフォントを使用したテキストが描画された画像が生成されます。
カスタムフォントの読み込み
カスタムフォントを使用する場合、フォントファイル(.ttfや.otf形式)を指定して読み込むことができます。
以下のサンプルコードでは、カスタムフォントを読み込んでテキストを描画します。
# カスタムフォントを指定(例: "path/to/font.ttf")
font = ImageFont.truetype("path/to/font.ttf", size=24)
# テキストを描画
draw.text((50, 80), "カスタムフォント", fill="black", font=font)
# 画像を保存
image.save("custom_font_image.png")
このコードを実行すると、指定したカスタムフォントを使用したテキストが描画された画像が生成されます。
フォントサイズとスタイルの調整
フォントサイズは、ImageFont.truetypeメソッド
の第二引数で指定できます。
以下のサンプルコードでは、異なるサイズのフォントを使用してテキストを描画します。
# 大きなフォントを指定
large_font = ImageFont.truetype("path/to/font.ttf", size=48)
draw.text((50, 120), "大きなフォント", fill="black", font=large_font)
# 小さなフォントを指定
small_font = ImageFont.truetype("path/to/font.ttf", size=12)
draw.text((50, 160), "小さなフォント", fill="black", font=small_font)
# 画像を保存
image.save("font_size_image.png")
このコードを実行すると、異なるサイズのフォントを使用したテキストが描画された画像が生成されます。
フォントの色や透明度の設定
フォントの色は、fill
引数で指定できます。
また、透明度を設定するためには、RGBAモードを使用して画像を作成する必要があります。
以下のサンプルコードでは、透明度を持つテキストを描画します。
# RGBAモードで新しい画像を作成(背景色: 白、透明度: 0)
image = Image.new("RGBA", (400, 200), (255, 255, 255, 0))
draw = ImageDraw.Draw(image)
# フォントの色を指定(赤色、透明度: 128)
text_color = (255, 0, 0, 128) # 赤色の半透明
# テキストを描画
draw.text((50, 80), "透明なテキスト", fill=text_color, font=font)
# 画像を保存
image.save("transparent_text_image.png")
このコードを実行すると、透明度を持つテキストが描画された画像が生成されます。
これにより、フォントの色や透明度を自由にカスタマイズすることができます。
テキストの配置とレイアウト
Pillowを使用して画像にテキストを描画する際、テキストの配置やレイアウトを調整することができます。
ここでは、テキストの中央揃えや右揃え、複数行のテキストの描画、テキストの回転や傾きの設定、テキストの縁取りや影をつける方法について解説します。
テキストの中央揃えや右揃え
テキストを中央揃えや右揃えにするには、画像のサイズを考慮してテキストの位置を計算する必要があります。
以下のサンプルコードでは、テキストを中央揃えと右揃えで描画します。
from PIL import Image, ImageDraw, ImageFont
# 新しい画像を作成
image = Image.new("RGB", (400, 200), "white")
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
# 中央揃え
text = "中央揃え"
text_width, text_height = draw.textsize(text, font=font)
center_position = ((400 - text_width) // 2, (200 - text_height) // 2)
draw.text(center_position, text, fill="black", font=font)
# 右揃え
text = "右揃え"
text_width, text_height = draw.textsize(text, font=font)
right_position = (400 - text_width - 10, (200 - text_height) // 2)
draw.text(right_position, text, fill="black", font=font)
# 画像を保存
image.save("text_alignment_image.png")
このコードを実行すると、中央揃えと右揃えのテキストが描画された画像が生成されます。
複数行のテキストを描画する方法
複数行のテキストを描画するには、テキストを行ごとに分割し、各行の位置を調整する必要があります。
以下のサンプルコードでは、複数行のテキストを描画します。
# 新しい画像を作成
image = Image.new("RGB", (400, 200), "white")
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
# 複数行のテキスト
lines = ["これは1行目", "これは2行目", "これは3行目"]
y_position = 20 # 初期Y位置
for line in lines:
draw.text((10, y_position), line, fill="black", font=font)
y_position += 30 # 行間を調整
# 画像を保存
image.save("multi_line_text_image.png")
このコードを実行すると、複数行のテキストが描画された画像が生成されます。
テキストの回転や傾きの設定
テキストを回転させるには、画像を一度回転させてから描画する必要があります。
以下のサンプルコードでは、テキストを45度回転させて描画します。
# 新しい画像を作成
image = Image.new("RGB", (400, 200), "white")
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
# テキストを描画
text = "回転テキスト"
text_image = Image.new("RGB", (200, 50), "white")
text_draw = ImageDraw.Draw(text_image)
text_draw.text((0, 0), text, fill="black", font=font)
# テキストを回転
rotated_text_image = text_image.rotate(45, expand=1)
# 回転したテキストを元の画像に貼り付け
image.paste(rotated_text_image, (100, 75), rotated_text_image)
# 画像を保存
image.save("rotated_text_image.png")
このコードを実行すると、45度回転したテキストが描画された画像が生成されます。
テキストの縁取りや影をつける方法
テキストに縁取りや影をつけることで、視認性を向上させることができます。
以下のサンプルコードでは、テキストに影をつける方法を示します。
# 新しい画像を作成
image = Image.new("RGB", (400, 200), "white")
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
# テキストの影を描画
shadow_offset = (2, 2)
draw.text((10 + shadow_offset[0], 20 + shadow_offset[1]), "影付きテキスト", fill="gray", font=font)
# テキストを描画
draw.text((10, 20), "影付きテキスト", fill="black", font=font)
# 画像を保存
image.save("text_with_shadow_image.png")
このコードを実行すると、影付きのテキストが描画された画像が生成されます。
縁取りをつける場合は、影の色を変更し、テキストを重ねて描画することで実現できます。
応用例:動的にテキストを画像に挿入する
Pillowを使用すると、動的にテキストを画像に挿入することができます。
ここでは、日付や時刻の挿入、ユーザー入力に基づくテキストの挿入、データベースの内容を画像に反映する方法、Webアプリケーションでの利用例について解説します。
日付や時刻を画像に挿入する
Pythonのdatetime
モジュールを使用して、現在の日付や時刻を取得し、画像に挿入することができます。
以下のサンプルコードでは、現在の日付と時刻を描画します。
from PIL import Image, ImageDraw, ImageFont
from datetime import datetime
# 新しい画像を作成
image = Image.new("RGB", (400, 200), "white")
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
# 現在の日付と時刻を取得
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# テキストを描画
draw.text((10, 80), f"現在の時刻: {current_time}", fill="black", font=font)
# 画像を保存
image.save("current_time_image.png")
このコードを実行すると、現在の日付と時刻が描画された画像が生成されます。
ユーザー入力に基づいてテキストを挿入する
ユーザーからの入力を受け取り、その内容を画像に描画することも可能です。
以下のサンプルコードでは、ユーザーに名前を入力させ、その名前を画像に描画します。
# ユーザーから名前を入力
user_name = input("名前を入力してください: ")
# 新しい画像を作成
image = Image.new("RGB", (400, 200), "white")
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
# ユーザーの名前を描画
draw.text((10, 80), f"こんにちは、{user_name}さん!", fill="black", font=font)
# 画像を保存
image.save("user_input_image.png")
このコードを実行すると、ユーザーが入力した名前が描画された画像が生成されます。
データベースの内容を画像に反映する
データベースから取得したデータを画像に描画することもできます。
以下のサンプルコードでは、SQLiteデータベースからデータを取得し、その内容を画像に描画します。
import sqlite3
from PIL import Image, ImageDraw, ImageFont
# SQLiteデータベースに接続
conn = sqlite3.connect("example.db")
cursor = conn.cursor()
# データを取得
cursor.execute("SELECT name FROM users LIMIT 1")
user_name = cursor.fetchone()[0]
# 新しい画像を作成
image = Image.new("RGB", (400, 200), "white")
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
# データベースから取得した名前を描画
draw.text((10, 80), f"ユーザー名: {user_name}", fill="black", font=font)
# 画像を保存
image.save("db_content_image.png")
# データベース接続を閉じる
conn.close()
このコードを実行すると、データベースから取得したユーザー名が描画された画像が生成されます。
Webアプリケーションでの利用例
Pillowを使用して、Webアプリケーションで動的に画像を生成することも可能です。
Flaskを使用した簡単なWebアプリケーションの例を以下に示します。
from flask import Flask, send_file
from PIL import Image, ImageDraw, ImageFont
from datetime import datetime
import io
app = Flask(__name__)
@app.route('/generate_image')
def generate_image():
# 新しい画像を作成
image = Image.new("RGB", (400, 200), "white")
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
# 現在の日付と時刻を取得
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
draw.text((10, 80), f"現在の時刻: {current_time}", fill="black", font=font)
# 画像をバイナリストリームに保存
img_io = io.BytesIO()
image.save(img_io, 'PNG')
img_io.seek(0)
return send_file(img_io, mimetype='image/png')
if __name__ == '__main__':
app.run(debug=True)
このコードを実行すると、/generate_image
エンドポイントにアクセスすることで、現在の日付と時刻が描画された画像を生成し、ブラウザに表示します。
これにより、Webアプリケーションで動的に画像を生成することができます。
応用例:画像にテキストを重ねる
Pillowを使用すると、既存の画像にテキストを重ねることができます。
ここでは、既存の画像にテキストを挿入する方法、透明なテキストの重ね方、画像の一部にテキストを挿入する方法、テキストの背景に半透明のボックスを追加する方法について解説します。
既存の画像にテキストを挿入する方法
既存の画像にテキストを挿入するには、まず画像を読み込み、その上にテキストを描画します。
以下のサンプルコードでは、既存の画像にテキストを挿入します。
from PIL import Image, ImageDraw, ImageFont
# 既存の画像を読み込む
image = Image.open("background.jpg")
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
# テキストを描画
draw.text((50, 50), "こんにちは、世界!", fill="black", font=font)
# 画像を保存
image.save("text_on_image.png")
このコードを実行すると、指定した位置にテキストが挿入された画像が生成されます。
画像の上に透明なテキストを重ねる
透明なテキストを画像の上に重ねるには、RGBAモードで画像を作成し、透明度を設定した色を使用します。
以下のサンプルコードでは、透明なテキストを描画します。
# 既存の画像を読み込む
image = Image.open("background.jpg").convert("RGBA")
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
# 透明なテキストの色(赤色、透明度: 128)
text_color = (255, 0, 0, 128)
# テキストを描画
draw.text((50, 50), "透明なテキスト", fill=text_color, font=font)
# 画像を保存
image.save("transparent_text_on_image.png")
このコードを実行すると、透明なテキストが重ねられた画像が生成されます。
画像の一部にテキストを挿入する
画像の特定の部分にテキストを挿入するには、テキストの位置を調整する必要があります。
以下のサンプルコードでは、画像の右下にテキストを挿入します。
# 既存の画像を読み込む
image = Image.open("background.jpg")
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
# テキストの位置を計算(右下)
text = "右下に挿入"
text_width, text_height = draw.textsize(text, font=font)
position = (image.width - text_width - 10, image.height - text_height - 10)
# テキストを描画
draw.text(position, text, fill="black", font=font)
# 画像を保存
image.save("text_in_bottom_right.png")
このコードを実行すると、画像の右下にテキストが挿入された画像が生成されます。
テキストの背景に半透明のボックスを追加する
テキストの視認性を向上させるために、テキストの背景に半透明のボックスを追加することができます。
以下のサンプルコードでは、テキストの背景に半透明のボックスを描画します。
# 既存の画像を読み込む
image = Image.open("background.jpg")
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
# テキストとボックスの位置
text = "半透明ボックス付き"
text_position = (50, 50)
text_width, text_height = draw.textsize(text, font=font)
# 半透明のボックスを描画
box_color = (255, 255, 255, 128) # 白色、透明度: 128
draw.rectangle([text_position, (text_position[0] + text_width, text_position[1] + text_height)], fill=box_color)
# テキストを描画
draw.text(text_position, text, fill="black", font=font)
# 画像を保存
image.save("text_with_transparent_box.png")
このコードを実行すると、テキストの背景に半透明のボックスが追加された画像が生成されます。
これにより、テキストがより見やすくなります。
応用例:テキストを画像に変換して保存する
Pillowを使用すると、テキストを画像として保存することができます。
ここでは、テキストを画像として保存する方法、画像フォーマットの選択、画像の解像度や品質の調整、テキストを画像に変換する際の注意点について解説します。
テキストを画像として保存する方法
テキストを画像として保存するには、まず新しい画像を作成し、その上にテキストを描画してから保存します。
以下のサンプルコードでは、テキストを画像として保存します。
from PIL import Image, ImageDraw, ImageFont
# 新しい画像を作成
image = Image.new("RGB", (400, 200), "white")
draw = ImageDraw.Draw(image)
font = ImageFont.load_default()
# テキストを描画
text = "テキストを画像に変換"
draw.text((10, 80), text, fill="black", font=font)
# 画像を保存
image.save("text_image.png")
このコードを実行すると、指定したテキストが描画された画像がtext_image.png
として保存されます。
画像フォーマットの選択(PNG, JPEGなど)
Pillowでは、さまざまな画像フォーマットで保存することができます。
一般的なフォーマットにはPNG、JPEG、BMPなどがあります。
以下のサンプルコードでは、PNGとJPEG形式で画像を保存します。
# PNG形式で保存
image.save("text_image.png", format="PNG")
# JPEG形式で保存
image.save("text_image.jpg", format="JPEG")
PNGは透過をサポートしているため、透明な背景の画像を保存する際に便利です。
一方、JPEGは圧縮率が高く、ファイルサイズが小さくなりますが、透過をサポートしていません。
画像の解像度や品質の調整
画像の解像度や品質を調整することも可能です。
JPEG形式で保存する際には、品質を指定することができます。
以下のサンプルコードでは、JPEG形式で品質を指定して保存します。
# JPEG形式で品質を指定して保存
image.save("text_image_quality.jpg", format="JPEG", quality=85) # 1から100の範囲で指定
このコードを実行すると、品質85でJPEG形式の画像が保存されます。
品質を高く設定すると、画像の見た目は良くなりますが、ファイルサイズも大きくなります。
テキストを画像に変換する際の注意点
テキストを画像に変換する際には、以下の点に注意する必要があります。
- フォントの選択: 使用するフォントが適切であることを確認してください。
特に、カスタムフォントを使用する場合は、フォントファイルのパスが正しいことを確認します。
- テキストのサイズ: テキストが画像のサイズに収まるように、フォントサイズや画像サイズを調整する必要があります。
- 解像度: 画像の解像度が低すぎると、テキストがぼやけて見えることがあります。
適切な解像度を選択してください。
- 保存形式: 画像の用途に応じて、適切な保存形式を選択します。
透過が必要な場合はPNG、圧縮が必要な場合はJPEGを選ぶと良いでしょう。
これらの点に注意することで、より良い品質のテキスト画像を生成することができます。
まとめ
この記事では、PythonのPillowライブラリを使用してテキストを画像に挿入する方法や、画像にテキストを重ねる技術、さらにはテキストを画像として保存する際の注意点について詳しく解説しました。
これにより、画像処理の幅が広がり、さまざまな用途に応じた画像生成が可能になります。
ぜひ、実際にコードを試してみて、独自のテキスト画像を作成してみてください。