Модуль ImageDraw из библиотеки обработки изображений Pillow (PIL) предоставляет методы для рисования круга, квадрата и прямой линии в Python.
Содержание статьи
- Создание объекта Draw в Python
- Рисуем фигуры в Pillow: ellipse, rectangle и line
- Справочник по параметрам методов рисования
- Рисование эллипса и прямоугольника в Python
- Рисование линии, многоугольника и точки в Python
- Рисуем дугу, хорды и пироги в Pillow
- Рисование поверх готового изображения в Python
Создание объекта Draw в Python
Используя объекта Image
мы создадим фоновое изображение на которой мы будем рисовать наши фигуры при помощи объекта Draw
. Не забудьте импортировать модуль Image
и ImageDraw
в начале кода.
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: ellipse, rectangle и line
Вызываем методы рисования из объекта Draw для рисования фигур на нашем желтом фоне.
Рисуем эллипс, прямоугольник и прямую линию в качестве примера.
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) |
Полученный результат:
Справочник по параметрам методов рисования
Даже если, способы рисования отличаются в зависимости от используемого метода, следующие параметры являются общими для всех.
Область рисования — 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
. Если мы зададим четыре координата которые будут соответствовать квадрату, то у нас получится ровный круг.
Нарисуем небольшой смайл используя круги.
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') |
Результат:
Рисование линии, многоугольника и точки в Python
- Линия:
line(xy, fill, width)
:- Параметр
xy
- Указывает несколько координат двух или более точек как
((x1, y1), (x2, y2), (x3, y3)...)
; - Рисуются линии, связывающие каждую точку между собой.
- Указывает несколько координат двух или более точек как
width
: Ширина линии в пикселях- Обратите внимание, что если вы сделаете ширину линии толще c помощью
width
, указывая 3 точки или более через параметрxy
, тогда соединительная линия между ними будет выглядеть не очень аккуратно.
- Обратите внимание, что если вы сделаете ширину линии толще c помощью
- Параметр
- Многоугольник:
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 пиксель, потому их трудно увидеть, но они все-таки нарисованы в правой части области.
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
Ниже мы покажем пример для рисования дуги, хорды и pieslice (фигура напоминает кусок пирога), фигуры рисуются с помощью указания параметра xy
.
- Дуга:
arc(xy, start, end, fill)
:- Параметры
start
иend
- Указание угла дуги в градусах;
- Параметры
- Хорда:
chord(xy, start, end, fill, outline)
:- Начальные и конечные точки дуги связываются прямой линией.
- Пирог:
pieslice(xy, start, end, fill, outline)
:- Начальные и конечные точки дуги связываются прямой линией с центром круга.
Пример рисования дуги arc()
, хорды chord()
и пирога pieslice()
представлен ниже.
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) |
Полученный результат:
Рисование поверх изображения в Python
В предыдущих примерах мы рисовали фигуры на изображении со сплошным фоном, сгенерированным через метод Image.new()
. Если мы откроем имеющийся изображение через Image.open()
, то на неё можно что-то нарисовать.
В качестве примера мы будем использовать изображение создателя языка программирования Python, Гвидо ван Россума.
Сохраните у себя файл: guido-van-rossum.jpg
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, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»