0
Help us understand the problem. What are the problem?

posted at

updated at

Pillowで図形を描く

インストール

$ pip install Pillow

使い方

1. インポート

from PIL import Image

2. 画像ファイルを開く

画像ファイルを読み込み

im = Image.open(fp, mode='r', formats=None)
  • fp - ファイルのパス

新しく生成

im = Image.new(mode, size, color=0)
  • mode - モードを選択
  • size - タプル(width, height)をピクセルで指定
  • color - 画像の色 デフォルトでは'black'

3. 図形を描く

インポートとdrawオブジェクトの生成

from PIL import ImageDraw
draw = ImageDraw.Draw(im, mode=None)

直線,折れ線

draw.line(xy, fill=None, width=0, joint=None)
  • xy -
    [(x, y), (x, y), ...]
    [x, y, x, y, ...]
    のどちらかでパスを指定
  • fill - 塗りつぶす色を指定
  • width - ピクセルでの線の幅
  • joint - 'curve'を指定すると,角が丸くなる

矩形

draw.rectangle(xy, fill=None, outline=None, width=1)
  • xy -
    [(x0, y0), (x1, y1)]
    [x0, y0, x1, y1]
    のどちらかで対角の2点を指定
  • fill - 塗りつぶす色を指定
  • outline - 輪郭の色を指定
  • width - はピクセルでの線の幅
  • 丸みのある矩形を使いたいなら,recatangle()ではなく,
    rounded_rectangle()を使い,radiusに角の半径を指定

ポリゴン (折れ線の始点と終点をつないだ図形)

draw.polygon(xy, fill=None, outline=None, width=1)
  • xy -
    [(x, y), (x, y), ...]
    [x, y, x, y, ...]
    のどちらかでパスを指定
  • fill - 塗りつぶす色を指定
  • outline - 輪郭の色を指定
  • width - ピクセルでの線の幅

円,楕円

draw.ellipse(xy, fill=None, outline=None, width=1)
  • xy -
    [(x0, y0), (x1, y1)]
    [x0, y0, x1, y1]
    ただし,x1 >= x0 かつ y1 >= y0
  • fill - 塗りつぶす色を指定
  • outline - 輪郭の色を指定
  • width - ピクセルでの線の幅

draw.point(xy, fill=None)
  • xy -
    [(x, y), (x, y), ...]
    [x, y, x, y, ...]
    のどちらかでパスを指定
  • fill - 点の色を指定

文字列を挿入

draw.text(xy, text, fill=None, font=None, anchor=None, spacing=4, align='left', direction=None, features=None, language=None, stroke_width=0, stroke_fill=None, embedded_color=False)
  • xy - アンカーの座標
  • text - 挿入したい文字列 (改行を含む場合は,multiline_text())
  • fill - 文字の色を指定
  • font - ImageFontインスタンスを指定
  • anchor - 文字列の相対位置を指定
    デフォルトは左上で,中心にするなら"mm" (Text anchors)

ImageFontインスタンス

import ImageFont
font = ImageFont.truetype(font=None, size=10, index=0, encoding='', layout_engine=None)
  • font - トゥルータイプフォントのファイル
  • size - ピクセルでの文字サイズ

4. 表示

im.show(title=None)
  • title - 画像のウィンドウのタイトル

5. 保存

im.save(fp, format=None, **params)
  • fp - ファイルのパス

サンプルプログラム

sample.py
from PIL import Image, ImageDraw, ImageFont

# 幅800,高さ600の画像を生成
im = Image.new('RGB', (800,600), 'white')

draw = ImageDraw.Draw(im)

# 座標
p1 = (100,100)
p2 = (100,300)
p3 = (300,200)
p4 = (500,100)
p5 = (600,150)
p6 = (600,250)
p7 = (550,300)
p8 = (450,200)

# 折れ線
draw.line((p1 + p2 + p3), fill='red', width=3)

# ポリゴン
draw.polygon((p4 + p5 + p6 + p7 + p8), fill='#3366FF', outline=(51,153,0))

# 楕円
draw.ellipse([(200,300),(600,550)],outline='black' ,width=5)

# 文字列
# 日本語を表示するため'msgothic'を指定
font = ImageFont.truetype(font='C:/Windows/Fonts/msgothic.ttc', size=20)
draw.text((400,425), '文字列です', fill='blue', font=font, anchor='mm')

# 表示
im.show()

# 保存
im.save('sample.png', quality=95)

公式ドキュメント

Pillow — Pillow (PIL Fork) 9.1.0 documentation

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?