Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

テキストを折り返し画像に収まるように表示する

画像に長い文字列を表示する場合、そのままでは折り返されず画像からはみ出てしまいます。標準ライブラリの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'で保存
実行結果

文字列が折り返されず画像からあふれてしまいます。
f:id:T_A_T:20200210212854p:plain


折り返す場合

コード
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'で保存
実行結果

文字列が折り返され画像に収まって表示されます。
f:id:T_A_T:20200210213040p:plain

以下のサイトを参考にさせていただきました

note.nkmk.me>>Pythonで文字列を折り返し・切り詰めして整形するtextwrap

ブログランキングに参加しています

にほんブログ村 IT技術ブログへ
にほんブログ村