GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Python 3
  • Скачать Python
  • IDE
  • Скачать PyCharm
  • Django
  • Tkinter
  • Книги

This view

  • Original page
  • New address

GeezerVison is showing python-scripts.com — Рисуем круг, прямоугольник, линии и дуги в Pillow

Рисуем в Pillow Python

Модуль ImageDraw из библиотеки обработки изображений Pillow (PIL) предоставляет методы для рисования круга, квадрата и прямой линии в Python.

Содержание статьи

  • Создание объекта Draw в Python
  • Рисуем фигуры в Pillow: ellipse, rectangle и line
  • Справочник по параметрам методов рисования
  • Рисование эллипса и прямоугольника в Python
  • Рисование линии, многоугольника и точки в Python
  • Рисуем дугу, хорды и пироги в Pillow
  • Рисование поверх готового изображения в Python

Создание объекта Draw в Python

Используя объекта Image мы создадим фоновое изображение на которой мы будем рисовать наши фигуры при помощи объекта Draw. Не забудьте импортировать модуль Image и ImageDraw в начале кода.

Python
1
2
3
4
5
6
from PIL import Image, ImageDraw
 
# Пустой желтый фон.
im = Image.new('RGB', (500, 300), (219, 193, 27))
draw = ImageDraw.Draw(im)
im.show()

Здесь создается пустое изображение с размером 500 на 300 пикселей и с тёмно желтым фоном.

Создание картинки в Pillow

Рисуем фигуры в Pillow: ellipse, rectangle и line

Вызываем методы рисования из объекта Draw для рисования фигур на нашем желтом фоне.

Рисуем эллипс, прямоугольник и прямую линию в качестве примера.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from PIL import Image, ImageDraw
 
# Пустой желтый фон.
im = Image.new('RGB', (500, 300), (219, 193, 27))
draw = ImageDraw.Draw(im)
 
# Рисуем красный эллипс с черной оконтовкой.
draw.ellipse((100, 100, 150, 200), fill='red', outline=(0, 0, 0))
 
# Рисуем синий прямоугольник с белой оконтовкой.
draw.rectangle((200, 100, 300, 200), fill='blue', outline=(255, 255, 255))
 
# Рисуем розовую линию с шириной в 10 пиксель.
draw.line((350, 200, 450, 100), fill='pink', width=10)
 
im.save('draw-ellipse-rectangle-line.jpg', quality=95)

Полученный результат:

Рисуем фигуры в Python

Справочник по параметрам методов рисования

Даже если, способы рисования отличаются в зависимости от используемого метода, следующие параметры являются общими для всех.

Область рисования — xy

Параметр xy указывает прямоугольную область для рисования новой фигуры.

Уточняется один из следующих форматов:

  • (((Верхняя левая x координата, Верхняя левая y координата), (нижняя правая x координата, нижняя правая y координата));
  • (Верхняя левая x координата, Верхняя левая y координата, нижняя правая x координата, нижняя правая y координата).

В методах line(), polygon() и point() используются многочисленные координаты вместо двух точек, представляющих прямоугольную область.

  • (x1, y1, x2, y2, x3, y3...);
  • ((x1, y1), (x2, y2), (x3, y3)...).

Метод line() рисует прямую линию, которая связывает каждую точку, polygon() рисует многоугольник, а метод point() рисует точку в 1 пиксель для каждой указанной точки.

Параметр fill — заполняем фигуру определенным цветом

Параметр fill указывает какой цвет будет использован для заполнения нашей геометрической формы.

Спецификация формата цвета отличается в зависимости от указанного режима изображения (объект Image):

  • RGB: Указывает значение цвета в форме (R, G, B);
  • L (Черно-белое): Указывает значение (0-255) как целое число).

Значение по умолчанию None (не заполнено).

Есть три способа указать цвет, возьмем красный цвет, его можно записать так:

  • текстовый формат: red;
  • CSS формат (Шестнадцатеричный): #FF0000
  • RGB: (255, 0, 0)

Стоит учесть тот факт, что текстовый формат не имеет все цвета, кол-во доступных цветов ограничено в коде самой библиотеки. Вот весь список: https://github.com/python-pillow/Pillow/blob/8.1.0/src/PIL/ImageColor.py#L148

Лучше всего использовать шестнадцатеричный формат #FFFFFF (белый).

Параметр outline — цвет границ

Параметр outline указывает на цвет границы фигуры.

Спецификация формата цвета такая же, как и у параметра fill которого мы обсуждали выше. Значение по умолчанию равно None (без границ).

Параметр width — размер границ

Вне зависимости от рисуемой фигуры, вы можете указать размер в пикселях для границы фигуры.

Рисование эллипса и прямоугольника в Python

  • Эллипс (Круг): ellipse(xy, fill, outline);
  • Прямоугольник (Квадрат): rectangle(xy, fill, outline).

Метод ellipse() рисует эллипс, область рисования указывается в параметр xy. Если мы зададим четыре координата которые будут соответствовать квадрату, то у нас получится ровный круг.

Нарисуем небольшой смайл используя круги.

Python
1
2
3
4
5
6
7
8
9
10
from PIL import Image, ImageDraw
 
