プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

Pythonで文字を画像にする

あるぞ、ITの可能性 | Python


上記はPythonで作った画像を動画に重ねてみたところです。

qiita.com

Pythonには本当に、何でもありますね。
上記参考サイトのサンプルに対して以下の機能を追加しました。
①コンソールから次々、文を指定できるように
②ファイル名は自動的にユニークに
③背景を半透明に
④文字列をセンタリングする

解説①

ほぼ説明は不要でしょう。

while True:
  print("Input text...")  
  text = input()
  # 中身の処理

解説②

こちらも、datetimeモジュールから日時時刻を取得しユニークな文字列を生成し、ファイル名にします。

import datetime
time = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
im.save("./img/"+time+".png")

解説③

半透明化は背景をRGBフォーマットからRGBAに変更し、色の4つ目が透過度です。
ここでは、およそ半分の120にしました。

# RGB, 画像サイズ, 背景色を設定
im = Image.new("RGBA", (2120, 140), (0, 0, 0, 120))  # (x,y),(R,G,B,A)

解説④

センタリングは一見、組込みでパラメータがあります。

  # 描画位置、描画する文字、文字色、フォントを指定
  # 改行は\n
  draw.multiline_text((0, 0), text, fill=(255, 255, 0), font=font, align='center')  # Yellow

しかし、こちらは、画像に対してセンタリングではなく、文字列に対してセンタリングになります。

試しに右寄せalign='right'にしてみると、以下のようになります。

センタリングするには、改行と適当な文字列(ここではアンダーバー)を設定し、アンダーバーが出力画像サイズになるようにします。

text = input()
text += "\n_______________________________"

改行後の文字は画像の外になります。

ソースコード

from PIL import Image, ImageDraw, ImageFont
import datetime
while True:
  print("Input text...")  
  text = input()
  if text == "":
      text = "無いぞ知名度SCSK"
  text += "\n_______________________________"
  # RGB, 画像サイズ, 背景色を設定
  im = Image.new("RGBA", (2120, 140), (0, 0, 0, 120))  # (x,y),(R,G,B,A)
  draw = ImageDraw.Draw(im)

  # PCローカルのフォントへのパスと、フォントサイズを指定
  fontsize = 100  # 140
  font = ImageFont.truetype('C:/Windows/Fonts/meiryob.ttc', fontsize)

  # 描画位置、描画する文字、文字色、フォントを指定
  # 改行は\n
  draw.multiline_text((0, 0), text, fill=(255, 255, 0),
                      font=font, align='center')  # Yellow

  # ファイルに出力
  time = datetime.datetime.now().strftime('%Y%m%d%H%M%S')
  im.save("./img/"+time+".png")