【Python/Pillow】画像に文字列を描画する(textメソッド)

PIllowでの画像への文字列の描画の仕方の解説ページアイキャッチ

このページにはプロモーションが含まれています

このページでは、Pillow (PIL) を用いた「画像への文字列の描画」について説明していきます。

このページで解説している内容を理解していただければ、画像に任意のサイズ・色の文字列を好きな位置に描画することができるようになります。

文字列を描画する例

文字列の描画の基本的な流れ

まずは画像への文字列の描画を行うための基本的な処理の流れについて説明していきます。

Image オブジェクトは Image クラスで生成

まず、画像への文字列の描画を行うためには Image クラスのオブジェクト(以降、Image オブジェクトと略します)を生成する必要があります。そして、その Image オブジェクトに対して文字列の描画を行なっていくことになります。

この Image オブジェクトに関しては、いつも通り Image クラスの open 関数や new 関数を利用して生成してやれば良いです。open 関数の場合は指定したパスの画像ファイルに基づいて Image オブジェクトを生成することになり、この場合は、読み込んだ画像に対して文字列を描画することが可能となります。

画像への文字列の描画を行う前にImageオブジェクトの生成が必要であることを示す図

Image クラスは PIL の Image モジュールで定義されていますので、事前に Image モジュールを import しておく必要があります。

スポンサーリンク

Draw クラスの text メソッドで文字列を描画

文字列の描画自体に関しては Draw クラスのオブジェクト(以降、Draw オブジェクトと略します)に text メソッドを実行させることで実現可能です。

Draw クラスは ImageDraw モジュールで定義されていますので、事前に ImageDraw モジュールを import しておく必要があります。

Draw オブジェクトは Image オブジェクトから生成可能で、特定の Image オブジェクトから生成した Draw オブジェクトにメソッドを実行させることで、その Image オブジェクトに対して図形等を描画することが可能となります。text メソッドを実行させた場合は、その Image オブジェクトに対して文字列が描画されることになります。

DrawrオブジェクトがImageオブジェクトに文字列を描画している様子

 そして、text メソッド実行後に Image オブジェクトに save メソッドを実行させれば、文字列描画後の画像がファイルとして保存されることになります。

文字列描画後のImageオブジェクトをファイルとして保存する様子

つまり、文字列を画像に描画する際の処理の基本的な流れは下記のようになります。

  1. 画像を読み込んで Image オブジェクトを生成
  2. Image オブジェクトから Draw オブジェクトを生成
  3. Draw オブジェクトに text メソッドを実行
    • 1. で生成した Image オブジェクトに文字列が描画される
  4. image オブジェクトから save メソッドを実行

画像への文字列の描画

流れを確認したところで、次は実際に画像への文字列の描画を行うスクリプトを作成していきましょう!

画像の準備

まずは事前準備として画像を用意しておきましょう!

今回は下図の画像に文字列を描画することを前提に解説していきたいと思いますので、まず適当な作業フォルダを作成し、そのフォルダに下図の画像を yokohama_fukei.jpg という名前のファイルで保存してください。

文字列の描画先の画像

別に上図の画像ではなく他の画像に対して以降で紹介するスクリプトを実行して文字列を描画するようにしても良いです。ただし、スクリプトは文字列描画先の画像のピクセル値の構成に合わせて変更する必要がある点に注意してください。ピクセル値の構成に関しては下記ページで詳しく解説していますので、必要に応じて下記ページを参照していただければと思います。

【Python/Pillow】画像のデータ構成とImageクラス

スポンサーリンク

必要なモジュールの import

ここからはいよいよプログラミングを行なっていきます。まず、先ほど yokohama_fukei.jpg を保存したフォルダに image_text.py というファイルを作成してください。

続いて image_text.py をエディターで開いて Python スクリプトを記述していきます。まずは必要なモジュールの import を行なっておきましょう。今回は PIL パッケージの Image モジュールと ImageDraw モジュールを利用していきますので、image_text.py の先頭に下記を追記してください。

モジュールのimport
from PIL import Image, ImageDraw

画像を読み込んで Image オブジェクトを生成

次は yokohama_fukei.jpg を読み込んで Image オブジェクトを作成します。

これは、image_text.py を下記のように変更することで実現できます。

