跳到主要内容

如何使用DALL·E API

nbviewer

本笔记展示了如何使用OpenAI的DALL·E图像API端点。

有三个API端点: - 生成(Generations): 根据输入的标题生成图像或图像 - 编辑(Edits): 编辑或扩展现有图像 - 变体(Variations): 生成输入图像的变体

设置

  • 导入所需的包
  • 导入您的OpenAI API密钥:您可以在终端中运行`export OPENAI_API_KEY="your API key"`来完成此操作。
  • 设置一个目录来保存图像
# 导入
from openai import OpenAI # OpenAI Python库,用于进行API调用
import requests # 用于下载图片
import os # 用于访问文件路径
from PIL import Image # 用于打印和编辑图像

# 初始化OpenAI客户端
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY", "<your OpenAI API key if not set as env var>"))


# 设置一个目录以保存DALL·E生成的图像
image_dir_name = "images"
image_dir = os.path.join(os.curdir, image_dir_name)

# 如果该目录尚不存在,则创建它。
if not os.path.isdir(image_dir):
os.mkdir(image_dir)

# 打印要保存的目录
print(f"{image_dir=}")


image_dir='./images'

生成

生成API端点根据文本提示创建图像。API参考

必需输入: - prompt (str): 所需图像的文本描述。对于dall-e-2,最大长度为1000个字符,对于dall-e-3,最大长度为4000个字符。

可选输入: - model (str): 用于图像生成的模型。默认为dall-e-2 - n (int): 要生成的图像数量。必须介于1和10之间。默认为1。 - quality (str): 将生成的图像的质量。hd创建具有更精细细节和整体一致性的图像。此参数仅支持dall-e-3。 - response_format (str): 返回生成图像的格式。必须是”url”或”b64_json”之一。默认为”url”。 - size (str): 生成图像的尺寸。对于dall-e-2,必须是256x256、512x512或1024x1024之一。对于dall-e-3模型,必须是1024x1024、1792x1024或1024x1792之一。默认为”1024x1024”。 - style(str | null): 生成图像的风格。必须是vivid或natural之一。Vivid使模型倾向于生成超现实和戏剧性的图像。Natural使模型生成更自然、不那么超现实的图像。此参数仅支持dall-e-3。 - user (str): 代表您的最终用户的唯一标识符,这将帮助OpenAI监视和检测滥用行为。了解更多。

# 创建一个图像

# 设置提示
prompt = "A cyberpunk monkey hacker dreaming of a beautiful bunch of bananas, digital art"

# 调用 OpenAI API
generation_response = client.images.generate(
model = "dall-e-3",
prompt=prompt,
n=1,
size="1024x1024",
response_format="url",
)

# 打印响应
print(generation_response)

ImagesResponse(created=1701994117, data=[Image(b64_json=None, revised_prompt=None, url='https://oaidalleapiprodscus.blob.core.windows.net/private/org-9HXYFy8ux4r6aboFyec2OLRf/user-8OA8IvMYkfdAcUZXgzAXHS7d/img-ced13hkOk3lXkccQgW1fAQjm.png?st=2023-12-07T23%3A08%3A37Z&se=2023-12-08T01%3A08%3A37Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2023-12-07T16%3A41%3A48Z&ske=2023-12-08T16%3A41%3A48Z&sks=b&skv=2021-08-06&sig=tcD0iyU0ABOvWAKsY89gp5hLVIYkoSXQnrcmH%2Brkric%3D')])
# 保存图像
generated_image_name = "generated_image.png" # 任何你喜欢的名称;文件类型应为.png。
generated_image_filepath = os.path.join(image_dir, generated_image_name)
generated_image_url = generation_response.data[0].url # 从响应中提取图像URL
generated_image = requests.get(generated_image_url).content # 下载图像

with open(generated_image_filepath, "wb") as image_file:
image_file.write(generated_image) # 将图像写入文件

# 打印图像
print(generated_image_filepath)
display(Image.open(generated_image_filepath))


变体

变体端点生成类似于输入图像的新图像(变体)。API参考

这里我们将生成上面生成的图像的变体。

必需输入: - image (str): 用作变体基础的图像。必须是有效的PNG文件,小于4MB,并且是正方形。

可选输入: - model (str): 用于图像变体的模型。目前仅支持dall-e-2。 - n (int): 要生成的图像数量。必须介于1和10之间。默认为1。 - size (str): 生成图像的尺寸。必须是”256x256”、“512x512”或”1024x1024”之一。较小的图像生成速度更快。默认为”1024x1024”。 - response_format (str): 生成图像返回的格式。必须是”url”或”b64_json”之一。默认为”url”。 - user (str): 代表您的最终用户的唯一标识符,这将帮助OpenAI监视和检测滥用行为。了解更多。

# 创建变体

# 调用 OpenAI API 时,使用 `create_variation` 而非 `create`。
variation_response = client.images.create_variation(
image=generated_image, # generated_image 是上述生成的图像。
n=2,
size="1024x1024",
response_format="url",
)

# 打印响应
print(variation_response)

