1. Home

  2. /
  3. プログラミング
  4. /
  5. pythonで簡単プログラミング
  6. /
  7. 【画像描画】pythonで弓形(弧)を描いてみる

【画像描画】pythonで弓形(弧)を描いてみる

蚊取り線香 pythonで簡単プログラミング

#python #Pillow #画像 #弓形 #弧 #arc #色 #RGB

この記事では、pythonのPILというモジュール(Pillow)で弓形(弧)を描く方法について、わかりやすく解説します。

本記事では、主としてWindows、および、python3を前提にしています。

絵を描くための準備

本記事では、画像を描くための準備は、下記のプログラムで行います。

<ファイル名: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関数

など、プログラミングならではの特別な処理についても解説しました。

ということで、また別の描画方法を解説しますので、ご期待ください!

この記事へのお問い合わせや、無料のサポート、一歩踏み込んだ有料サポートが必要な場合は、ホームページからメールで受け付けています。お気軽にご連絡ください。

コメント

タイトルとURLをコピーしました