コードDE描画

プログラミングで図を描く練習

【pythonista3】Pillowモジュールで画像を編集する(文字列貼り付け)メソッドの使用例8選

pythonスクリプトでjpgやpmgなどの画像を加工、作成することが出来る。

簡単な画像処理にPillowモジュールが使われる。このモジュールは、読み込んだ画像をもとに新たな画像の作成、保存が出来る。

iOSアプリのpythonista3には標準でこのモジュールがあるがver1.1.7と古い。(2020年3月アップデート版現在。)

pythonista3内でPillowモジュールが出来ることを紹介する。

以下では、次の2つの操作を説明する。

  • 文字を貼り付け
  • 文字の範囲を塗り潰し

使用環境

使っているアプリの都合上、Pillowモジュールが古い。そのため関数の引数など現在の仕様が若干異なる場合がある。

Pythonista3では最初からPillowモジュールが入っているためインストールは必要がない。

使い方

文字を貼り付け

例1

文字のある画像を作成する。

  • 実行結果

文字の画像
文字の画像

from PIL import Image,ImageDraw,ImageFont

W,H=1024,768

# 画像オブジェクト生成
img=Image.new('RGB',(W,H),(128,128,128))
# 描画オブジェクト生成
draw=ImageDraw.ImageDraw(img)

# フォントオブジェクト生成
font=ImageFont.truetype("ipag.ttf",120)

# 文字を貼り付け
draw.multiline_text((100,50),'hello world\nこんにちは\n日本\nハロー',fill=(255,255,0),font=font,align='center')

# 画像を保存
img.save('pillow-text-1.png')
  • 解説

文字の貼り付けはImageDrawオブジェクトのmultiline_textメソッドを使う。

メソッドの引数は次のようになる。

描画オブジェクト.multiline_text((x座標,y座標),文字列,fill=(R成分,G成分,B成分),font=フォントオブジェクト,align=文字の構え,spacing=改行幅)
  • 座標:文字の左上の座標を指定する
    • (中央ではない)
  • 文字列:改行も含めることが出来る
  • fill引数は文字の色を指定する
  • font引数はフォントオブジェクトを指定する
  • align引数は文字の構えを指定する
    • align='center':中央構え
    • align='left':左構え
    • align='right':右構え
  • spacing引数は改行の幅をピクセル単位で指定する

フォントオブジェクトはフォントと文字のサイズを指定する。 文字のサイズはフォントオブジェクトで指定することに注意する。 日本語を表示させるには日本語のフォントを使う。

変数=ImageFont.truetype(フォント名,文字サイズ)

文字の範囲取得

例2

文字の範囲を取得して塗り潰す。

  • 実行結果

枠と文字を貼り付けた画像
枠と文字を貼り付けた画像

from PIL import Image,ImageDraw,ImageFont

W,H=1024,768

# 画像オブジェクト生成
img=Image.new('RGB',(W,H),(128,128,128))
# 描画オブジェクト生成
draw=ImageDraw.ImageDraw(img)

# フォントオブジェクト生成
font=ImageFont.truetype("ipag.ttf",120)

# 文字の範囲を取得
size=draw.multiline_textsize('hello world\nこんにちは\n日本\nハロー',font=font)

# 文字の範囲を塗り潰し
draw.rectangle((100,50,100+size[0],50+size[1]),fill=(0,0,255))

# 文字を貼り付け
draw.multiline_text((100,50),'hello world\nこんにちは\n日本\nハロー',fill=(255,255,0),font=font,align='center')

# 画像を保存
img.save('pillow-text-2.png')
  • 解説

ImageDrawオブジェクトのmultiline_textsizeメソッドで、文字が描画されている範囲を取得出来る。

引数、戻り値は次のようになる。

サイズ=描画オブジェクト.multiline_textsize(文字列,font=フォントオブジェクト,spacing=改行幅)
  • 文字列:改行も含めることが出来る
  • font引数はフォントオブジェクトを指定する
  • spacing引数は改行の幅をピクセル単位で指定する
  • 戻り値:文字列全体が入る枠のサイズ。幅と高さのタプル

改行幅の設定

例3

文字を改行したときの高さを指定出来る。

  • 実行結果

文字幅の大きい画像
文字幅の大きい画像

from PIL import Image,ImageDraw,ImageFont

W,H=1024,768

# 画像オブジェクト生成
img=Image.new('RGB',(W,H),(128,128,128))
# 描画オブジェクト生成
draw=ImageDraw.ImageDraw(img)

# フォントオブジェクト生成
font=ImageFont.truetype("ipag.ttf",120)

# 文字の範囲を取得
size=draw.multiline_textsize('hello world\nこんにちは\n日本\nハロー',font=font,spacing=40)

# 文字の範囲を塗り潰し
draw.rectangle((100,50,100+size[0],50+size[1]),fill=(0,0,255))

# 文字を貼り付け
draw.multiline_text((100,50),'hello world\nこんにちは\n日本\nハロー',fill=(255,255,0),font=font,align='center',spacing=40)

# 画像を保存
img.save('pillow-text-3.png')
  • 解説

ImageDrawオブジェクトのmultiline_textメソッドの、spacing引数の値で、改行の幅を設定する。

左構え

例4

文字を左構えにする。

  • 実行結果

左構えの画像
左構えの画像

from PIL import Image,ImageDraw,ImageFont

W,H=1024,768

# 画像オブジェクト生成
img=Image.new('RGB',(W,H),(128,128,128))
# 描画オブジェクト生成
draw=ImageDraw.ImageDraw(img)

# フォントオブジェクト生成
font=ImageFont.truetype("ipag.ttf",120)