Imageオブジェクトの生成
from PIL import Image, ImageDraw

# Imageオブジェクトの生成
image = Image.open('yokohama_fukei.jpg')

上記によって生成される image は単に yokohama_fukei.jpg をそのまま Image オブジェクトに変換したものになりますが、以降の処理によって image の画像に文字列が描画されることになります。

Image オブジェクトから Draw オブジェクトを生成

ということで、次は文字列の描画を行う準備をしていきます。

前述の通り、文字列の描画は Draw オブジェクトに text メソッドを実行させることで実現できます。そして、Draw オブジェクトは Image オブジェクトから生成可能で、特定の Image オブジェクトから生成した Draw オブジェクトにメソッドを実行させることで、その Image オブジェクトに対して図形等を描画することが可能となります。

つまり、先ほど生成した image から Draw オブジェクトを生成してやれば、そのオブジェクトからの text メソッドの実行によって image への文字列の描画、画像としては yokohama_fukei.jpg への文字列の描画が可能となります。

そして、image からの Draw オブジェクトの生成は、Draw クラスのコンストラクタの引数に image を指定して実行することで実現できます。Draw クラスは ImageDraw モジュールで定義されていますので、image_text.py を下記のように変更することで image から Draw オブジェクトを生成することができます。

Drawオブジェクトの生成
from PIL import Image, ImageDraw

# Imageオブジェクトの生成
image = Image.open('yokohama_fukei.jpg')

# Drawオブジェクトの生成
drawer = ImageDraw.Draw(image)

スポンサーリンク

Draw オブジェクトに text メソッドを実行

次は、本題となる画像への文字列の描画を行なっていきます。現状のスクリプトでは yokohama_fukei.jpg というファイルから画像を読み込んで Image オブジェクトを生成し、さらに、その Image オブジェクトから Draw オブジェクトの生成を行なっています。前述の通り、この Draw オブジェクトに text メソッドを実行させることで、読み込んだ画像に文字列を描画することができます。

textメソッドで文字列を画像に埋め込む様子

この text メソッド実行時に指定が必須となる引数は下記の2つとなります。

  • xy (第1引数):文字列の描画位置を (x, y) の座標形式で指定する
  • text (第2引数):描画する文字列を文字列形式で指定する

特に文字列の描画位置についての詳細は後述の anchor:文字列の基準位置を設定する の節で説明しますが、anchor を指定しなかった場合は xy 引数に指定した “画像上の座標” に文字列の左上の位置が配置されるように文字列が描画されることになります。例えば xy 引数に (0, 0) を指定すれば、描画される文字列の左上の位置が画像上の座標 (0, 0)、すなわち画像の左上端に配置されることになります。

文字列の描画位置に関する説明図

例えば画像の左上に Hello World! という文字列を描画したいのであれば、image_text.py を下記のように変更してやれば良いことになります。

文字列の描画
from PIL import Image, ImageDraw

# Imageオブジェクトの生成
image = Image.open('yokohama_fukei.jpg')

# Drawオブジェクトの生成
drawer = ImageDraw.Draw(image)

# 文字列の描画(textメソッドを実行)
drawer.text(xy=(0, 0), text='Hello World!')

上記を実行すれば Image オブジェクトに対して Hello,World! の描画が行われることになります。

image オブジェクトから save メソッドを実行

ただし、文字列の描画が行われるのは Image オブジェクトに対してなので、描画後の画像を確認するためには一度 Image オブジェクトを画像ファイルとして保存して画像のビューワーソフトで確認したり Image オブジェクトから show メソッドを実行させて画像の表示を行う必要があります。

今回は前者のファイル保存を行いたいと思います。Image オブジェクトを画像ファイルとして保存するためには Image オブジェクトから save メソッドを実行させてやれば良いため、下記のように image_text.py を変更してやれば良いです。これにより、yokohama_fukei.jpg の左上に Hello World! という文字列が描画された結果が text_yokohama_fukei.png というファイルで保存されることになります。

文字列描画後の画像のファイル保存
from PIL import Image, ImageDraw

# Imageオブジェクトの生成
image = Image.open('yokohama_fukei.jpg')

# Drawオブジェクトの生成
drawer = ImageDraw.Draw(image)

