Гид по технологиям

OpenAI: создание и редактирование изображений на Python

7 min read Разработка Обновлено 19 Dec 2025
OpenAI: создание и редактирование изображений на Python
OpenAI: создание и редактирование изображений на Python

TL;DR

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

Важно: для работы нужен действующий API ключ OpenAI и установленный пакет pillow для корректной работы масок в формате RGBA.

Код с визуализацией AI-лица

Введение

Если вы уже пользовались 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

  1. Зайдите в панель OpenAI и авторизуйтесь.
  2. Нажмите на иконку профиля в правом верхнем углу. Страница документации OpenAI со значком профиля
  3. Перейдите в раздел Просмотреть API ключи. Если ключа нет, нажмите Создать новый секретный ключ и сохраните его в безопасном месте. Окно создания нового ключа API OpenAI
  4. Скопируйте ключ и добавьте в .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.

Пример вывода кода с URL изображений

Редактирование изображений с маской

Редактирование позволяет заменить часть изображения, отмеченную прозрачной областью в маске. Маска должна быть в формате 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)

  1. Подготовка: получить ключ, настроить окружение, подготовить маски и исходные изображения.
  2. Итерация 0 — генерация: получить несколько базовых вариантов по prompt.
  3. Итерация 1 — подбор маски: создать маску и протестировать редактирование небольшим участком.
  4. Итерация 2 — детализация: корректировать prompt и границы маски для улучшения результата.
  5. Проверка и приёмка по критериям качества.

Примечания по безопасности и приватности

  • Не храните секретный ключ в публичных репозиториях.
  • Если в изображениях присутствует персональная информация, убедитесь в соответствии с требованиями конфиденциальности и законодательства.

Краткое резюме

Этот материал показывает практическую последовательность работы с OpenAI Image API в Python: генерация изображений по текстовому описанию, редактирование существующих изображений с маской и создание вариаций. Примеры кода упрощены для демонстрации, но их можно расширять для продакшен-пайплайнов с очередями задач, логированием и обработкой ошибок.

Если хотите, я могу:

  • подготовить упрощённую библиотеку-обёртку для ваших нужд;
  • добавить пример с использованием base64-ответа вместо URL;
  • помочь разработать тесты приёмки для автоматической проверки результатов.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Safari на Apple Watch: как открыть веб-страницу
Apple Watch

Safari на Apple Watch: как открыть веб-страницу

Конвертация единиц в Windows 11
Инструкции

Конвертация единиц в Windows 11

Замена экрана смартфона — как сделать самому
Ремонт телефона

Замена экрана смартфона — как сделать самому

USB‑ключ для ремонта и обслуживания ПК
Инструменты

USB‑ключ для ремонта и обслуживания ПК

iCloud на Windows: установка и синхронизация
Руководство

iCloud на Windows: установка и синхронизация

Ограничить неудачные входы в Windows 10
Безопасность

Ограничить неудачные входы в Windows 10