OpenAI: создание и редактирование изображений на Python
TL;DR
Кратко: в статье показано, как с помощью OpenAI API и Python генерировать новые изображения, редактировать существующие с маской и создавать вариации. Приведены пример кода, советы по подготовке окружения, чек-листы для ролей и рекомендации по проверке качества.
Важно: для работы нужен действующий API ключ OpenAI и установленный пакет pillow для корректной работы масок в формате RGBA.

Введение
Если вы уже пользовались ChatGPT, вы, возможно, заметили интуицию модели при формировании ответов. OpenAI предоставляет API, которое позволяет разработчикам интегрировать генерацию кода, автодополнение текста, сравнение текстов, обучение моделей и генерацию изображений прямо в приложениях.
В этом руководстве описано, как с помощью Python и OpenAI API генерировать изображения по текстовым подсказкам, редактировать части изображения через маски и создавать их вариации. Материал рассчитан на разработчиков и технически подкованных дизайнеров. Ключевые шаги — подготовить окружение, получить API ключ, понять три основных сценария вызова API для изображений и правильно обработать полученные URL или содержимое изображений.
Что понадобится
- Python 3.8+ (желательно последняя стабильная версия)
- pip и виртуальное окружение
- пакеты: openai, pillow, python-dotenv, requests
- аккаунт OpenAI и секретный API ключ
- базовое знание Python и работы с файловой системой
Опционально: графический редактор (GIMP, Photoshop или аналог) для подготовки маски с прозрачной областью.
Установка зависимостей
Рекомендуется создать виртуальное окружение, чтобы изолировать пакеты проекта. Затем установить зависимости:
pip install openai python-dotenv pillow requestsФайл .env должен содержать ваш ключ API в таком виде:
OPENAI_API_KEY='sk-XXXXXXXXXXXXXXXXXXXXXXXXXXXX'Сохраните .env в корне проекта и не добавляйте его в систему контроля версий.
Получение API ключа в OpenAI
- Зайдите в панель OpenAI и авторизуйтесь.
- Нажмите на иконку профиля в правом верхнем углу.
- Перейдите в раздел Просмотреть API ключи. Если ключа нет, нажмите Создать новый секретный ключ и сохраните его в безопасном месте.
- Скопируйте ключ и добавьте в .env как указано выше.
Основные сценарии работы с изображениями
OpenAI предоставляет три основных endpoint для изображений:
- генерация новых изображений по prompt;
- редактирование изображения с использованием маски (mask должна быть в RGBA и того же размера, что и изображение);
- создание вариаций существующего изображения.
Ниже приведён пример класса ImageGenerator, который демонстрирует все три сценария: генерация, редактирование и вариации. Код структурирован так, чтобы быть простым для копирования и адаптации.
Пример: генерация изображений
Ключевые аргументы запроса при генерации: prompt, n и size. Размер может быть 256x256, 512x512 или 1024x1024.
Простейший рабочий пример класса и использования API выглядит так:
import openai
import os
import requests
from dotenv import load_dotenv
from PIL import Image
load_dotenv()
class ImageGenerator:
def __init__(self):
openai.api_key = os.getenv('OPENAI_API_KEY')
self.image_url = []
def generate_image(self, prompt, image_count=1, image_size='1024x1024'):
try:
response = openai.Image.create(
prompt=prompt,
n=image_count,
size=image_size
)
self.image_url = [item['url'] for item in response['data']]
print(self.image_url)
return self.image_url
except openai.error.OpenAIError as e:
print('OpenAI error:', e)
return []
def download_image(self, names):
try:
for url, name in zip(self.image_url, names):
resp = requests.get(url)
with open(f'{name}.png', 'wb') as f:
f.write(resp.content)
print('Download completed')
except Exception as e:
print('Error while downloading:', e)
# Использование:
# image_gen = ImageGenerator()
# image_gen.generate_image(prompt='Giant lion, bear, ape, and tiger standing on a waterfall', image_count=2, image_size='1024x1024')
# image_gen.download_image(names=['Animals', 'Animals2'])Примечания:
- Метод generate_image возвращает список URL, полученных от API.
- Метод download_image последовательно скачивает и сохраняет файлы на диск.
- Обрабатывайте исключения и проверяйте лимиты и ошибки сети.
Вывод ответа и пример результата
После вызова API вы получите JSON с полем data, содержащим URL или base64-данные в зависимости от конфигурации. В типичном случае это список URL, которые можно загрузить через requests.
Редактирование изображений с маской
Редактирование позволяет заменить часть изображения, отмеченную прозрачной областью в маске. Маска должна быть в формате RGBA и того же размера, что и основной файл. Прозрачная область маски указывает, куда модель будет вставлять содержимое, соответствующее prompt.
Пример методов класса для подготовки маски и вызова endpoint редактирования:
class ImageGenerator(ImageGenerator):
def convert_image_to_rgba(self, mask_name):
image = Image.open(f'{mask_name}.png')
rgba_image = image.convert('RGBA')
rgba_image.save(f'{mask_name}.png')
return rgba_image
def edit_image(self, image_name, mask_name, image_count=1, image_size='1024x1024', prompt=''):
try:
self.convert_image_to_rgba(mask_name)
response = openai.Image.create_edit(
image=open(f'{image_name}.png', 'rb'),
mask=open(f'{mask_name}.png', 'rb'),
prompt=prompt,
n=image_count,
size=image_size
)
self.image_url = [item['url'] for item in response['data']]
print(self.image_url)
return self.image_url
except openai.error.OpenAIError as e:
print('OpenAI error:', e)
return []
# Пример вызова:
# image_gen.edit_image(image_name='Animals', mask_name='mask', image_count=1, image_size='1024x1024', prompt='An eagle standing on the river bank drinking water with a big mountain')Иллюстрация исходной фотографии и маски:
Практические советы при подготовке маски:
- Маска и целевое изображение должны иметь одинаковые размеры в пикселях.
- В маске прозрачная область точно ограничивает область редактирования; аккуратная прорисовка даёт более предсказуемый результат.
- Для сложных правок используйте несколько итераций с корректировкой prompt и маски.
Создание вариаций изображения
Вариации генерируются на основе одного исходного изображения — API создаёт альтернативы, которые сохраняют общую композицию, но отличаются деталями и стилистикой.
Пример реализации метода:
class ImageGenerator(ImageGenerator):
def image_variations(self, image_name, variation_count=2, image_size='1024x1024'):
try:
response = openai.Image.create_variation(
image=open(f'{image_name}.png', 'rb'),
n=variation_count,
size=image_size
)
self.image_url = [item['url'] for item in response['data']]
print(self.image_url)
return self.image_url
except openai.error.OpenAIError as e:
print('OpenAI error:', e)
return []
# Вызов:
# image_gen.image_variations(image_name='New_Animals', variation_count=2, image_size='1024x1024')Используйте вариации, когда нужно быстро получить несколько визуальных опций на основе выбранной композиции.
Частые ошибки и когда подход не сработает
- Неправильный размер маски. Маска должна точно совпадать по размеру с изображением.
- Формат маски не RGBA. Перед отправкой конвертируйте в RGBA.
- Неполные или слишком абстрактные prompt. Чем конкретнее подсказка, тем предсказуемее результат.
- Сильные артефакты на границах прозрачной области. В этом случае отретушируйте края маски и повторите запрос.
- Ограничения лицензии и модерации. Контент, нарушающий политику OpenAI, будет отклонён.
Альтернативные подходы и интеграции
- Использовать локальные модели для предварительной генерации масок или грубых вариантов, затем улучшать через OpenAI.
- Комбинировать pipeline: сначала получить базовую композицию через OpenAI, затем доработать в профессиональном редакторе и повторно передать на редактирование.
- Для больших партий изображений автоматизировать управление очередью заданий и обработку ошибок через очереди задач (Celery, RQ).
Ментальные модели и эвристики
- Разделяй и властвуй: разбивайте задачу визуального правка на итерации; сначала композиция, затем детализация, затем стилизация.
- Минимально-достаточный prompt: начинайте с короткой четкой инструкции и расширяйте её при необходимости.
- Идентификация риска: широкие прозрачные области дают больше свободы модели, но и больше неопределённости в результате.
Контроль качества и критерии приёмки
Критерии приёмки для правок изображений:
- Изменённая область совпадает с прозрачной зоной маски и не влияет на остальную часть картинки.
- Новый объект соответствует семантике prompt (формат, поза, масштаб).
- Отсутствуют очевидные артефакты на границе вставки.
- Изображение соответствует требованиям по размеру и формату (PNG/JPEG, разрешение).
Тестовые сценарии:
- Мягкая замена объекта малого размера в углу изображения.
- Замена крупного объекта по центру композиции.
- Многошаговая правка одной и той же маски с разными prompt.
Чек-листы по ролям
Разработчик:
- Настроил виртуальное окружение и установил зависимости.
- Зафиксировал версию пакетов в requirements.txt.
- Спрятал ключи в .env и добавил .env в .gitignore.
- Реализовал обработку ошибок и логирование.
Дизайнер:
- Подготовил маски в формате RGBA нужного размера.
- Предоставил примеры prompt с ожидаемыми визуальными результатами.
- Проверил результат на наличие артефактов и соответствие стилистике.
Ревьюер / менеджер качества:
- Проверил соответствие результата требованиям приёмки.
- Сверил финальные файлы с оригиналом по метаданным и разрешению.
Практические шаблоны и сниппеты
Шаблон .env:
OPENAI_API_KEY='ваш_ключ_здесь'Шаблон запуска генерации в командной строке:
python -c "from your_module import ImageGenerator; ig=ImageGenerator(); ig.generate_image('sunset over a snowy mountain', image_count=1, image_size='1024x1024')"Советы по именованию файлов:
- Используйте понятные имена, связанные с проектом: project_scene_variant1.png
- Версионируйте изменения: image_v1.png, image_v2.png
Факты и ограничения
- Поддерживаемые размеры на момент написания: 256x256, 512x512, 1024x1024.
- Маска должна быть в RGBA и того же размера, что и изображение.
- Некоторая генерация изображений и редактирование могут попадать под модерацию контента.
Советы по производству и масштабированию
- Для пакетной обработки изображений используйте очереди и параллелизм, но учитывайте лимиты API и квоты.
- Кешируйте успешно созданные URL в базе данных, чтобы избежать повторных скачиваний.
- Планируйте обработку ошибок сети и возвращения некорректных ответов от API.
Совместимость и миграция
- При обновлении библиотеки openai внимательно читайте changelog на GitHub и новости OpenAI, так как названия методов и параметры могут меняться.
- Поддерживайте тесты, которые заглушают ответы API, чтобы быстро выявлять регрессии при миграции версий.
Пример рабочего процесса (mini-methodology)
- Подготовка: получить ключ, настроить окружение, подготовить маски и исходные изображения.
- Итерация 0 — генерация: получить несколько базовых вариантов по prompt.
- Итерация 1 — подбор маски: создать маску и протестировать редактирование небольшим участком.
- Итерация 2 — детализация: корректировать prompt и границы маски для улучшения результата.
- Проверка и приёмка по критериям качества.
Примечания по безопасности и приватности
- Не храните секретный ключ в публичных репозиториях.
- Если в изображениях присутствует персональная информация, убедитесь в соответствии с требованиями конфиденциальности и законодательства.
Краткое резюме
Этот материал показывает практическую последовательность работы с OpenAI Image API в Python: генерация изображений по текстовому описанию, редактирование существующих изображений с маской и создание вариаций. Примеры кода упрощены для демонстрации, но их можно расширять для продакшен-пайплайнов с очередями задач, логированием и обработкой ошибок.
Если хотите, я могу:
- подготовить упрощённую библиотеку-обёртку для ваших нужд;
- добавить пример с использованием base64-ответа вместо URL;
- помочь разработать тесты приёмки для автоматической проверки результатов.
Похожие материалы
Safari на Apple Watch: как открыть веб-страницу
Конвертация единиц в Windows 11
Замена экрана смартфона — как сделать самому
USB‑ключ для ремонта и обслуживания ПК
iCloud на Windows: установка и синхронизация