Как создавать картинки программами на 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: квадрат в градациях серого, занимает меньше места за счёт палитры.