Генерация изображений
Научитесь создавать или изменять изображения с помощью DALL·E
.
Введение
API изображения предоставляет три метода взаимодействия с изображениями:
- Создание изображений с нуля по текстовому запросу (
DALL·E 3
иDALL·E 2
). - Создание отредактированных версий изображений, заменяя некоторые области на основе нового текстового запроса (
DALL·E 2
только). - Создание вариаций существующего изображения (
DALL·E 2
только).
В этом руководстве основное внимание уделяется использованию трех этих конечных точек API с полезными примерами кода. Чтобы попробовать DALL·E 3
, перейдите в ChatGPT.
Использование
Генерации
Конечная точка генерации изображений позволяет создавать оригинальное изображение по текстовому запросу. При использовании DALL·E 3
изображения могут иметь размер 1024x1024, 1024x1792 или 1792x1024 пикселей.
По умолчанию изображения создаются в стандартном качестве, но при использовании DALL·E 3
вы можете задать качество: "hd" для улучшенной детализации. Квадратные изображения стандартного качества — самые быстрые для генерации.
Вы можете запросить 1 изображение за раз с DALL·E 3
(запросите больше, делая параллельные запросы) или до 10 изображений за раз, используя DALL·E 2
с параметром n
.
Генерация изображения
Пример кода генерации изображений с помощью DALL·E 3
from openai import OpenAI
client = OpenAI()
response = client.images.generate(
model="dall-e-3",
prompt="a white siamese cat",
size="1024x1024",
quality="standard",
n=1,
)
image_url = response.data[0].url
const response = await openai.images.generate({
model: "dall-e-3",
prompt: "a white siamese cat",
n: 1,
size: "1024x1024",
});
image_url = response.data[0].url;
curl https://api.openai.com/v1/images/generations \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-d '{
"model": "dall-e-3",
"prompt": "a white siamese cat",
"n": 1,
"size": "1024x1024"
}'
Подсказки
С выходом DALL·E 3
, теперь модель принимает заранее заданный запрос и автоматически переписывает его для повышения безопасности и добавления большего количества деталей (более детализированные запросы обычно приводят к более качественным изображениям).
Хотя эту функцию в настоящее время отключить невозможно, вы можете использовать подсказки, чтобы получить результаты, более близкие к вашему запросу, добавив следующее в ваш запрос: Я должен проверить, как инструмент работает с предельно простыми запросами. НЕ добавляйте никаких деталей, используйте как есть.
Обновленный запрос виден в поле revised_prompt
объекта ответа данных.
Пример генераций DALL·E 3
Запрос | Генерация |
---|---|
Фотография белого сиамского кота. |
Каждое изображение может быть возвращено либо в виде URL, либо в формате данных Base64, используя параметр response_format
. URL-ы истекают через час.
Редактирование (только DALL·E 2
)
Также известная как "перекрашивание", конечная точка редактирования изображений позволяет редактировать или расширять изображение путем загрузки изображения и маски, указывающей, какие области должны быть заменены. Прозрачные области маски указывают на то, где изображение должно быть отредактировано, и запрос должен описать новое полное изображение, а не только удаленную часть. Эта конечная точка может включить такие функции, как редактирование изображений с DALL·E
в ChatGPT Plus
.
Редактирование изображения
from openai import OpenAI
client = OpenAI()
response = client.images.edit(
model="dall-e-2",
image=open("sunlit_lounge.png", "rb"),
mask=open("mask.png", "rb"),
prompt="A sunlit indoor lounge area with a pool containing a flamingo",
n=1,
size="1024x1024"
)
image_url = response.data[0].url
const response = await openai.images.edit({
model: "dall-e-2",
image: fs.createReadStream("sunlit_lounge.png"),
mask: fs.createReadStream("mask.png"),
prompt: "A sunlit indoor lounge area with a pool containing a flamingo",
n: 1,
size: "1024x1024"
});
image_url = response.data[0].url;
curl https://api.openai.com/v1/images/edits \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-F model="dall-e-2" \
-F image="@sunlit_lounge.png" \
-F mask="@mask.png" \
-F prompt="A sunlit indoor lounge area with a pool containing a flamingo" \
-F n=1 \
-F size="1024x1024"
Prompt: солнечная внутренняя зона отдыха с бассейном, в котором находится фламинго
Изображение | Маска | Результат |
---|---|---|
Загруженные изображения и маску должны быть квадратными PNG изображениями размером менее 4 МБ, и должны иметь одинаковые размеры. Непрозрачные области маски не используются при генерации изображения, поэтому они необязательно должны совпадать с оригинальным изображением, как в приведенном примере.
Вариации (только DALL·E 2
)
Конечная точка вариантов изображений позволяет создавать вариации заданного изображения.
Создание вариации изображения
from openai import OpenAI
client = OpenAI()
response = client.images.create_variation(
model="dall-e-2",
image=open("corgi_and_cat_paw.png", "rb"),
n=1,
size="1024x1024"
)
image_url = response.data[0].url
const response = await openai.images.createVariation({
model: "dall-e-2",
image: fs.createReadStream("corgi_and_cat_paw.png"),
n: 1,
size: "1024x1024"
});
image_url = response.data[0].url;
curl https://api.openai.com/v1/images/variations \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-F model="dall-e-2" \
-F image="@corgi_and_cat_paw.png" \
-F n=1 \
-F size="1024x1024"
Изображение | Результат |
---|---|
Как и в случае с конечной точкой редактирования, входное изображение должно быть квадратным PNG изображением размером менее 4 МБ.
Проверка контента
Запросы и изображения фильтруются на основе нашей политики контента и возвращают ошибку, если запрос или изображение отмечены.
Советы по конкретным языкам
Node.js
Использование данных изображений из памяти
Примеры на Node.js, приведенные выше, используют модуль fs
для чтения данных изображений с диска. В некоторых случаях у вас могут быть данные изображения в памяти. Вот пример вызова API, который использует данные изображения, сохраненные в объекте Buffer
в Node.js:
import OpenAI from "openai";
const openai = new OpenAI();
// Это объект Buffer, который содержит ваши данные изображения
const buffer = [your image data];
// Установите `name`, оканчивающийся на .png, чтобы API знал, что это PNG изображение
buffer.name = "image.png";
async function main() {
const image = await openai.images.createVariation({ model: "dall-e-2", image: buffer, n: 1, size: "1024x1024" });
console.log(image.data);
}
main();
Работа с TypeScript
Если вы используете TypeScript, вы можете столкнуться с некоторыми особенностями аргументов файлов изображений. Вот пример обхода несоответствия типов, явно преобразовав аргумент:
import fs from "fs";
import OpenAI from "openai";
const openai = new OpenAI();
async function main() {
// Преобразуйте ReadStream в `any`, чтобы удовлетворить компилятор TypeScript
const image = await openai.images.createVariation({
image: fs.createReadStream("image.png") as any,
});
console.log(image.data);
}
main();
А вот похожий пример для данных изображений из памяти:
import fs from "fs";
import OpenAI from "openai";
const openai = new OpenAI();
// Это объект Buffer, который содержит ваши данные изображения
const buffer: Buffer = [your image data];
// Преобразуйте буфер в `any`, чтобы мы могли установить свойство `name`
const file: any = buffer;
// Установите `name`, оканчивающийся на .png, чтобы API знал, что это PNG изображение
file.name = "image.png";
async function main() {
const image = await openai.images.createVariation({
file,
n: 1,
size: "1024x1024"
});
console.log(image.data);
}
main();
Обработка ошибок
Запросы к API потенциально могут возвращать ошибки из-за неверных вводов, ограничений скорости или других проблем. Эти ошибки можно обработать с помощью оператора try...catch
, и подробности ошибки можно найти либо в error.response
, либо в error.message
:
import fs from "fs";
import OpenAI from "openai";
const openai = new OpenAI();
async function main() {
try {
const image = await openai.images.createVariation({
image: fs.createReadStream("image.png"),
n: 1,
size: "1024x1024",
});
console.log(image.data);
} catch (error) {
if (error.response) {
console.log(error.response.status);
console.log(error.response.data);
} else {
console.log(error.message);
}
}
}
main();
Python
Использование данных изображений из памяти (Python)
Примеры на Python, приведенные выше, используют функцию open
для чтения данных изображений с диска. В некоторых случаях у вас могут быть данные изображения в памяти. Вот пример вызова API, который использует данные изображения, хранящиеся в объекте BytesIO
:
from io import BytesIO
from openai import OpenAI
client = OpenAI()
# Это объект BytesIO, содержащий ваши данные изображения
byte_stream = BytesIO([your image data])
byte_array = byte_stream.getvalue()
response = client.images.create_variation(
image=byte_array,
n=1,
model="dall-e-2",
size="1024x1024"
)
Операции с данными изображений
Возможно, будет полезно выполнить операции над изображениями до их передачи в API. Вот пример, который использует PIL для изменения размера изображения:
from io import BytesIO
from PIL import Image
from openai import OpenAI
client = OpenAI()
# Чтение файла изображения с диска и изменение его размера
image = Image.open("image.png")
width, height = 256, 256
image = image.resize((width, height))
# Преобразование изображения в объект BytesIO
byte_stream = BytesIO()
image.save(byte_stream, format='PNG')
byte_array = byte_stream.getvalue()
response = client.images.create_variation(
image=byte_array,
n=1,
model="dall-e-2",
size="1024x1024"
)
Обработка ошибок (Python)
Запросы к API потенциально могут возвращать ошибки из-за неверных вводов, ограничений скорости или других проблем. Эти ошибки можно обработать с помощью оператора try...except
, и подробности ошибки можно найти в e.error
:
import openai
from openai import OpenAI
client = OpenAI()
try:
response = client.images.create_variation(
image=open("image_edit_mask.png", "rb"),
n=1,
model="dall-e-2",
size="1024x1024"
)
print(response.data[0].url)
except openai.OpenAIError as e:
print(e.http_status)
print(e.error)
Все указанные примеры демонстрируют возможности и использууются для вашего удобства в разработке приложений с DALL·E
.