Как создавать картинки программами на Python: основные методы

Раздел: Разработка на Python -> Графика и изображения

Создание изображений в Python: обзор подходов

Библиотека Pillow: универсальное решение

Библиотека Pillow (форк PIL) предоставляет гибкие средства для создания и редактирования растровых изображений. С её помощью можно создать пустое полотно, нарисовать геометрические фигуры, добавить текст, применить фильтры и сохранить результат в популярных форматах (PNG, JPEG, BMP, GIF и других).


from PIL import Image, ImageDraw, ImageFont

# Создание нового изображения размером 800x600 пикселей, цветовой режим RGB, белый фон
img = Image.new('RGB', (800, 600), 'white')
draw = ImageDraw.Draw(img)

# Рисование линий и фигур
draw.line((100, 100, 700, 100), fill='red', width=5)
draw.rectangle((200, 200, 600, 400), outline='blue', width=3)
draw.ellipse((300, 300, 500, 500), fill='green')

# Добавление текста
font = ImageFont.truetype('arial.ttf', 36)
draw.text((400, 50), 'Привет, Python!', fill='black', font=font)

# Сохранение в файл
img.save('example_pillow.png')

сделать картинки python (создание изображений в python)

Пояснение: Image.new создаёт полотно, ImageDraw.Draw даёт интерфейс для рисования, а метод save записывает изображение. Размеры задаются кортежем (ширина, высота).

Типичные проблемы и их решения:

  • Ошибка ModuleNotFoundError: No module named 'PIL' - установите Pillow командой pip install Pillow.
  • Ошибка OSError: cannot write mode RGBA as JPEG - JPEG не поддерживает альфа-канал. Перед сохранением конвертируйте изображение в RGB: img.convert('RGB').save('file.jpg').
  • Шрифт может отсутствовать - укажите путь к загруженному шрифту или используйте шрифт по умолчанию: ImageFont.load_default().

Как создать изображение из числового массива?

Этот подход удобен для генерации математических текстур, шумов или градиентов. Данные массива интерпретируются как пиксели.


import numpy as np
from PIL import Image

# Создаём массив 200x200 с градиентом по оси X
arr = np.zeros((200, 200, 3), dtype=np.uint8)
arr[:, :, 0] = np.linspace(0, 255, 200, dtype=np.uint8)  # красный канал
arr[:, :, 1] = 128  # зелёный канал постоянный
arr[:, :, 2] = 255  # синий канал

img = Image.fromarray(arr)
img.save('gradient_numpy.png')

картинки python код (код для создания картинок на python)

Цели: создание искусственных тестовых изображений, научная визуализация, генерация фонов.

Возможные ошибки: несоответствие dtype (должен быть uint8 для 8‑битных изображений) или формы массива (высота, ширина, каналы). Для чёрно-белых изображений форма (H, W) или (H, W, 1).

Как создавать изображения с прозрачностью и сложными формами?

Библиотека Wand (обёртка над ImageMagick) предоставляет мощные инструменты для работы с векторным рисунком, слоями и эффектами.


from wand.image import Image as WandImage
from wand.drawing import Drawing
from wand.color import Color

with WandImage(width=400, height=300, background=Color('transparent')) as img:
    with Drawing() as draw:
        draw.fill_color = Color('rgba(255, 0, 0, 0.5)')
        draw.circle((200, 150), (250, 100))
        draw(img)
    img.save(filename='circle_wand.png')

Python создание изображения (создание изображения в python)

Цели: создание логотипов, иконок с прозрачностью, сложные композиции.

Проблемы: требуется установка ImageMagick (системная зависимость) и библиотеки Wand: pip install Wand. Ошибка при сохранении может быть связана с неподдерживаемым форматом или отсутствием кодека.

Как создать изображение для компьютерного зрения?

OpenCV (cv2) ориентирован на обработку изображений и видео, но позволяет создавать изображения «с нуля» как многомерные массивы.


import cv2
import numpy as np

# Создаём чёрное изображение 400x400
img = np.zeros((400, 400, 3), dtype=np.uint8)
# Рисуем синий круг
cv2.circle(img, (200, 200), 100, (255, 0, 0), -1)
# Сохраняем
cv2.imwrite('circle_opencv.png', img)

Цели: подготовка синтетических данных для тренировки нейросетей, быстрая генерация тестовых сцен.

Ошибки: OpenCV использует порядок BGR, а не RGB. При визуализации в других инструментах цвета могут быть инвертированы. Для корректного отображения в Pillow нужно конвертировать: cv2.cvtColor(img, cv2.COLOR_BGR2RGB).

Как сохранить график matplotlib в файл изображения?

Matplotlib незаменим для визуализации данных. Созданный график можно экспортировать в PNG, PDF, SVG и другие форматы.


import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, 10, 100)
plt.plot(x, np.sin(x), label='sin(x)')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Синусоида')
plt.legend()
plt.savefig('sine_plot.png', dpi=150, bbox_inches='tight')

Цели: создание графиков для отчётов, статей, презентаций.

Типичные проблемы: сохранённый файл может иметь белые поля, если не указать bbox_inches='tight'. Для встраивания в веб полезно передать transparent=True при сохранении в PNG с прозрачным фоном. Ошибка - библиотека не установлена: pip install matplotlib.