# 文字列の描画(textメソッドを実行)
drawer.text(xy=(0, 0), text='Hello World!')

# 文字列描画後の画像のファイル保存
image.save('text_yokohama_fukei.png')

これで画像に文字列を描画するスクリプトが完成したことになります。yokohama_fukei.jpgimage_text.py を設置したフォルダで下記を実行すれば、text_yokohama_fukei.png というファイルが生成されることが確認できると思います。

python image_text.py

text_yokohama_fukei.png を画像のビューワーソフトで開けば下の図のような画像が表示されます。

Hello World!を描画した画像

文字列が小さいので分かりにくいかもしれませんが、画像の左上部分を拡大してみれば Hello World! という文字列が描画されていることが確認できると思います。

Hello World!を描画した画像の拡大図

ここまで説明してきたように、下記の手順を踏めば画像に文字列の描画を行うことが可能です。

  1. 画像を読み込んで Image オブジェクトを生成
  2. Image オブジェクトから Draw オブジェクトを生成
  3. Draw オブジェクトに text メソッドを実行
  4. image オブジェクトから save メソッドを実行

ただ、最低限の引数のみを指定して text メソッドを実行した場合には「文字が小さすぎる」「文字の色が白だと困る」といった不満を持つ方もおられるのではないかと思います。これらは text メソッドへの引数の指定によって変更可能です。ここからは、こういった文字列の描画の詳細を設定するための text メソッドの引数について説明していきたいと思います。

text メソッドの引数

では、次は文字列の描画の詳細を設定できるよう、text メソッドの引数について説明していきます。

ここからは、各種 text メソッドの引数の概要と、各種 text メソッドの引数を指定するスクリプトの例、および、そのスクリプトの実行によって得られる文字列描画結果の例を示していきたいと思います。全ての引数の説明を行いところではありますが、私も全ての引数を把握しているわけではないため、私が使いこなしている引数のみの説明とさせていただきます。

MEMO

ここから示すスクリプトにおいては、基本的にグレー背景の画像に対して text メソッドを実行する例を示していきます

また、先ほどとは異なり、画像は保存せずに show メソッドによって画像の表示のみを行う例を示していきますので、この点はご注意ください

ファイルとして保存したければ、前述のように save メソッドでファイルの保存を行なえば良いです

スポンサーリンク

text:描画する文字列を設定する

まず、文字列を描画する上で一番重要になるのが text 引数になると思います。前述の通り、text 引数の指定により描画する文字列を設定することができます。text 引数には描画したい文字列を指定します。text メソッド実行時には、この引数の指定は必須となります。

指定した文字列に改行 '\n' が存在する場合、描画される文字列も改行部分で改行されることになります。

text引数の指定
from PIL import Image, ImageDraw

# Imageオブジェクトの生成
image = Image.new('RGB', (128, 96), (128, 128, 128))

# Drawオブジェクトの生成
drawer = ImageDraw.Draw(image)

# 文字列の描画(textメソッドを実行)
drawer.text(xy=(0, 0), text='Hello\nWorld!')

# 文字列描画後の画像を表示
image.show()

上記のように text 引数を指定した場合の文字列描画結果は下図のようなものになります。描画する文字列に改行が含間れていることが確認できると思います 。

改行コードを含む文字列の描画

font:文字のフォントを設定する

また、text メソッドでは font 引数を指定することで描画する文字列のフォントや文字のサイズを変更することが可能です。こちらに関しては別途解説ページを設けて説明していますので、詳細に関しては下記ページを参照していただければと思います。

Pillowのtextメソッドで描画する文字列のフォントやサイズの変更方法の解説ページアイキャッチ 【Pillow/Python】textメソッドで描画する文字のフォントやサイズを変更する

font 引数を指定することで、下の図のようにフォントや文字のサイズを自由自在に変更することができるようになります。

font引数で文字列のフォントを変更した様子

font_size:文字のサイズを設定する

先ほど紹介した font 引数を指定することでフォントやスタイル(太字や斜体)、文字のサイズなど、描画する文字列の見た目を細かに変更することができます。ですが、変更したいのが文字のサイズだけなのであれば、font_size 引数を代わりに利用することもできます。

MEMO

font_size 引数は Pillow のバージョン 10.1.0 から追加された引数となります

