Простейшее рисование с помощью PIL
Недавно потребовалось мне создавать картинку на лету. Решил спользовать библиотеку для питона PIL. Она поддерживает кучу форматов, а также множество цветовых систем (RGB, RGBA и более простые). Итак, рассмотрим простейшее, как создать рисунок и что-либо на нем нарисовать.
Для начала, подключим нужные модули.
from PIL import Image, ImageDraw
Модуль Image управляет непосредственно источником изображения, позволяет создавать, сохранять, октрывать рисунок. А ImageDraw, отвечает непосредственно за рисование геометрических объектов.
Теперь создадим новый рисунок:
image = Image.new(«RGBA», (320,320), (0,0,0,0))
Здесь, первый параметр это тип картинки, может быть: 1 (черно-белый), L (монохромный, оттенки серого), RGB, RGBA (RGB с альфа каналом), CMYK, YCbCr, I (32 bit Integer pixels), F (32 bit Float pixels).
Второй параметр, это объект типа tuple задающий размер изображения.
Третий параметр, это непосредственно цвет, т.к. у нас RGBA, то запись (0,0,0,0) соответствует полной прозрачности.
После этого, чтобы нарисовать на нем что-либо, требуется создать объект ImageDraw и передать ему наш рисунок:
Попробуем нарисовать красный эллипс:
draw. ellipse((10,10,300,300), fill=»red», outline=»red»)
Здесь мы рисуем эллипс, с начальными координатами: 10,10, и конечными: 300,300. Также, параметр fill задает цвет заливки, а outline — цвет контура. Помимо кодовых названий, можно использовать HTML запись, либо RGB(A) в виде tuple элемента.
Из доступных для рисования фигур доступны: кривая, линия, текст, вырезаный эллипс, точка, полигон.
После этого удалим draw и сохраним рисунок:
del draw
image.save(«/path/to/save/test.png», «PNG»)
После этого мы получи .png файл, в котором будет красный круг на прозрачном фоне: 
Вот, думаю для начального понимания поможет кому-нибудь.
Нашел краткую документацию по официальной документации. (залил на свой сайт)
Name already in use
Pillow / docs / reference / ImageDraw.rst
- Go to file T
- Go to line L
- Copy path
- Copy permalink
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
PIL.ImageDraw` module provides simple 2D graphics for :py:class:`
PIL.Image.Image` objects. You can use this module to create new images, annotate or retouch existing images, and to generate graphics on the fly for web use.
For a more advanced drawing library for PIL, see the aggdraw module.
Example: Draw a gray cross over an image
The graphics interface uses the same coordinate system as PIL itself, with (0, 0) in the upper left corner. Any pixels drawn outside of the image bounds will be discarded.
To specify colors, you can use numbers or tuples just as you would use with :py:meth:`PIL.Image.new` or :py:meth:`PIL.Image.Image.putpixel` . For “1”, “L”, and “I” images, use integers. For “RGB” images, use a 3-tuple containing integer values. For “F” images, use integer or floating point values.
For palette images (mode “P”), use integers as color indexes. In 1.1.4 and later, you can also use RGB 3-tuples or color names (see below). The drawing layer will automatically assign color indexes, as long as you don’t draw with more than 256 colors.
See :ref:`color-names` for the color names supported by Pillow.
PIL can use bitmap fonts or OpenType/TrueType fonts.
Bitmap fonts are stored in PIL’s own format, where each font typically consists of two files, one named .pil and the other usually named .pbm. The former contains font metrics, the latter raster data.
To load a bitmap font, use the load functions in the :py:mod:`
To load a OpenType/TrueType font, use the truetype function in the :py:mod:`
ImageDraw Module¶
All source images in this document are derived from https://www.pexels.com (CC0 License).
class Draw¶
The graphics interface uses the same coordinate system as PIL itself, with (0, 0) in the upper left corner.
Almost all of methods takes xy argument for sequence of points, and official documents says like this:
xy — Sequence of either 2-tuples like [(x, y), (x, y), . ] or numeric values like [x, y, x, y, . ] .
But it seems passing [x, y, x, y, . ] does not work, at least PIL 1.1.7 of Pillow 2.9.0 on CPython 2.7. (Furthermore, note that this is NOT [[x, y], [x, y], . ] . Passing [[x, y], [x, y], . ] causes exception.)
Рисуем геометрические фигуры в Python с помощью Pillow

Модуль ImageDraw из библиотеки обработки изображений Pillow (PIL) предоставляет методы для рисования круга, квадрата и прямой линии в Python.
Содержание статьи
Создание объекта Draw в Python
Используя объекта Image мы создадим фоновое изображение на которой мы будем рисовать наши фигуры при помощи объекта Draw . Не забудьте импортировать модуль Image и ImageDraw в начале кода.
Здесь создается пустое изображение с размером 500 на 300 пикселей и с тёмно желтым фоном.

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

Справочник по параметрам методов рисования
Даже если, способы рисования отличаются в зависимости от используемого метода, следующие параметры являются общими для всех.
Область рисования — 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 . Если мы зададим четыре координата которые будут соответствовать квадрату, то у нас получится ровный круг.