テキストを折り返し画像に収まるように表示する
画像に長い文字列を表示する場合、そのままでは折り返されず画像からはみ出てしまいます。標準ライブラリのtextwrapモジュールを使うことで文字を折り返して表示できます。
環境
- windows10 home
- Anaconda 3/ jupyter notebook 5.6.0
- Python 3.7.0
- Pillow 5.2.0
折り返さない場合
コード
from PIL import Image, ImageDraw, ImageFont # 表示させる文章 text = 'ゆく河の流れは絶えずして、しかももとの水にあらず。淀みに浮かぶうたかたは、かつ消えかつ結びて、久しくとどまりたるためしなし。' font = ImageFont.truetype('C:\Windows\Fonts\meiryo.ttc', 36) # フォントの指定 im = Image.new('RGB', (640, 480), (0, 0, 0)) # 下地となるイメージオブジェクトの生成 draw = ImageDraw.Draw(im) # drawオブジェクトを生成 draw.multiline_text((35, 80),text, fill=(255,255,255), font=font) # 文字列を画像に描画 im.save('text.png', quality=95) # 画像をファイル名'text.png'で保存
実行結果
文字列が折り返されず画像からあふれてしまいます。
折り返す場合
コード
from PIL import Image, ImageDraw, ImageFont import textwrap # 表示させる文章 text = 'ゆく河の流れは絶えずして、しかももとの水にあらず。淀みに浮かぶうたかたは、かつ消えかつ結びて、久しくとどまりたるためしなし。' im = Image.new('RGB', (640, 480), (0, 0, 0)) # 下地となるイメージオブジェクトの生成 draw = ImageDraw.Draw(im) # drawオブジェクトを生成 wrap_list = textwrap.wrap(text, 16) # テキストを16文字で改行しリストwrap_listに代入 font = ImageFont.truetype('C:\Windows\Fonts\meiryo.ttc', 36) # フォントの指定 line_counter = 0 # 行数のカウンター for line in wrap_list: # wrap_listから1行づつ取り出しlineに代入 y = line_counter*70+80 # y座標をline_counterに応じて下げる draw.multiline_text((35, y),line, fill=(255,255,255), font=font) # 1行分の文字列を画像に描画 line_counter = line_counter +1 # 行数のカウンターに1 im.save('text_textwrap.png', quality=95) # 画像をファイル名'text_textwrap.png'で保存
実行結果
文字列が折り返され画像に収まって表示されます。
以下のサイトを参考にさせていただきました
note.nkmk.me>>Pythonで文字列を折り返し・切り詰めして整形するtextwrap