【第45回PYTHON講座】画像上に文字を書き込む

PYTHON

みなさん、こんにちは。
今回は画像上に文字を書き込む方法を紹介しようと思います。

使用するライブラリPIL(pillow)

画像ライブラリPIL(Python Imaging Library、通称pillow)を使用します。

インストールされていない方は、下記のコマンドを実施して、インストールをして下さい。

pip install pillow

プログラムの内容

  • 画像上に文字を複数行書き込み
  • 文字の色を変える
  • 画像を表示し、保存するかを選択する

プログラムコードの説明

from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw

xpos, ypos = 400, 100
ftype = "C:/Windows/Fonts/ariblk.ttf"
fsize = 20
tclr0 = "rgb(0,0,0)"
tclr1 = "rgb(255,0,255)"
inputfile = "C:/Labo/buffer/input.jpg"
outputfile = "C:/Labo/buffer/output.jpg"

img = Image.open(inputfile).convert('RGB')
draw = ImageDraw.Draw(img)
font = ImageFont.truetype(ftype, fsize)
draw.text((xpos, ypos), "Song #1", tclr0, font=font)
draw.text((xpos, ypos + fsize), "Song #2", tclr1, font=font)
draw.text((xpos, ypos + fsize*2), "Song #3", tclr0, font=font)

img.show()

inputdata = input("save image? y or n >> ")
if inputdata == "y":
    img.save(outputfile)
    print(outputfile+" was saved")
else:
    print("the image is not saved")

1~3行目 ライブラリのインポート
from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw

Imageは画像ファイルを開くため、ImageFontは書き込む文字のフォントの設定、ImageDrawは文字を書き込むために使用します。

5~11行目 各種設定
xpos, ypos = 400, 100
ftype = "C:/Windows/Fonts/ariblk.ttf"
fsize = 20
tclr0 = "rgb(0,0,0)"
tclr1 = "rgb(255,0,255)"
inputfile = "C:/Labo/buffer/input.jpg"
outputfile = "C:/Labo/buffer/output.jpg"

xpos、ypos は文字を書き込む座標になります。画像の左上が原点(0,0)になります。

ftypeはフォントの設定になります。太字やイタリックなどの変更するオプションが無いので、太字やイタリックにしたい場合は、そのフォントファイルを選択して下さい。

Windowsの場合、C:/Windows/Fonts/ にフォントファイルが入っているので、好きなフォントを選んでみましょう。必ずフルパスで入力してください。上記の場合は、arialの太字のフォントになります。

fsizeはフォントの大きさになります。

tclr0、tclr1は文字の色の設定になります。rgb(R, G, B)という数字になっています。各数字は0から255になります。

inputfile、outputfile は元画像と出力画像になります。こちらも必ずフルパスで入力してください。

13行目 ファイルを開く
img = Image.open(inputfile)

通常は上記のようにファイルを開きますが、もし下記のエラー(PIL raise OSError(f”cannot write mode {im.mode} as JPEG”))が発生する場合があります。

PIL raise OSError(f"cannot write mode {im.mode} as JPEG")

エラーが出る場合、最後に.convert(‘RGB’)と付けて下さい。

img = Image.open(inputfile).convert('RGB')
14行目 書き込みファイルを設定

文字を書き込みするファイルを設定します。

draw = ImageDraw.Draw(img)
15行目 フォントの設定

フォントタイプの設定と文字の大きさを設定します。

font = ImageFont.truetype(ftype, fsize)
16~18行目 文字を書き込み

draw.text(文字の座標、書き込む文字、色、フォント)という並びで、文字を書き込みます。

draw.text((xpos, ypos), "Song #1", tclr0, font=font)
draw.text((xpos, ypos + fsize), "Song #2", tclr1, font=font)
draw.text((xpos, ypos + fsize*2), "Song #3", tclr0, font=font)

今回は、フォントの高さはフォントの大きさに等しいので、高さ分をずらしています。但し、別のフォントだと高さに隙間が無い場合があるので、適宜、調整して下さい。

20行目 画像の表示

出来上がった画像を表示させます。この段階では、画像は保存されていません。

img.show()
22~27行目 画像を保存
inputdata = input("save image? y or n >> ")
if inputdata == "y":
    img.save(outputfile)
    print(outputfile+" was saved")
else:
    print("the image is not saved")

表示された画像を閉じると、コマンドラインに画像を保存するかの選択を問うようにしています。

y を入力すれば保存、n を入力すれば保存しないとなっていますが、実際は y の入力とそれ以外で判断しています。

まとめ

いかがだったでしょうか。

ワンパターンに文字だけを変更するような場合(例えば、講習などで使うタイトル画像など)は、画像は同じで、文言だけが異なるだけです。もちろん、画像編集プログラム(LibreDrawなど)で変更すればいいかもしれませんが、このようにプログラムで作ってみれば、正確なポジション位置に文字が配置でき、簡単に画像を作成することが出来ます。

いろいろと応用は出来ると思いますので、是非、試してくださいね。

役に立った!」と思れましたら、下のSNSボタンで記事のシェアをしていただけると嬉しいです!

コメント

タイトルとURLをコピーしました