WEBページに埋め込む「●」や「▼」などのちょっとした画像を作りたい…。
Pillowで図形を描くことはできないの?
なるほど…。
では今回は、「Pillowで図形描画をする方法」を
できるだけわかりやすく解説いたします。
PythonのPillowで図形描画をする方法
「ImageDraw」を使います。
まずは簡単な四角形を描いてみましょう。
ひとまず全コードと実行結果をお見せします。
解説は後ほど行います。
全コード
import PIL
from PIL import Image, ImageDraw
new_img = Image.new('RGB', (500, 500), (255, 255, 255))
square_draw = ImageDraw.Draw(new_img)
square_draw.rectangle((100, 200, 300, 400), fill=(0, 255, 0))
new_img.save('C:/Utatane/new_img.jpg')
square_draw = ImageDraw.Draw(new_img)
square_draw.rectangle((100, 200, 300, 400), fill=(0, 255, 0))
実行結果
事前準備
- Pillowのインストール
画像を加工したり編集したりするには「Pillow」のインストールが必要です。
Pillowのインストール方法
Pillowを初めて使用する場合は、下記コードを入力・実行して、インストールしてください。
pip install Pillow
※Pillowを使用したことがある場合は、このインストール作業は不要です。
インストールに関する詳細や、インストールができなかった場合の対処法は下記記事で解説しております。
また、Pillowの簡単な使い方も紹介しておりますのでご参考ください。
解説
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
今回は新しく生成した画像に図形を描いております。
画像の新規生成方法については、下記記事で詳しく解説しております。
新規生成された画像ではなく、既存の画像に図形を重ねたい場合は、後ほど解説いたします。
四角形を描く
下記コードにて、四角形を描くことができます。
square_draw = ImageDraw.Draw(new_img)
square_draw.rectangle((100, 200, 300, 400), fill=(0, 255, 0))
コードの6行目では、図形を描く準備をしております。
新しい名前の変数を書いたら、「=(イコール)」を書きます。
変数名の付け方には注意すべき点があります。
変数の性質も含めて下記記事で解説しておりますので、ご参考ください。
イコールの後に、「ImageDraw.Draw()」を書いてください。
()内には「新規生成した画像」が入った変数を書きます。
「これからこの画像に図形を描くよ!」という指令だと思ってください。
コードの7行目で図形(今回は四角形)を描いております。
square_draw.rectangle((100, 200, 300, 400), fill=(0, 255, 0))
6行目で作った変数を書いたら、「.rectangle()」を書きます。
()内には、「図形を描く位置」と「色」を指定します。
【図形を描く位置】(100, 200, 300, 400)
この4つの数値は、図形の座標を表しています。
図形の始点(左上)の座標と終点(右下)の座標です。
なぜ4つの数値があるのかというと、それぞれ「X軸方向」と「Y軸方向」があるからです。
画像(図形ではなく、キャンバスの画像)の左上が(0, 0)です。
右(X軸方向)に100移動した地点は(100, 0)です。
さらにそこから下(Y軸方向)に200移動した地点は(100, 200)です。
図形の始点と一致しました。
また、()内の数値の左側2つとも一致しました。
(100, 200, 300, 400)
()内の左側2つが、図形の始点の座標を表します。
右側2つは終点の座標です。
細かく書くとこうなります。
【 (始点のX座標, 始点のY座標, 終点のX座標, 終点のY座標) 】
【色】(0, 255, 0)
この3つの数値は、色の配合を表しています。
光の3原色(RGB)です。
左がR(RED:赤色)、真ん中がG(GREEN:緑色)、右がB(BRUE:青色)です。
数値は0~255で、今回はGが255なので、図形は緑色になります。
3つ全ての数値が0なら黒色、全て255なら白色になります。
光の3原色による配合が難しい場合は、「fill=’green‘」などでも代用できます。
ただし、この方法では描画できる色は限られていますので、ご注意ください。
任意で図形の輪郭の色を指定することが出来ます。
()内に、「outline=()」を書いてください。
square_draw.rectangle((100, 200, 300, 400), fill=(0, 255, 0), outline=(0, 0, 0))
色の配合は図形の色と同じです。
今回は輪郭を黒にしました。実行してみましょう。
黒い輪郭がある四角形ができました。
三角形を描く
今度は三角形を描いてみましょう。
delta_draw = ImageDraw.Draw(new_img)
delta_draw.polygon(((250, 100), (150, 200), (300, 350)), fill=(0, 255, 0))
三角形を描くには「polygon()」を使います。
コードの6行目は四角形の時と同じなので解説を割愛します。
コードの7行目で三角形を描いていますが、座標の指定以外は四角形の時と同じです。
※輪郭も指定できますが、今回は省略します。
座標の指定ですが、三角形の3つの頂点を指定するだけです。
【 ((頂点AのX座標, 頂点AのY座標), (頂点BのX座標, 頂点BのY座標), (頂点CのX座標, 頂点CのY座標)) 】
((250, 100), (150, 200), (300, 350))
頂点ABCの順番は関係ありませんが、X座標とY座標の位置を間違えないようにしてください。
頂点の数を3つから4つに増やすことで、いびつな四角形を描くこともできます。
頂点が5つ以上の多角形を描くこともできますので、気になる方は試してみてください。
線を描く
次は線を描いてみましょう。
line_draw = ImageDraw.Draw(new_img)
line_draw.line((100, 200, 300, 400), fill=(0, 255, 0), width=5)
線を描くには、「line()」を使います。
()内の色指定はこれまでと同じです。
座標の指定も「四角形」の時と同じで、始点と終点の座標を記述します。
「width=5」ですが、これは線の太さを表しています。
ちなみに、「width=10」にした場合は下図のようになります。
※線は輪郭の指定ができません。
輪郭を付けたい場合は、細長い四角形や多角形を描いて代用してください。
円を描く
最後に円を描いてみましょう。
circle_draw = ImageDraw.Draw(new_img)
circle_draw.ellipse((100, 200, 300, 400), fill=(0, 255, 0), outline=(0, 0, 0))
円を描くには、「ellipse()」を使います。
()内の指定は、すべてこれまでと同じですので、解説は割愛します。
座標は、始点と終点を指定します。
円なので始点・終点がわかりずらいですが、下記記事で解説しておりますので、ご参考ください。
既存の画像に図形を描く方法と図形描画の応用
前項では新規生成した画像に図形を描きました。
ここからは、既存の画像に図形を追加してみましょう。
元データが下図です。
では、コードと実行結果を見てみましょう。
import PIL
from PIL import Image, ImageDraw
input_img = Image.open('C:/Utatane/input_img.jpg')
circle_draw = ImageDraw.Draw(input_img)
circle_draw.ellipse((350, 100, 450, 200), fill=None, outline=(255, 0, 0), width=10)
input_img.save('C:/Utatane/output_img.jpg')
みかんに付いた赤丸が追加された図形です。
既存画像に図形を描画するには、「ImageDraw.Draw()」の()内に取り込んだ画像が入った変数を記述するだけです。
また、図形描画の応用として、実行結果のような塗りつぶしの無い円を描くことができます。
「fill」で色を指定せずに「None」を指定することで、塗りつぶしを無しにできます。
代わりに、「outline」で輪郭の指定と、「width」で輪郭の線の太さを指定すればOKです。
画像に文字を描画する方法は、下記記事で解説しておりますのでご参考ください。
うまく動作しない場合の対処法
エラーが出る
No such file or directory: ○○
これは、読み込むファイルやフォルダが見つからないというエラーです。
読み込むファイルのファイル名と構文のファイル名が一致しているか確認しましょう。
詳しい解説は、下記記事をご参考ください。
○○ is not defined
今まで出てきていない変数などを処理しようとした時に出るエラーです。
変数名などが間違っていないかチェックしましょう。
詳しい解説は、下記記事をご参考ください。
その他のエラー
その他のエラーが出た場合は、エラー文をコピーしてNETで検索してみましょう。
最後に
PythonのPillowで図形描画をする方法を解説いたしました。
当ブログでは、Pythonに関する情報を配信しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
挫折せずにPythonを独学で学習する方法は特におすすめです。
最後までお読みいただき、ありがとうございました。がんばってください!