コードDE描画

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

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

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

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

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

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

以下4つの画像を作るサンプルを紹介する。

  • 曲線を引く
  • 任意の図形を描く
  • ドット単位で描画してグラデーション

使用環境

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

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

使い方

グラデーション

point関数でドット単位で描画することが出来る。ここではforループでドットごとにグラデーションを作る。

  • 実行結果

グラデーションの画像
グラデーションの画像

from PIL import Image,ImageDraw,ImageFont

W,H=1024,768

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

w=W/4

for x in range(W):
  for y in range(H):
    if x<w:
      r=x*255/w
      g=0
    elif x<w*2:
      r=255
      g=(x-w)*255/w
    elif x<w*3:
      r=(3*w-x)*255/w
      g=255
    else:
      r=0
      g=(4*w-x)*255/w
    b=y*255/H
    draw.point((x,y),fill=(int(r),int(g),int(b)))


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

引数は次のようになっている。

point((x座標,y座標),fill=点の色)
    • 座標は左上が(0,0)で右向きがxの正方向、下向きがyの正方向になる。
  1. fill:色は0から255のRGB値のタプル(R成分,G成分,B成分)になる。

線を引く

line関数で任意の線が引ける。細かく線を引くことで曲線になる。ここでは渦巻き模様を描く。

  • 実行結果

渦巻きの線の画像
渦巻きの線の画像

from PIL import Image,ImageDraw,ImageFont
from numpy import math
W,H=1024,768
# r 半径 d 角道差 N 点の数
r,d,N=100,3,1500

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

# 座標列を入れる配列
points=[]

for i in range(N):
  x=r*d*i/360*math.cos(math.radians(d*i))
  y=r*d*i/360*math.sin(math.radians(d*i))
  points.append((W/2+x,H/2+y))
  
# 描画
draw.line(tuple(points),fill=(255,255,0))

# 画像を保存
img.save('pillow-line-1.png')
解説
  • xy:引数の指定方法は2通りある。
    • 値を羅列する:[x, y, x, y, ...]
    • 座標のタプルをネストする:[(x, y), (x, y), ...]
  • fill:線の色は0から255のRGB値のタプル(R成分,G成分,B成分)になる。

任意の図形を描く

polygon関数で任意の線の中を塗り潰せる。ここでは八芒星を作る。線の引き方によって内部に空洞がある。

  • 実行結果

八芒星の画像
八芒星の画像

from PIL import Image,ImageDraw,ImageFont
from numpy import math

W,H=1024,768
r=384

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

# 座標列配列
points=[]
for i in range(8):
  x=r*math.cos(math.pi*(1+6*i)/8)
  y=r*math.sin(math.pi*(1+6*i)/8)
  points.append((W/2+x,H/2+y))

# 描画
draw.polygon(tuple(points),fill=(0,0,255),outline=(0,255,255))

# 画像を保存
img.save('pillow-line-2.png')
解説
  • xy:引数の指定方法は2通りある。最後の点は最初の点と繋がる。
    • 値を羅列する:[x, y, x, y, ...]
    • 座標のタプルをネストする:[(x, y), (x, y), ...]
  • fill:塗り潰しの色は0から255のRGB値のタプル(R成分,G成分,B成分)になる。線を引く向きによって、穴の開いた図形が作れる。
  • outline:枠線の色は0から255のRGB値のタプル(R成分,G成分,B成分)になる。

補足

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

参考リンク