Расширенные примеры создания изображений

Генерация анимированного GIF с помощью Pillow

Создадим анимацию вращающейся линии. Используется список кадров и параметры анимации.

Пример

from PIL import Image, ImageDraw
import math

frames = []
for angle in range(0, 360, 10):
    img = Image.new('RGB', (200, 200), 'white')
    draw = ImageDraw.Draw(img)
    cx, cy = 100, 100
    r = 80
    x1 = cx + r * math.cos(math.radians(angle))
    y1 = cy + r * math.sin(math.radians(angle))
    x2 = cx + r * math.cos(math.radians(angle + 180))
    y2 = cy + r * math.sin(math.radians(angle + 180))
    draw.line((x1, y1, x2, y2), fill='red', width=6)
    frames.append(img)

frames[0].save('animation.gif', save_all=True, append_images=frames[1:], duration=50, loop=0)
Результат: файл animation.gif с вращающейся линией. Каждый кадр длится 50 мс, анимация зациклена.

Создание изображения с использованием шрифтов TrueType

Пример отрисовки текста с нестандартным шрифтом и тенью.

Пример

from PIL import Image, ImageDraw, ImageFont

img = Image.new('RGBA', (500, 200), (255, 255, 255, 0))
draw = ImageDraw.Draw(img)
try:
    font = ImageFont.truetype('DejaVuSans-Bold.ttf', 48)
except IOError:
    font = ImageFont.load_default()

# Тень
draw.text((52, 52), 'Python', fill=(0, 0, 0, 100), font=font)
# Основной текст
draw.text((50, 50), 'Python', fill='blue', font=font)

img.save('text_with_shadow.png')
Файл text_with_shadow.png: синяя надпись «Python» с полупрозрачной чёрной тенью, сдвинутой на 2 пикселя.

Генерация шумового изображения через numpy

Создание шума Перлина (простая реализация с помощью случайного масштабирования). В реальных проектах используют библиотеку noise.

Пример

import numpy as np
from PIL import Image

height, width = 256, 256
noise = np.random.randint(0, 256, (height, width, 3), dtype=np.uint8)
img = Image.fromarray(noise)
img.save('random_noise.png')
Изображение random_noise.png – цветной шум, каждый пиксель имеет случайный цвет.

Создание многоканального изображения (мультиспектрального) с помощью numpy и Pillow

Сохраним 4 канала (RGBA), где альфа-канал вычислен как функция от координат.

Пример

import numpy as np
from PIL import Image

w, h = 100, 100
# RGB каналы – градиенты
r = np.linspace(0, 255, w, dtype=np.uint8).reshape(1, w) * np.ones((h, 1), dtype=np.uint8)
g = np.linspace(255, 0, h, dtype=np.uint8).reshape(h, 1) * np.ones((1, w), dtype=np.uint8)
b = 128 * np.ones((h, w), dtype=np.uint8)
# Альфа-канал – прозрачность, растущая к краям
alpha = (np.sqrt((np.arange(h)[:,None]-50)**2 + (np.arange(w)[None,:]-50)**2) / 50 * 255).clip(0,255).astype(np.uint8)

arr = np.stack([r, g, b, alpha], axis=2)
img = Image.fromarray(arr, 'RGBA')
img.save('multichannel.png')
Файл multichannel.png: квадрат с градиентом по красному и зелёному, постоянным синим и альфа-каналом, который делает края полупрозрачными.

Сравнение производительности: Pillow vs OpenCV при создании большого изображения

Создадим изображение 2048x2048 с заливкой случайными пикселями и замерим время.

Пример

import time
import numpy as np
from PIL import Image
import cv2

# Pillow
start = time.perf_counter()
arr = np.random.randint(0, 256, (2048, 2048, 3), dtype=np.uint8)
img = Image.fromarray(arr)
img.save('pillow_big.png')
print('Pillow:', time.perf_counter() - start)

# OpenCV
start = time.perf_counter()
arr = np.random.randint(0, 256, (2048, 2048, 3), dtype=np.uint8)
cv2.imwrite('opencv_big.png', arr)
print('OpenCV:', time.perf_counter() - start)
Пример вывода (зависит от системы):
Pillow: 1.23 сек
OpenCV: 0.87 сек
OpenCV обычно быстрее за счёт оптимизированной записи.

Создание изображения с палитрой (режим P) с помощью Pillow

Палитровые изображения экономят память. Пример – создание индексированного PNG с пользовательской палитрой.

Пример

from PIL import Image

# Создаём чёрно-белое изображение в режиме L (grayscale)
img = Image.new('L', (100,100), 255)
draw = ImageDraw.Draw(img)
draw.rectangle((25,25,75,75), fill=128)

# Конвертируем в режим P с палитрой из 256 оттенков серого
img_p = img.convert('P')
# Для нестандартной палитры используйте img.putpalette(list_of_rgb_triplets)
img_p.save('palette_image.png')
Файл palette_image.png: квадрат в градациях серого, занимает меньше места за счёт палитры.

Создание изображения в Python - comments

En
Python создание изображения (python)