ImagesResponse(created=1701994139, data=[Image(b64_json=None, revised_prompt=None, url='https://oaidalleapiprodscus.blob.core.windows.net/private/org-9HXYFy8ux4r6aboFyec2OLRf/user-8OA8IvMYkfdAcUZXgzAXHS7d/img-noNRGgwaaotRGIe6Y2GVeSpr.png?st=2023-12-07T23%3A08%3A59Z&se=2023-12-08T01%3A08%3A59Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2023-12-07T16%3A39%3A11Z&ske=2023-12-08T16%3A39%3A11Z&sks=b&skv=2021-08-06&sig=ER5RUglhtIk9LWJXw1DsolorT4bnEmFostfnUjY21ns%3D'), Image(b64_json=None, revised_prompt=None, url='https://oaidalleapiprodscus.blob.core.windows.net/private/org-9HXYFy8ux4r6aboFyec2OLRf/user-8OA8IvMYkfdAcUZXgzAXHS7d/img-oz952tL11FFhf9iXXJVIRUZX.png?st=2023-12-07T23%3A08%3A59Z&se=2023-12-08T01%3A08%3A59Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2023-12-07T16%3A39%3A11Z&ske=2023-12-08T16%3A39%3A11Z&sks=b&skv=2021-08-06&sig=99rJOQwDKsfIeerlMXMHholhAhrHfYaQRFJBF8FKv74%3D')])
# 保存图像
variation_urls = [datum.url for datum in variation_response.data] # 提取网址
variation_images = [requests.get(url).content for url in variation_urls] # 下载图片
variation_image_names = [f"variation_image_{i}.png" for i in range(len(variation_images))] # 创建名称
variation_image_filepaths = [os.path.join(image_dir, name) for name in variation_image_names] # 创建文件路径
for image, filepath in zip(variation_images, variation_image_filepaths): # 遍历所有变体
with open(filepath, "wb") as image_file: # 打开文件
image_file.write(image) # 将图像写入文件

# 打印原始图像
print(generated_image_filepath)
display(Image.open(generated_image_filepath))

# 打印新的变体
for variation_image_filepaths in variation_image_filepaths:
print(variation_image_filepaths)
display(Image.open(variation_image_filepaths))


编辑

编辑端点使用DALL·E生成现有图像的指定部分。需要三个输入:要编辑的图像,指定要重新生成的部分的蒙版,以及描述所需图像的提示。API参考

必需输入: - image(str):要编辑的图像。必须是有效的PNG文件,小于4MB,并且是正方形。如果未提供蒙版,则图像必须具有透明度,透明度将用作蒙版。 - prompt(str):所需图像的文本描述。最大长度为1000个字符。

可选输入: - mask(文件):另一个图像,其完全透明的区域(例如,alpha为零的地方)指示应编辑图像的位置。必须是有效的PNG文件,小于4MB,并且具有与图像相同的尺寸。 - model(str):用于编辑图像的模型。目前仅支持dall-e-2。 - n(int):要生成的图像数量。必须介于1和10之间。默认为1。 - size(str):生成图像的尺寸。必须是“256x256”,“512x512”或“1024x1024”中的一个。较小的图像速度更快。默认为“1024x1024”。 - response_format(str):生成图像返回的格式。必须是“url”或“b64_json”中的一个。默认为“url”。 - user(str):代表您的最终用户的唯一标识符,这将帮助OpenAI监视和检测滥用。了解更多。

设置编辑区域

编辑需要一个“掩码”来指定需要重新生成的图像部分。任何 alpha 为 0(透明)的像素将被重新生成。下面的代码创建了一个 1024x1024 的掩码,其中底部一半是透明的。

# 创建一个遮罩
width = 1024
height = 1024
mask = Image.new("RGBA", (width, height), (0, 0, 0, 1)) # 创建一个不透明的图像蒙版

# 将下半部分设置为透明
for x in range(width):
for y in range(height // 2, height): # 只循环遍历掩码的下半部分
# 将Alpha(A)值设为零,使像素透明。
alpha = 0
mask.putpixel((x, y), (0, 0, 0, alpha))

# 保存面具
mask_name = "bottom_half_mask.png"
mask_filepath = os.path.join(image_dir, mask_name)
mask.save(mask_filepath)

执行编辑

现在我们将我们的图像、标题和蒙版提供给API,以获得对我们的图像进行编辑的5个示例。

# 编辑图片

# 调用 OpenAI API
edit_response = client.images.edit(
image=open(generated_image_filepath, "rb"), # 从发电部分
mask=open(mask_filepath, "rb"), # 从正上方
prompt=prompt, # 从发电部分
n=1,
size="1024x1024",
response_format="url",
)

# 打印响应
print(edit_response)

ImagesResponse(created=1701994167, data=[Image(b64_json=None, revised_prompt=None, url='https://oaidalleapiprodscus.blob.core.windows.net/private/org-9HXYFy8ux4r6aboFyec2OLRf/user-8OA8IvMYkfdAcUZXgzAXHS7d/img-9UOVGC7wB8MS2Q7Rwgj0fFBq.png?st=2023-12-07T23%3A09%3A27Z&se=2023-12-08T01%3A09%3A27Z&sp=r&sv=2021-08-06&sr=b&rscd=inline&rsct=image/png&skoid=6aaadede-4fb3-4698-a8f6-684d7786b067&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2023-12-07T16%3A40%3A37Z&ske=2023-12-08T16%3A40%3A37Z&sks=b&skv=2021-08-06&sig=MsRMZ1rN434bVdWr%2B9kIoqu9CIrvZypZBfkQPTOhCl4%3D')])
# 保存图像
edited_image_name = "edited_image.png" # 任何你喜欢的名称;文件类型应为.png。
edited_image_filepath = os.path.join(image_dir, edited_image_name)
edited_image_url = edit_response.data[0].url # 从响应中提取图像URL
edited_image = requests.get(edited_image_url).content # 下载图像

with open(edited_image_filepath, "wb") as image_file:
image_file.write(edited_image) # 将图像写入文件

# 打印原始图像
print(generated_image_filepath)
display(Image.open(generated_image_filepath))

# 打印编辑后的图像
print(edited_image_filepath)
display(Image.open(edited_image_filepath))