このページでは、Pillow (PIL) を用いた「画像への文字列の描画」について説明していきます。
このページで解説している内容を理解していただければ、画像に任意のサイズ・色の文字列を好きな位置に描画することができるようになります。
文字列の描画の基本的な流れ
まずは画像への文字列の描画を行うための基本的な処理の流れについて説明していきます。
Image
オブジェクトは Image
クラスで生成
まず、画像への文字列の描画を行うためには Image
クラスのオブジェクト(以降、Image
オブジェクトと略します)を生成する必要があります。そして、その Image
オブジェクトに対して文字列の描画を行なっていくことになります。
この Image
オブジェクトに関しては、いつも通り Image
クラスの open
関数や new
関数を利用して生成してやれば良いです。open
関数の場合は指定したパスの画像ファイルに基づいて Image
オブジェクトを生成することになり、この場合は、読み込んだ画像に対して文字列を描画することが可能となります。
Image
クラスは PIL の Image
モジュールで定義されていますので、事前に Image
モジュールを import
しておく必要があります。
スポンサーリンク
Draw
クラスの text
メソッドで文字列を描画
文字列の描画自体に関しては Draw
クラスのオブジェクト(以降、Draw
オブジェクトと略します)に text
メソッドを実行させることで実現可能です。
Draw
クラスは ImageDraw
モジュールで定義されていますので、事前に ImageDraw
モジュールを import
しておく必要があります。
Draw
オブジェクトは Image
オブジェクトから生成可能で、特定の Image
オブジェクトから生成した Draw
オブジェクトにメソッドを実行させることで、その Image
オブジェクトに対して図形等を描画することが可能となります。text
メソッドを実行させた場合は、その Image
オブジェクトに対して文字列が描画されることになります。
そして、text
メソッド実行後に Image
オブジェクトに save
メソッドを実行させれば、文字列描画後の画像がファイルとして保存されることになります。
つまり、文字列を画像に描画する際の処理の基本的な流れは下記のようになります。
- 画像を読み込んで
Image
オブジェクトを生成 Image
オブジェクトからDraw
オブジェクトを生成Draw
オブジェクトにtext
メソッドを実行- 1. で生成した
Image
オブジェクトに文字列が描画される
- 1. で生成した
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
の先頭に下記を追記してください。
from PIL import Image, ImageDraw
画像を読み込んで Image
オブジェクトを生成
次は yokohama_fukei.jpg
を読み込んで Image
オブジェクトを作成します。
これは、image_text.py
を下記のように変更することで実現できます。
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
オブジェクトを生成することができます。
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
メソッド実行時に指定が必須となる引数は下記の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.jpg
と image_text.py
を設置したフォルダで下記を実行すれば、text_yokohama_fukei.png
というファイルが生成されることが確認できると思います。
python image_text.py
text_yokohama_fukei.png
を画像のビューワーソフトで開けば下の図のような画像が表示されます。
文字列が小さいので分かりにくいかもしれませんが、画像の左上部分を拡大してみれば Hello World!
という文字列が描画されていることが確認できると思います。
ここまで説明してきたように、下記の手順を踏めば画像に文字列の描画を行うことが可能です。
- 画像を読み込んで
Image
オブジェクトを生成 Image
オブジェクトからDraw
オブジェクトを生成Draw
オブジェクトにtext
メソッドを実行image
オブジェクトからsave
メソッドを実行
ただ、最低限の引数のみを指定して text
メソッドを実行した場合には「文字が小さすぎる」「文字の色が白だと困る」といった不満を持つ方もおられるのではないかと思います。これらは text
メソッドへの引数の指定によって変更可能です。ここからは、こういった文字列の描画の詳細を設定するための text
メソッドの引数について説明していきたいと思います。
text
メソッドの引数
では、次は文字列の描画の詳細を設定できるよう、text
メソッドの引数について説明していきます。
ここからは、各種 text
メソッドの引数の概要と、各種 text
メソッドの引数を指定するスクリプトの例、および、そのスクリプトの実行によって得られる文字列描画結果の例を示していきたいと思います。全ての引数の説明を行いところではありますが、私も全ての引数を把握しているわけではないため、私が使いこなしている引数のみの説明とさせていただきます。
ここから示すスクリプトにおいては、基本的にグレー背景の画像に対して text
メソッドを実行する例を示していきます
また、先ほどとは異なり、画像は保存せずに show
メソッドによって画像の表示のみを行う例を示していきますので、この点はご注意ください
ファイルとして保存したければ、前述のように save
メソッドでファイルの保存を行なえば良いです
スポンサーリンク
text
:描画する文字列を設定する
まず、文字列を描画する上で一番重要になるのが text
引数になると思います。前述の通り、text
引数の指定により描画する文字列を設定することができます。text
引数には描画したい文字列を指定します。text
メソッド実行時には、この引数の指定は必須となります。
指定した文字列に改行 '\n'
が存在する場合、描画される文字列も改行部分で改行されることになります。
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
引数を指定することで描画する文字列のフォントや文字のサイズを変更することが可能です。こちらに関しては別途解説ページを設けて説明していますので、詳細に関しては下記ページを参照していただければと思います。
font
引数を指定することで、下の図のようにフォントや文字のサイズを自由自在に変更することができるようになります。
font_size
:文字のサイズを設定する
先ほど紹介した font
引数を指定することでフォントやスタイル(太字や斜体)、文字のサイズなど、描画する文字列の見た目を細かに変更することができます。ですが、変更したいのが文字のサイズだけなのであれば、font_size
引数を代わりに利用することもできます。
font_size
引数は Pillow のバージョン 10.1.0 から追加された引数となります
古いバージョンを利用している方は使用できない可能性がありますので注意してください
font_size
引数を指定することで、描画する文字列の文字のサイズを変更することが可能です。font_size
引数には文字のサイズを整数で指定します。デフォルト値は 10
なので、デフォルトよりも文字の大きさを大きくしたいのであれば、10
よりも大きな値を指定してやれば良いです。
例えば、下記のように font_size
引数を指定してやれば、デフォルトよりも大きな文字のサイズで文字列を描画することができます。
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:描画する文字列を設定する で示した描画結果に比べて文字のサイズが大きくなっていることが確認できると思います。
スポンサーリンク
fill
:文字の色を設定する
また、text
メソッド実行時に fill
引数を指定することで描画する文字列の色を変更することができます。fill
引数には色名やピクセル値、カラーコード等を指定可能です。ピクセル値については下記ページでも説明していますので、詳細については下記ページをご参照ください。
ピクセル値で色を指定する
基本的には、描画先の画像、つまり Draw
オブジェクトの基になる Image
オブジェクトの mode
に合わせたピクセル値を指定する必要があります。ただ、厳密にエラーチェックは行われていないようで、例えば mode
が 'RGB'
の Image
オブジェクトに対して (255, 0, 0, 128)
のような透明度を含む4つの要素を持つタプルを指定してもエラーにはならずに単純に4つ目の要素が無視されるだけになっているようです。ですが、やはり基本的には Image
オブジェクトの mode
に合わせたピクセル値を指定してやった方が良いと思います。
例えば下記のように text
メソッドに fill
引数を指定してやれば、(255, 255, 0)
が黄色を示すピクセル値であるため、黄色の文字列を描画することができます。
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
引数にはピクセル値だけでなく色名を指定することも可能です。指定可能な色名は、Pillow 10.2.0 の場合は 148 種類あるようです。
fill
引数で指定可能な色名(Pillow で利用可能な色名)の調べ方については下記ページで解説していますので、fill
引数で指定可能な色名を具体的に知りたい方は下記ページも参照しただけると幸いです。
例えば、先ほど示したスクリプトにおいて、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
引数に様々な形式でいろんな色の文字列を描画する例になります。
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()
上記スクリプトを実行して表示される画像は下図のようなものになり、様々な色のテキストが描画できていること、さらに様々な形式での色の指定ができていることが確認できると思います。
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'
となります。
引用元:Pillow
そして、前述のように text
メソッドが実行される際には xy
引数で指定した座標に anchor
引数が配置されるように文字列が描画されることになります。
ですので、同じ座標を xy
引数に指定した場合でも anchor
引数の指定によって文字列の描画位置が異なることになります。例えば、画像の左上端に文字列を描画しようと思って画像の左上の座標 (0
, 0
) を xy
引数に指定したとしても、'lt'
を指定した場合と 'la'
を指定した場合とでは下の図のように文字列描画位置が異なります。'la'
を指定した場合の方が上側の余白が大きいことが確認できると思います。
同様に、画像の右下端の座標 (0
, 0
) を xy
引数に指定した場合も、anchor
引数の指定によって文字列の描画位置が異なることになります。特に 'rb'
を指定した場合と 'rd'
を指定した場合とでは文字列の下側の余白のサイズが大きく異なることが確認できると思います。
また、上の図の場合、'rb'
を指定した場合と 'rs'
を指定した場合とで違いが分かりにくいですが、描画する文字列のフォントを変えると、下の図のように rb'
を指定した場合と 'rs'
を指定した場合とでも大きな違いが現れるようになります。
このように、同じ座標を xy
引数に指定した場合でも anchor
引数の指定によって文字列の描画位置が異なることになります。基本的には文字列の描画位置は xy
引数で指定することになりますが、文字列の描画位置を微調整したい場合は 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()
上記スクリプトを実行することで表示される画像は下の図のようなものになります。
スポンサーリンク
align
:文字列の寄せ方向を設定する
align
引数によって文字列の寄せ方向を設定することも可能です。
align
引数には下記の3種類の文字列が指定可能です。
'left'
:左寄せ'right'
:右寄せ'center'
:中央寄せ
例えば下記のように text
メソッドに align
引数を指定してやれば “複数行の文字列” が中央寄せされた状態で描画されることになります。
スクリプトを実行して表示される画像は下図のようなものになります。今まで示してきた結果の例では全て文字列が左寄せされていましたが、今回の結果では複数行の文字列が中央に寄せされていることが確認できると思います。
予想した結果と違う!と思われた方もおられるかもしれません。この align
引数は、あくまでも文字列を描画する領域に対して寄せを行う引数であり、画像の全体に対しての寄せを行う引数ではありません。したがって、align
引数を指定したからといって例えば画像の中央に文字列が寄せられるわけではないので注意してください。
画像内の文字列描画位置を指定するのはあくまでも xy
引数(+ anchor
引数)になります。そして、文字列描画領域内での文字列の寄せを指定するのが、この align
引数となります。
また、この align
引数は複数の行の文字列の位置を特定の方向に寄せるための引数となりますので、text
引数に改行が存在しない文字列、つまり1行しか存在しない文字列を指定している場合は効果がないので注意してください。
spacing
:行間のスペースのサイズを設定する
続いて spacing
引数について説明していきます。spacing
は行間のスペースのサイズを設定する引数となります。spacing
には実数を指定し、デフォルト値は 4
となります。
行間のスペースのサイズを指定するのですから、text
引数に改行が存在しない文字列、つまり1行しか存在しない文字列を指定した場合は 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()
上記スクリプトを実行することで表示される画像は下の図のようなものになります。
stroke_width
:文字の輪郭線の幅を設定する
続いて描画する文字の輪郭線関連の設定を行う引数について紹介していきます。
最初に紹介するのが stroke_width
引数になります。この stroke_width
は描画する文字の輪郭線の幅(太さ)を設定するための引数になります。デフォルト値は 0
であり、つまりは文字の輪郭線が存在しないことになります。
例えば下記のスクリプトでは stroke_width
引数の指定を「なし」「2
」「10
」と変化させて文字列の描画を行なっています。
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_fill
:文字の輪郭線の色を設定する
また、輪郭線の色を設定することも可能で、それを設定するための引数が stroke_fill
になります。デフォルト値は fill
引数で指定した色、つまり輪郭線以外の色と同じ色になります。
例えば下記のスクリプトでは stroke_fill
引数の指定を 'red'
,・'red'
・'blue'
と変化させて文字列の描画を行なっています。
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
の指定した色の輪郭線が描画されていることを確認できると思います。
まとめ
このページでは Pillow (PIL) を用いた「画像への文字列の描画」について説明しました!
Pillow では ImageDraw モジュールの text
メソッドを利用することで画像に文字列を描画することができます。text
メソッドでは様々な引数を指定することが可能で、これにより描画する文字列のフォント・サイズ・色・描画位置等を自由自在に設定することができます。
画像にちょっとした文字列を描画したい機会も多いと思いますので、画像への文字列の描画手順や描画する文字列に対する設定方法に関しては是非覚えておいてください!
また、フォントの指定方法や色名に関しては別のページを用意して詳細を解説していますので、是非これらのページも読んでみていただければと思います!
【Pillow/Python】textメソッドで描画する文字のフォントやサイズを変更する 【Pillow/Python】Pillowで利用可能な色名の調べ方