古いバージョンを利用している方は使用できない可能性がありますので注意してください

font_size 引数を指定することで、描画する文字列の文字のサイズを変更することが可能です。font_size 引数には文字のサイズを整数で指定します。デフォルト値は 10 なので、デフォルトよりも文字の大きさを大きくしたいのであれば、10 よりも大きな値を指定してやれば良いです。

例えば、下記のように font_size 引数を指定してやれば、デフォルトよりも大きな文字のサイズで文字列を描画することができます。

text引数の指定
from PIL import Image, ImageDraw

# Imageオブジェクトの生成
image = Image.new('RGB', (128, 96), (128, 128, 128))

# Drawオブジェクトの生成
drawer = ImageDraw.Draw(image)

# 文字列の描画(textメソッドを実行)
drawer.text(xy=(0, 0), text='Hello\nWorld!', font_size=40)

# 文字列描画後の画像を表示
image.show()

上記スクリプトを実行して表示される画像は下の図のようなものになります。text:描画する文字列を設定する で示した描画結果に比べて文字のサイズが大きくなっていることが確認できると思います。

font_size=40を指定した文字列描画結果

スポンサーリンク

fill:文字の色を設定する

また、text メソッド実行時に fill 引数を指定することで描画する文字列の色を変更することができます。fill 引数には色名ピクセル値カラーコード等を指定可能です。ピクセル値については下記ページでも説明していますので、詳細については下記ページをご参照ください。

【Python/Pillow】画像のデータ構成とImageクラス

ピクセル値で色を指定する

基本的には、描画先の画像、つまり Draw オブジェクトの基になる Image オブジェクトの mode に合わせたピクセル値を指定する必要があります。ただ、厳密にエラーチェックは行われていないようで、例えば mode'RGB'Image オブジェクトに対して (255, 0, 0, 128) のような透明度を含む4つの要素を持つタプルを指定してもエラーにはならずに単純に4つ目の要素が無視されるだけになっているようです。ですが、やはり基本的には Image オブジェクトの mode に合わせたピクセル値を指定してやった方が良いと思います。

例えば下記のように text メソッドに fill 引数を指定してやれば、(255, 255, 0) が黄色を示すピクセル値であるため、黄色の文字列を描画することができます。

fill引数の指定
from PIL import Image, ImageDraw

# Imageオブジェクトの生成
image = Image.new('RGB', (128, 96), (128, 128, 128))

# Drawオブジェクトの生成
drawer = ImageDraw.Draw(image)

# 文字列の描画(textメソッドを実行)
drawer.text(xy=(0, 0), text='Hello\nWorld!', font_size=40, fill=(255, 255, 0))

# 文字列描画後の画像を表示
image.show()

スクリプトを実行して表示される画像は下図のようなものになります。文字の色が黄色に変化していることが確認できると思います。

fill引数をして描画された文字列

色名で色を指定する

前述の通り、fill 引数にはピクセル値だけでなく色名を指定することも可能です。指定可能な色名は、Pillow 10.2.0 の場合は 148 種類あるようです。

fill 引数で指定可能な色名(Pillow で利用可能な色名)の調べ方については下記ページで解説していますので、fill 引数で指定可能な色名を具体的に知りたい方は下記ページも参照しただけると幸いです。

【Pillow/Python】Pillowで利用可能な色名の調べ方

例えば、先ほど示したスクリプトにおいて、fill=(255, 255, 0) の部分を fill='yellow' に置き換えた場合も同じ文字列描画結果を得ることができます。

カラーコードで色を指定する

また、fill 引数にはカラーコードを指定することもできます。カラーコードは下図のような形式の文字列になり、# の後ろ側の各2桁の16進数の数値で赤・緑・青それぞれの色の強みを指定します。

カラーコードの説明図

ピクセル値 (255, 255, 0) は赤の強みが 255 (16 進数で ff)、緑の強みも 255 (16 進数で ff)、緑の強みは 0 (16 進数で 00) であるため、カラーコードで表現した場合は '#ffff00' となります。したがって、先ほど示したスクリプトにおいて、fill=(255, 255, 0) の部分を fill='#ffff00' に置き換えた場合も同じ文字列描画結果を得ることができることになります。