# 文字の範囲を取得
size=draw.multiline_textsize('hello world\nこんにちは\n日本\nハロー',font=font)

# 文字の範囲を塗り潰し
draw.rectangle((100,50,100+size[0],50+size[1]),fill=(0,0,255))

# 文字を貼り付け
draw.multiline_text((100,50),'hello world\nこんにちは\n日本\nハロー',fill=(255,255,0),font=font,align='left')

# 画像を保存
img.save('pillow-text-4.png')
  • 解説

ImageDrawオブジェクトのmultiline_textメソッドの、align引数の値を'left'にして左構えにする。

中央構え

例5

文字を中央構えにする。

  • 実行結果

中央構えの画像
中央構えの画像

from PIL import Image,ImageDraw,ImageFont

W,H=1024,768

# 画像オブジェクト生成
img=Image.new('RGB',(W,H),(128,128,128))
# 描画オブジェクト生成
draw=ImageDraw.ImageDraw(img)

# フォントオブジェクト生成
font=ImageFont.truetype("ipag.ttf",120)

# 文字の範囲を取得
size=draw.multiline_textsize('hello world\nこんにちは\n日本\nハロー',font=font)

# 文字の範囲を塗り潰し
draw.rectangle((100,50,100+size[0],50+size[1]),fill=(0,0,255))

# 文字を貼り付け
draw.multiline_text((100,50),'hello world\nこんにちは\n日本\nハロー',fill=(255,255,0),font=font,align='center')

# 画像を保存
img.save('pillow-text-2.png')
  • 解説

ImageDrawオブジェクトのmultiline_textメソッドの、align引数の値を'center'にして中央構えにする。

右構え

例6

文字を右構えにする。

  • 実行結果

右構えの画像
右構えの画像

from PIL import Image,ImageDraw,ImageFont

W,H=1024,768

# 画像オブジェクト生成
img=Image.new('RGB',(W,H),(128,128,128))
# 描画オブジェクト生成
draw=ImageDraw.ImageDraw(img)

# フォントオブジェクト生成
font=ImageFont.truetype("ipag.ttf",120)

# 文字の範囲を取得
size=draw.multiline_textsize('hello world\nこんにちは\n日本\nハロー',font=font)

# 文字の範囲を塗り潰し
draw.rectangle((100,50,100+size[0],50+size[1]),fill=(0,0,255))

# 文字を貼り付け
draw.multiline_text((100,50),'hello world\nこんにちは\n日本\nハロー',fill=(255,255,0),font=font,align='right')

# 画像を保存
img.save('pillow-text-5.png')
  • 解説

ImageDrawオブジェクトのmultiline_textメソッドの、align引数の値を'right'にして右構えにする。

フォントの設定

例7

フォントを明朝体にする。

  • 実行結果

明朝体の画像
明朝体の画像

from PIL import Image,ImageDraw,ImageFont

W,H=1024,768

# 画像オブジェクト生成
img=Image.new('RGB',(W,H),(128,128,128))
# 描画オブジェクト生成
draw=ImageDraw.ImageDraw(img)

# フォントオブジェクト生成
font=ImageFont.truetype("ipam.ttf",120)

# 文字の範囲を取得
size=draw.multiline_textsize('hello world\nこんにちは\n日本\nハロー',font=font)

# 文字の範囲を塗り潰し
draw.rectangle((100,50,100+size[0],50+size[1]),fill=(0,0,255))

# 文字を貼り付け
draw.multiline_text((100,50),'hello world\nこんにちは\n日本\nハロー',fill=(255,255,0),font=font,align='center')

# 画像を保存
img.save('pillow-text-6.png')
  • 解説

ImageFontオブジェクトのtruetypeメソッドでフォントを指定する。

同じフォルダにフォントファイルを置いて、ファイル名を指定する。

変数=ImageFont.truetype(フォント名,文字サイズ)

文字サイズ

例8

文字サイズを指定する。

  • 実行結果

文字の大きい画像
文字の大きい画像

from PIL import Image,ImageDraw,ImageFont

W,H=1024,768

# 画像オブジェクト生成
img=Image.new('RGB',(W,H),(128,128,128))
# 描画オブジェクト生成
draw=ImageDraw.ImageDraw(img)

# フォントオブジェクト生成
font=ImageFont.truetype("ipag.ttf",200)

# 文字の範囲を取得
size=draw.multiline_textsize('hello world\nこんにちは\n日本\nハロー',font=font)

# 文字の範囲を塗り潰し
draw.rectangle((100,50,100+size[0],50+size[1]),fill=(0,0,255))

# 文字を貼り付け
draw.multiline_text((100,50),'hello world\nこんにちは\n日本\nハロー',fill=(255,255,0),font=font,align='center')

# 画像を保存
img.save('pillow-text-7.png')
  • 解説

ImageFontオブジェクトのtruetypeメソッドで文字サイズを指定する。 文字を描画するメソッドでは指定しないことに注意する。

変数=ImageFont.truetype(フォント名,文字サイズ)

まとめ

Image,ImageDraw,ImageFontオブジェクトを使って、文字の入った画像を作れる。

メソッドと引数をまとめる。

  • draw.multiline_textメソッド:文字を貼り付け
    • 文字列
    • フォント
    • 文字構え
    • 改行幅
  • draw.multiline_textsizeメソッド:文字の範囲を塗り潰し
    • 文字列
    • フォント
    • 改行幅
  • ImageFont.truetypeメソッド:フォントオブジェクト生成
    • フォントファイル使用
    • 文字サイズ設定

フォントダウンロード先

IPAフォント

参考リンク