image = Image.new('RGB', (90, 90), 'white')
draw = ImageDraw.Draw(image)
 
draw.ellipse((0, 0, 90, 90), 'yellow', 'blue')
draw.ellipse((25, 20, 35, 30), 'yellow', 'blue')
draw.ellipse((50, 20, 60, 30), 'yellow', 'blue')
draw.arc((20, 40, 70, 70), 0, 180, 0)
image.save('draw-smile.jpg')

Результат:

Рисуем в Pillow

Рисование линии, многоугольника и точки в Python

  • Линия: line(xy, fill, width):
    • Параметр xy
      • Указывает несколько координат двух или более точек как ((x1, y1), (x2, y2), (x3, y3)...);
      • Рисуются линии, связывающие каждую точку между собой.
    • width: Ширина линии в пикселях
      • Обратите внимание, что если вы сделаете ширину линии толще c помощью width, указывая 3 точки или более через параметр xy, тогда соединительная линия между ними будет выглядеть не очень аккуратно.
  • Многоугольник: polygon(xy, fill, outline):
    • Параметр xy
      • Указывается несколько координат, трех или более точек как ((x1, y1), (x2, y2), (x3, y3)...);
      • Рисуется многоугольник, в котором каждая точка соединяется между собой при помощи линии.
  • Точка: point(xy, fill):
    • Параметр xy
      • Указывается несколько координат одной или более точек как ((x1, y1), (x2, y2), (x3, y3)...);
      • Одна точка (в размере одного пикселя) рисуется для каждого координата.

Примеры рисования линий line(), многоугольника polygon() и точки point() представлены ниже. Каждая точка представляет собой 1 пиксель, потому их трудно увидеть, но они все-таки нарисованы в правой части области.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from PIL import Image, ImageDraw
 
# Пустой желтый фон.
im = Image.new('RGB', (500, 300), (219, 193, 27))
draw = ImageDraw.Draw(im)
 
# Три черные линии в шириной в 1 пиксель.
draw.line(
    xy=(
        (30, 200),
        (130, 100),
        (80, 50)
    ), fill='black')
 
# Три красные линии с размером в 5 пикселей.
draw.line(
    xy=(
        (80, 200),
        (180, 100),
        (130, 50)
    ), fill='red', width=10)
 
# Имея три точки и связь между ними, у нас получится синий триугольник.
draw.polygon(
    xy=(
        (200, 200),
        (300, 100),
        (250, 50)
    ), fill='blue', outline=(0, 0, 0)
)
 
# Рисуем три точки.
draw.point(
    xy=(
        (350, 200),
        (450, 100),
        (400, 50)
    ), fill='black'
)
 
im.save('draw-dots.jpg', quality=95)

Полученный результат:

Рисуем линии в Pillow

Рисуем дугу, хорды и пироги в Pillow

Ниже мы покажем пример для рисования дуги, хорды и pieslice (фигура напоминает кусок пирога), фигуры рисуются с помощью указания параметра xy.

  • Дуга: arc(xy, start, end, fill):
    • Параметры start и end
      • Указание угла дуги в градусах;
  • Хорда: chord(xy, start, end, fill, outline):
    • Начальные и конечные точки дуги связываются прямой линией.
  • Пирог: pieslice(xy, start, end, fill, outline):
    • Начальные и конечные точки дуги связываются прямой линией с центром круга.

Пример рисования дуги arc(), хорды chord() и пирога pieslice() представлен ниже.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from PIL import Image, ImageDraw
 
# Пустой желтый фон.
im = Image.new('RGB', (610, 240), (219, 193, 27))
draw = ImageDraw.Draw(im)
 
# Рисуем дугу.
draw.arc(
    xy=(25, 50, 175, 200),
    start=30, end=270,
    fill='red'
)
 
# Рисуем хорду.
draw.chord(
    xy=(225, 50, 375, 200),
    start=30, end=270, fill=(255, 255, 0),
    outline=(0, 0, 0)
)
 
# Рисуем "кусок пирога".
draw.pieslice(
    xy=(425, 50, 575, 200),
    start=30, end=270, fill=(255, 255, 0),
    outline=(0, 0, 0)
)
 
im.save('draw-arc.jpg', quality=95)

Полученный результат:

Рисуем дугу в Pillow

Рисование поверх изображения в Python

В предыдущих примерах мы рисовали фигуры на изображении со сплошным фоном, сгенерированным через метод Image.new(). Если мы откроем имеющийся изображение через Image.open(), то на неё можно что-то нарисовать.

В качестве примера мы будем использовать изображение создателя языка программирования Python, Гвидо ван Россума.

Сохраните у себя файл: guido-van-rossum.jpg

Python
1
2
3
4
5
6
7
8
9
10
11
12
from PIL import Image, ImageDraw
 
im = Image.open('guido-van-rossum.jpg')
draw = ImageDraw.Draw(im)
 
draw.pieslice(
    xy=(15, 50, 140, 175),
    start=30, end=330,
    fill='red'
)
 
im.save('guido-with-pieslice.jpg', quality=95)

Полученный результат:

Рисование в Python - Pillow

Vasile Buldumac

Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.

E-mail: [email protected]

Образование
Universitatea Tehnică a Moldovei (utm.md)

  • 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
  • 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.