このように、fill 引数には様々な形式で色を指定することが可能です。特にピクセル値や色名の指定に関しては覚えておくと良いと思います。

例えば下記のスクリプトは、fill 引数に様々な形式でいろんな色の文字列を描画する例になります。

fill引数の指定
from PIL import Image, ImageDraw

# Imageオブジェクトの生成
image = Image.new('RGB', (400, 200), (128, 128, 128))

# Drawオブジェクトの生成
drawer = ImageDraw.Draw(image)

# fill引数にピクセル値を指定
drawer.text(xy=(0, 0), text='Hello', font_size=40, fill=(100, 50, 200))

# fill引数に色名を指定
drawer.text(xy=(200, 0), text='Hello', font_size=40, fill='gold')

# fill引数にカラーコードを指定
drawer.text(xy=(0, 100), text='Hello', font_size=40, fill='#B3240F')

# fill引数にHSV色空間の値を指定
drawer.text(xy=(200, 100), text='Hello', font_size=40, fill='HSV(300, 50%, 100%)')

# 文字列描画後の画像を表示
image.show()

上記スクリプトを実行して表示される画像は下図のようなものになり、様々な色のテキストが描画できていること、さらに様々な形式での色の指定ができていることが確認できると思います。

fillに様々な値を指定した文字列描画結果

xy:文字列を描画する座標を設定する

前述の通り、文字列を描画する位置を指定するのが xy 引数となります。text メソッド実行時には、この引数の指定は必須となります。

画像への文字列の描画 では xy 引数は 描画する文字列の “左上” を配置する画像内の座標を指定すると説明しました。これにより、画像の xy 引数で指定した座標に、文字列の左上の位置が配置されるように文字列の描画が行われるのでしたね!

文字列の描画位置に関する説明図

画像への文字列の描画 では大雑把に基本的な事柄を説明したかったので前述のような説明をしましたが、正確に言えば xy 引数では文字列の “左上” を配置する座標を指定するのではなく、文字列における anchor 引数で設定した基準位置” を配置する座標を指定することになります。例えば、anchor で “文字列の基準位置は中央” と設定した場合、xy 引数で指定した画像内の座標に文字列の中央が配置する形で文字列の描画が行われることになります。

ということで、xy 引数は anchor 引数と関連性が高いため、次の anchor 引数と一緒に詳細な説明を行います。

anchor:文字列の基準位置を設定する

先ほど説明した通り、anchor は文字列の基準位置を設定するための引数になります。

anchor 引数では横方向の基準位置縦方向の基準位置をそれぞれ文字で指定します。つまり、anchor には2文字の文字列を指定して文字列の基準位置を設定します。

指定可能な文字は下図のようになります。この画像は Pillow の公式ページanchor の説明時に用いられている図になります。anchor 引数には基準位置を示すアルファベット(下の図におけるカッコ内の文字)を横方向および縦方向の2文字で指定します。例えば、横方向の基準位置を left、縦方向の基準位置を bottom にしたいのであれば 'lb' を指定します。anchor 引数が指定されなかった時のデフォルト値は 'la' となります。

anchor引数に指定可能な文字

引用元:Pillow

そして、前述のように text メソッドが実行される際には xy 引数で指定した座標に anchor 引数が配置されるように文字列が描画されることになります。

ですので、同じ座標を xy 引数に指定した場合でも anchor 引数の指定によって文字列の描画位置が異なることになります。例えば、画像の左上端に文字列を描画しようと思って画像の左上の座標 (0, 0) を xy 引数に指定したとしても、'lt' を指定した場合と 'la' を指定した場合とでは下の図のように文字列描画位置が異なります。'la' を指定した場合の方が上側の余白が大きいことが確認できると思います。

anchor='lt'とanchor='la'とを指定した場合の文字列描画位置の違い

同様に、画像の右下端の座標 (0, 0) を xy 引数に指定した場合も、anchor 引数の指定によって文字列の描画位置が異なることになります。特に 'rb' を指定した場合と 'rd' を指定した場合とでは文字列の下側の余白のサイズが大きく異なることが確認できると思います。

anchor='tb'とanchor='ts'とanchor='td'とを指定した場合の文字列描画位置の違い

