コードDE描画

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

【pythonista3】Pillowモジュールで図形を使った画像を作る(円弧)

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

簡単な画像処理にPillowモジュールが使われる。このモジュールは、図形描画をして画像の保存が出来る。

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

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

以下では、次の2つの図形を描く方法を紹介する。

  • 扇形
  • 円弧

使用環境

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

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

使い方

以下、さまざまな角度で円弧や扇形を描く。text関数で角度を説明する。stが開始角度で0にした。edが終了角度。後に解説する。

円弧を描く

chord関数で円弧を描く。

  • 実行結果

円弧が並んだ画像
円弧が並んだ画像

from PIL import Image,ImageDraw,ImageFont

W,H=1024,768
r=128

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

for x in range(8):
  for y in range(6):
    angle=90*(x+y*8-15)
    draw.chord((x*r,y*r,(x+1)*r,(y+1)*r),0,angle,fill=(0,0,255),outline=(255,255,0))
    draw.multiline_text(((x+0.3)*r,(y+0.4)*r),f'st=0\ned={angle}',fill=(255,255,0))

# 画像を保存
img.save('pillow-arc-2.png')

扇形を描く

pieslice関数で扇形を描く。

  • 実行結果

扇形が並んだ画像
扇形が並んだ画像

from PIL import Image,ImageDraw,ImageFont

W,H=1024,768
r=128

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

for x in range(8):
  for y in range(8):
    angle=90*(x+y*8-15)
    draw.pieslice((x*r,y*r,(x+1)*r,(y+1)*r),0,angle,fill=(0,0,255),outline=(255,255,0))
    draw.multiline_text(((x+0.3)*r,(y+0.4)*r),f'st=0\ned={angle}',fill=(255,255,0))

# 画像を保存
img.save('pillow-arc-3.png')

円弧の線を描く

arc関数で円弧の線のみを描く。

  • 実行結果

円弧の線が並んだ画像
円弧の線が並んだ画像

from PIL import Image,ImageDraw,ImageFont

W,H=1024,768
r=128

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

for x in range(8):
  for y in range(6):
    angle=90*(x+y*8-15)
    draw.arc((x*r,y*r,(x+1)*r,(y+1)*r),0,angle,fill=(255,255,0))
    draw.multiline_text(((x+0.3)*r,(y+0.4)*r),f'st=0\ned={angle}',fill=(255,255,0))

# 画像を保存
img.save('pillow-arc-1.png')

解説

chord,pieslice,arc関数の構文は類似している。各関数の構文は次のようになる。

chord(xy=座標2つ,start=開始角度,end=終了角度,fill=塗り潰しの色,outline=線の色)
pieslice(xy=座標2つ,start=開始角度,end=終了角度,fill=塗り潰しの色,outline=線の色)
chord(xy=座標2つ,start=開始角度,end=終了角度,fill=線の色)

arc関数のみ塗り潰しが存在しないため、引数fillが線の色を指定し、outline引数が存在しない。

各引数を解説する。

  • xy:2つの座標を対角とした四角形の範囲に円弧を描く。
    • 例えば点(1,1)と点(3,5)を指定すると、点(2,3)を中心に幅2,高さ4の楕円の円弧や扇形を描く。
    • 2つの点は左上、右下の順序で記述する。
    • 座標の指定方法は2通りある。2つの座標を(x1,y1)(x2,y2)とする
      • (x1,y1,x1,y1):4つの値のタプル
      • ((x1,y1),(x1,y1)):2つの座標のタプルをネスト
  • start,end:円弧や扇形の開始角と終了角。角度は360度数。0が右向きで時計回りがプラス。角度の差end-startの値によって次のように描かれる。
    • 0<=end-start:開始角道から終了角まで描く。360度を超えたら枠線は円になる。塗り潰しは360度ごとに、startからendまで塗るのと、endからstartまで塗るのを交互に繰り返す。
    • end-start<0:end>=startになるまでendを360度(一周)ずつ足して描く。差分が丁度360の倍数だった場合、end==startとなり何も描かれない。
    • fill(arc関数はない):塗り潰しの色、色のRGB値(0から255まで)のタプルを使う
      • (R成分,G成分,B成分)
    • outline:(arc関数はfill)枠線の色、指定方法は塗り潰しと同じ。
補足

新しいバージョンのPillowオブジェクトでは、線の太さを指定する引数widthが追加されているようだ.。

参考リンク

フォントダウンロード先