Python

Pythonで画像加工ができる!?写真に文字入れするには?

Pythonで画像加工ができる!?写真に文字入れするには?

YouTubeで公開している詰将棋動画のサムネイル。
パターンを決めているので、自動でもっと簡単にできないかなぁと調べていたら、「Pythonで画像加工ができる」と、知りました。

実際にやってみたら、思ったより早く自動化できたので、その方法をまとめます。
 

準備するものは?

画像編集ライブラリを使います。
「OpenCV」や「scikit-image」もありますが、今回は「Pillow」を選びました。
外部ライブラリなので、インストールが必要です。

pip install Pillow


 

コードの書き方は?

pyファイルと同じフォルダにある「test.jpg」に文字入れして、「test2.jpg」で保存するコードを書きました。

from PIL import Image, ImageFont, ImageDraw
 
# フォントは源ノ角ゴシック、大きさは30pxに指定
fnt = ImageFont.truetype(r'C:/Windows/Fonts/SourceHanSans-Heavy.otf', 30)
 
txt = input('入れたい文字は?')
 
# 画像ファイルを開く
photo_img = Image.open('test.jpg')
 
# 中央に文字を入れるため、画像のサイズを保管しておく
img_size = photo_img.size
 
# ImageDraw.Drawに画像データを指定することで文字入れや描画ができるようになる
draw_img = ImageDraw.Draw(photo_img)
 
# 文字入れ 画像の中央に黒い文字を入れる
draw_img.text(
    (img_size[0] / 2,img_size[1] / 2),
    txt,
    font = fnt,
    fill = 'black',
    anchor = 'mm'
)
 
# 保存する
photo_img.save('test2.jpg')

 

コードの解説

from PIL import Image

インストールは「Pillow」なのに対して、インポートは「PIL」と違うので注意が必要です。
PIL(Python Imaging Library)は2009年で更新が停止したものの、そこからフォークされて「Pillow」として使われているという歴史があったそうです。その名残ですね。
今回は文字入れをするにあたり、フォントを指定する「ImageFont」、画像に描画する「ImageDraw」もインポートします。

 

ImageFont.truetype()

文字入れする際の、フォントとサイズを指定します。
Windowsであれば「C:/Windows/Fonts」に入っているので、そこから選べば良いでしょう。
フォントは「TrueType(拡張子:ttf,ttc)」か「OpenType(拡張子:otf)」が使えます。

 

Image.open()

画像ファイルを開きます。
ファイルはパスで指定できるので、別フォルダにある画像も呼び出せます。

 

ImageDraw.Draw()

画像ファイルを指定することで、文字入れや図形を描画ができるようになります。

 

ImageDraw.text()

ImageDraw.Draw()で指定した画像に文字を描画します。
引数は5つ。

  • xy:左上を(0 , 0)とした座標を指定する。
  • text:入力したい文字を指定する。
  • fill:文字の色。RGBで細かい指定もできる。
  • font:フォントの種類とサイズ。ImageFont.truetype()で指定したものを入れる。
  • anchor:指定座標を基準にどう配置するのかを指定する。詳しくはドキュメントへ。

 

Image.save()

画像ファイルを保存します。
フルパスを書く事で、別フォルダに別名で保存することもできます。
同名のファイルがある場合は、確認なく上書きされるので注意が必要です。
 

コードの実行結果

素となる画像はphotoACさんからダウンロードしました。
Pythonで画像加工ができる!?写真に文字入れするには?

中央に文字が入っていますね。
写真によっては文字が見にくくなるので、ベースを描画した上に入れることを考えたいです。
 

まとめ

Pythonで画像に文字入れするには、ライブラリ「Pillow」をインポートし「Image.Draw()」で画像ファイルを指定し、「Image.text()」で書き込みます。
微調整があるので1枚なら手作業の方が速いものの、テンプレート化したものを複数枚作成するならやはりプログラムに軍配が上がりますね。

-Python
-, , , , , , , , , , , , , , , , ,