また、上の図の場合、'rb' を指定した場合と 'rs' を指定した場合とで違いが分かりにくいですが、描画する文字列のフォントを変えると、下の図のように rb' を指定した場合と 'rs' を指定した場合とでも大きな違いが現れるようになります。

フォントによってanchorによって生じる文字列描画位置の違いが大きくなることを示す図

このように、同じ座標を xy 引数に指定した場合でも anchor 引数の指定によって文字列の描画位置が異なることになります。基本的には文字列の描画位置は xy 引数で指定することになりますが、文字列の描画位置を微調整したい場合は xy 引数だけではなく anchor 引数の指定も利用すると良いと思います。

例えば下記のスクリプトのように xy 引数や anchor 引数を指定することで文字列を画像の左上、中央、右下に描画することができます。

xy引数とanchor引数の指定
from PIL import Image, ImageDraw

# Imageオブジェクトの生成
image = Image.new('RGB', (400, 200), (128, 128, 128))

# Drawオブジェクトの生成
drawer = ImageDraw.Draw(image)

# 文字列を左上に描画(textメソッドを実行)
drawer.text(xy=(0, 0), text='Hello', anchor='lt', font_size=40)

# 文字列を中央に描画(textメソッドを実行)
drawer.text(xy=(200, 100), text='Hello', anchor='mm', font_size=40)

# 文字列を右下に描画(textメソッドを実行)
drawer.text(xy=(400, 200), text='Hello', anchor='rb', font_size=40)

# 文字列描画後の画像を表示
image.show()

上記スクリプトを実行することで表示される画像は下の図のようなものになります。

xy引数やanchor引数に様々な値を指定した文字列描画結果

スポンサーリンク

align:文字列の寄せ方向を設定する

align 引数によって文字列の寄せ方向を設定することも可能です。

align 引数には下記の3種類の文字列が指定可能です。

  • 'left':左寄せ
  • 'right':右寄せ
  • 'center':中央寄せ

例えば下記のように text メソッドに align 引数を指定してやれば “複数行の文字列” が中央寄せされた状態で描画されることになります。

スクリプトを実行して表示される画像は下図のようなものになります。今まで示してきた結果の例では全て文字列が左寄せされていましたが、今回の結果では複数行の文字列が中央に寄せされていることが確認できると思います。

align='center'指定時の描画結果

予想した結果と違う!と思われた方もおられるかもしれません。この align 引数は、あくまでも文字列を描画する領域に対して寄せを行う引数であり、画像の全体に対しての寄せを行う引数ではありません。したがって、align 引数を指定したからといって例えば画像の中央に文字列が寄せられるわけではないので注意してください。

align引数の説明図

画像内の文字列描画位置を指定するのはあくまでも xy 引数(+ anchor 引数)になります。そして、文字列描画領域内での文字列の寄せを指定するのが、この align 引数となります。

また、この align 引数は複数の行の文字列の位置を特定の方向に寄せるための引数となりますので、text 引数に改行が存在しない文字列、つまり1行しか存在しない文字列を指定している場合は効果がないので注意してください。

spacing:行間のスペースのサイズを設定する

続いて spacing 引数について説明していきます。spacing は行間のスペースのサイズを設定する引数となります。spacing には実数を指定し、デフォルト値は 4 となります。

行間のスペースのサイズを指定するのですから、text 引数に改行が存在しない文字列、つまり1行しか存在しない文字列を指定した場合は spacing 引数を指定しても意味がないので注意してください。

例えば下記のスクリプトを実行すれば spacing 引数によって行間のスペースが変化することを確認することができます。

spacing引数の指定
from PIL import Image, ImageDraw

# Imageオブジェクトの生成
image = Image.new('RGB', (400, 200), (128, 128, 128))

# Drawオブジェクトの生成
drawer = ImageDraw.Draw(image)

# spacingを指定しない場合
drawer.text(xy=(0, 0), text='Hello\nWorld', font_size=40)

# spacing=100を指定した場合
drawer.text(xy=(200, 0), text='Hello\nWorld', font_size=40, spacing=100)

# 文字列描画後の画像を表示
image.show()

上記スクリプトを実行することで表示される画像は下の図のようなものになります。

spacing引数を指定した文字列描画結果

stroke_width:文字の輪郭線の幅を設定する

