【pythonista3】Pillowモジュールで図形を使った画像を作る(任意の図形)
pythonスクリプトでjpgやpmgなどの画像を加工、作成することが出来る。
簡単な画像処理にPillowモジュールが使われる。このモジュールは、図形描画をして画像の保存が出来る。
iOSアプリのpythonista3には標準でこのモジュールがあるがver1.1.7と古い。(2020年3月アップデート版現在。)
pythonista3内でPillowモジュールが出来ることを紹介する。
以下4つの画像を作るサンプルを紹介する。
- 曲線を引く
- 任意の図形を描く
- ドット単位で描画してグラデーション
使用環境
- ハード: iPad第6世代
- OS: iOS13.4.1 (17E262)
- 開発環境:pythonista3 app
- python ver 3.6.1
- モジュール Pillow ver 1.1.7
使っているアプリの都合上、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の正方向になる。
- 座標は左上が
- 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
が追加されているようだ.。