#python #Pillow #画像 #弓形 #弧 #arc #色 #RGB
この記事では、pythonのPILというモジュール(Pillow)で弓形(弧)を描く方法について、わかりやすく解説します。
絵を描くための準備
本記事では、画像を描くための準備は、下記のプログラムで行います。
<ファイル名:arc.py>
from PIL import Image, ImageDraw # PILからImage, ImageDrawクラスを取り出す
im = Image.new('RGB', ( 500, 600), (255, 255, 255)) # 500 ✕ 600ドットで白(=(255,255,255)の
# キャンバスを準備する
draw = ImageDraw.Draw(im) # 絵を描き込むバケツ(ImageDraw.Drwオブジェクト)を準備する
im.show() # 画面に表示する
実行は以下のようにして行います。
python arc.py
結果は以下のとおり、真っ白な500✕600ドットのキャンバスが表示されます。
なお、小生のPCでは画像表示にXnViewというソフトを使っているため、プログラムで、im.show()関数を実行したときに、これが起動されました。
読者の方は、違うソフトが起動されると思います。
円を描くことに集中するため、この部分のプログラムの詳細な説明はここではしません。コメントに簡単な説明をしていますので、参照してください。
詳しい説明が必要な場合は、『【第4回】にっこちゃんを描いてやんわりと関数・モジュールを学ぶ(解説編)』の『画像を描くキャンバスの作成』以降を参照してください。
座標について
画像の表示で使う座標は、下図のように
左上が (x, y)=(0, 0) で、
左に行くにつれて x座標が増え、
下に行くにつれて y座標が増えます。
中学で学ぶ数学の座標では、y座標は下が0で、上に行くにつれて増えますが、コンピュータでは、逆になるため、注意が必要です。
角度について
角度を扱う描画処理では、角度を以下のように時計の3時の位置を0°として、時計回りに角度を指定する必要があります。
弓形(弧)を描いてみる
Pillowで弓形(弧)を描くには、arc関数を使います。
以下の入力が必要です。
・ 弧を含む長方形の左上位置x座標, y座標
・ 弧を含む長方形の右下位置x座標, y座標
・ 弧を描き始める角度
・ 弧を描き終える角度
・ 弧の色の赤(Red)成分, 緑(Green)成分, 青(Blue)成分
・ 弧の線の幅
プログラム中に書くと、以下になります。
draw.arc( ( (弧を含む長方形の左上位置x座標, y座標), (弧を含む長方形の右下位置x座標, y座標) ),
弧を描き始める角度, 弧を描き終える角度
fill=( 弧の線の色のRed成分, Green成分, Blue成分),
width=弧の線の幅 )
弧を描画する場合は、円に沿ってどの角度から弧を開始して、どの角度で弧を終了するかを指定するため、円に比べて結果がイメージしにくいと思います。
説明しても難しくなるため、ひとます簡単な弧を描いてみます。
キャンバスの左上(0, 0)、右下(500, 500)に一杯に収まる弧を黒い線で描いてみます。
以下の行を付け加えます。
draw.arc((( 0, 0),( 500, 500)), 0, 180, fill=(0, 0, 0))
2つ目の入力 0 は弧を描き始める角度、3つ目の入力 180 は弧を描き終える角度です。
4つ目は弧の線の色で、fill=(直線の色の赤(Red成分), 緑(Green成分), 青(Blue成分))
です。
Red成分, Green成分, Blue成分の全てが0の場合に黒となります。
付け加えた後のプログラムは以下になります。
<ファイル名:arc.py>
from PIL import Image, ImageDraw # PILからImage, ImageDrawクラスを取り出す
im = Image.new('RGB', ( 500, 600), (255, 255, 255)) # 500 ✕ 600ドットで白(=(255,255,255)の
# キャンバスを準備する
draw = ImageDraw.Draw(im) # 絵を描き込むバケツ(ImageDraw.Drwオブジェクト)を準備する
draw.arc((( 0, 0),( 500, 500)), 0, 180, fill=(0, 0, 0))
im.show() # 画面に表示する
実行した結果は以下のとおりに表示されます。
あまりにもシンプルです。
ですが、この絵で、弧の座標と角度のイメージが伝わりましたでしょうか。
伝わらなかった場合は、コメント欄やSNSのダイレクトメールででもお知らせください。😌
では、弧の大きさを少しづつ小さくし、弧の描き始め角度、描き終わり角度をずらして、3つ弧を描いてみます。
<ファイル名:arc.py>
from PIL import Image, ImageDraw # PILからImage, ImageDrawクラスを取り出す
im = Image.new('RGB', ( 500, 600), (255, 255, 255)) # 500 ✕ 600ドットで白(=(255,255,255)の
# キャンバスを準備する
draw = ImageDraw.Draw(im) # 絵を描き込むバケツ(ImageDraw.Drwオブジェクト)を準備する
draw.arc((( 0, 0),( 500, 500)), 0, 180, fill=(0, 0, 0))
draw.arc((( 10, 10),( 490, 490)), 20, 200, fill=(0, 0, 0))
draw.arc((( 20, 20),( 480, 480)), 40, 220, fill=(0, 0, 0))
im.show() # 画面に表示する
実行すると以下となります。
このように弧を小さくしながら、描き始めと描き終わりを変えていくと、どんな絵ができるのか楽しみです。
座標と角度を手作業で変えていくのは大変ですので、ここで一気に計算式を使ってプログラミングしてみます。
<ファイル名:arc.py>
from PIL import Image, ImageDraw # PILからImage, ImageDrawクラスを取り出す
im = Image.new('RGB', ( 500, 600), (255, 255, 255)) # 500 ✕ 600ドットで白(=(255,255,255)の
# キャンバスを準備する
draw = ImageDraw.Draw(im) # 絵を描き込むバケツ(ImageDraw.Drwオブジェクト)を準備する
deg_delta = 0 # 角度の増加分
red = 0 # 弧の色の赤要素
green = 100 # 弧の色の緑要素
blue = 100 # 弧の色の青要素
# 1 から 250まで弧を縮めるサイズを変化させる
for delta in range(1,250) :
# 弧の大きさを縮めながら、描き始めと描き終わりの角度を徐々にずらして描画
draw.arc((( delta, delta),( 500-delta, 500-delta)),
deg_delta, 180+deg_delta, fill=(red, green, blue), width = 2)
deg_delta = deg_delta + 5 # 角度の増加分を増やす
red = red + 1 # 弧の色の赤成分を変更する
blue = blue + 1 # 弧の色の青成分を変更する
im.show() # 画面に表示する
詳細な説明はプログラム中のコメントを見てください。
おおよそ、以下の処理をしています。
1.弧のサイズを徐々に縮めるため、縮めるサイズ”delta”をfor文で1から250まで増やす
2.弧を描画する(弧の線の太さは1だと隙間ができるので2にしています)
3.弧の描き始めと描き終わりの角度を徐々にずらすため、角度を5°増やす
4.弧の色の要素を徐々に変化させるため、色の成分の値を増やす
実行すると以下になりました。
蚊取り線香の形になる が正解でした❗
アイコン画像で出てるから知っとるがな。。(ー_ー)
最後に
いかがでしたでしょうか?
arc関数では、独特な以下の角度の指定がありました。
- 弧を描き始める角度
- 弧を描き終える角度
また、
- for文
- range関数
など、プログラミングならではの特別な処理についても解説しました。
ということで、また別の描画方法を解説しますので、ご期待ください!
この記事へのお問い合わせや、無料のサポート、一歩踏み込んだ有料サポートが必要な場合は、ホームページからメールで受け付けています。お気軽にご連絡ください。
コメント