続いて描画する文字の輪郭線関連の設定を行う引数について紹介していきます。

最初に紹介するのが stroke_width 引数になります。この stroke_width は描画する文字の輪郭線の幅(太さ)を設定するための引数になります。デフォルト値は 0 であり、つまりは文字の輪郭線が存在しないことになります。

例えば下記のスクリプトでは stroke_width 引数の指定を「なし」「2」「10」と変化させて文字列の描画を行なっています。

stroke_width引数の指定
from PIL import Image, ImageDraw

# Imageオブジェクトの生成
image = Image.new('RGB', (400, 200), (128, 128, 128))

# Drawオブジェクトの生成
drawer = ImageDraw.Draw(image)

# strokeを指定しない場合
drawer.text(xy=(0, 0), text='STROKE', font_size=50)

# stroke=2を指定した場合
drawer.text(xy=(0, 70), text='STROKE', font_size=50, stroke_width=2)

# stroke=10を指定した場合
drawer.text(xy=(0, 140), text='STROKE', font_size=50, stroke_width=10)

# 文字列描画後の画像を表示
image.show()

実行して表示される画像は下の図のようなものになります。一番上の stroke_width 引数を指定しなかった場合に比べて、他の文字列の文字が太くなっていることが確認できると思います。これは、stroke_width 引数の指定を行うことで輪郭線の幅が広くなったからになります。また、一番下の文字列に関しては輪郭線の幅が広くなりすぎて文字が読みにくくなっています。このようなことにならないように、輪郭線の幅の設定は文字のフォントサイズを考慮してバランスよく設定してやるのが良いと思います。

stroke_width引数を指定した場合の描画結果

スポンサーリンク

stroke_fill:文字の輪郭線の色を設定する

また、輪郭線の色を設定することも可能で、それを設定するための引数が stroke_fill になります。デフォルト値は fill 引数で指定した色、つまり輪郭線以外の色と同じ色になります。

例えば下記のスクリプトでは stroke_fill 引数の指定を 'red',・'red''blue' と変化させて文字列の描画を行なっています。

stroke_fill引数の指定
from PIL import Image, ImageDraw

# Imageオブジェクトの生成
image = Image.new('RGB', (400, 200), (128, 128, 128))

# Drawオブジェクトの生成
drawer = ImageDraw.Draw(image)

# stroke_fill='red'を指定した場合(stroke_widthは指定なし)
drawer.text(xy=(0, 0), text='STROKE', font_size=50, stroke_fill='red')

# stroke_fill='red'を指定した場合
drawer.text(xy=(0, 70), text='STROKE', font_size=50, stroke_width=2, stroke_fill='red')

# stroke_fill='blue'を指定した場合
drawer.text(xy=(0, 140), text='STROKE', font_size=50, stroke_width=10, stroke_fill='blue')

# 文字列描画後の画像を表示
image.show()

実行して表示される画像は下の図のようなものになります。一番上の文字列描画時にも中央の文字列描画時同様に stroke_fill='red' を指定しているのですが stroke_width 引数を指定しておらず輪郭線が存在しないため、stroke_fill='red' の指定が意味のないものになっていることが確認できます。逆に、輪郭線が存在する文字に対しては stroke_fill の指定した色の輪郭線が描画されていることを確認できると思います。

stroke_fill引数を指定した場合の描画結果

まとめ

このページでは Pillow (PIL) を用いた「画像への文字列の描画」について説明しました!

Pillow では ImageDraw モジュールの text メソッドを利用することで画像に文字列を描画することができます。text メソッドでは様々な引数を指定することが可能で、これにより描画する文字列のフォント・サイズ・色・描画位置等を自由自在に設定することができます。

画像にちょっとした文字列を描画したい機会も多いと思いますので、画像への文字列の描画手順や描画する文字列に対する設定方法に関しては是非覚えておいてください!

また、フォントの指定方法や色名に関しては別のページを用意して詳細を解説していますので、是非これらのページも読んでみていただければと思います!

Pillowのtextメソッドで描画する文字列のフォントやサイズの変更方法の解説ページアイキャッチ 【Pillow/Python】textメソッドで描画する文字のフォントやサイズを変更する 【Pillow/Python】Pillowで利用可能な色名の調べ方

同じカテゴリのページ一覧を表示