Python で、画像に文字を描いて画像データとして出力する方法についてまとめておきます。タイトル画像の作成です。
以下の環境で動作確認をしています。
環境: Windows、Python 3.x (+ Anaconda 3)
背景
Python で、画像を結合して動画ファイルなど(gif、mp4)を作成していると、画像に文字を書き込んで、タイトル画像を作成したくなることがあります。
また、文字を入れた複数の画像を生成して、画像をパラパラ漫画のように使いたくなることがあります。
そこで、ベーシックな事例として、画像に文字を書き込んで、png データ等の画像フォーマットで出力するサンプルコードについてまとめておきます。
設定
① PC に任意のフォルダを作成してください。
例: c:\user
② ①のフォルダの中に “title_character1.py” 等の名前でテキストファイルを作成し、以下のサンプルコードを貼りつけて保存してください。
使い方
③ コンソール(または、開発環境)を起動し、②のスクリプトを実行してください。
例: “python (パス)title_character1.py”
→ ①のフォルダ内に画像 img1.png が出力されます。文字が入力できているかを確認してください。
④ うまく動いたら、②のスクリプトの文字列を変えて、画像を出力してみてください。
文字列を、ヘッダー、本文、フッターの3か所で設定できるようにしています。
それぞれ、文字列を差し替えると、それぞれの位置に文字が表示されます。
※ スクリプトの末尾で、出力する画像フォーマットは png としていますが、jpeg 画像等にしたい場合は、jpg 等に修正してください。
※ 画像の背景色は、’#fff0f0′ などとしているところで設定しています。’#’ 以降の6文字が2桁ずつ、それぞれ R、G、B に対応しています。この設定を変更することで背景色の設定が可能です。
※ また、透明画像を生成したい場合は、スクリプトでコメントアウトしている “# im1.putdata( 10 ) ” などの “# ” を削除して、再度画像を出力させてみてください。im1.putdata( ) を2か所入れてあります。
文字の背景部分のみを透明にする場合は前者の”# ” 部分を、文字部分も含めて透明にする場合は、後者の “# ” 部分を削除し、画像を再度生成してください。
※ フォントは、Windows のフォントを呼び出して使用しています。OS が異なる場合は、OS や環境に応じてフォントのありかと呼び出し方を確認してください。
まとめ
画像に文字を書き込んで出力する方法についてまとめました。
これで、文字列を入れた画像を自由に作成できるようになりました。
動画タイトルに使う、パラパラ漫画のように使う、ウェブページに挿入するなど、どのようにでも応用できます。
関連リンク
・ 動画作成ソフトウェア【Python & mp4, gif】
・ ドーナツグラフを HTML で表示する 【Python】
・ クリップボードの画像・テキストを自動保存するソフトウェア 【Python】
サンプルコード
from PIL import Image, ImageDraw, ImageFont
import textwrap as tw1
import os
def draw_text0( draw1, x0, y0, font0, str0 ):
draw1.text( (x0, y0), str0, font=font0, fill='black' )
def draw_text1( draw1, x0, y0, y0_offset, n0_wrap, font1, str0 ):
a1 = tw1.wrap( str0, n0_wrap )
i1_max = len( a1 )
i1_offset = (i1_max-1)/2
for i1 in range( i1_max ):
x1 = x0
y1 = y0_offset * (i1-i1_offset) + y0
str1 = a1[i1]
draw1.text( (x1, y1), str1, font=font1, fill='black', anchor='mm' )
font1_header = ImageFont.truetype( 'C:/Windows/Fonts/UDDigiKyokashoN-R.ttc', 50 )
font1_main = ImageFont.truetype( 'C:/Windows/Fonts/UDDigiKyokashoN-R.ttc', 70 )
font1_footer = ImageFont.truetype( 'C:/Windows/Fonts/UDDigiKyokashoN-R.ttc', 50 )
str1_header = "★ ☆"
str1_main = "画像に文字を書いて出力する"
str1_footer = "☆ ★"
im1 = Image.new('RGB', (800, 480), '#fff0f0')
# im1 = Image.new('RGB', (800, 480), '#f0fff0')
# im1 = Image.new('RGB', (800, 480), '#f0f0ff')
# im1.putalpha( 10 ) # 0-255
draw1 = ImageDraw.Draw( im1 )
draw_text0( draw1, 30, 20, font1_header, str1_header )
draw_text1( draw1, 400, 250, 120, 9, font1_main, str1_main )
draw_text0( draw1, 20, 420, font1_footer, str1_footer )
# im1.putalpha( 100 ) # 0-255
path1 = os.path.dirname(__file__) + "/"
file1 = path1 + "img1.png"
im1.save( file1 )