跳至主要内容

GPT-Image-1 API:分步指南与示例

了解如何使用 GPT-Image-1 API 生成与编辑图像,包括环境配置、参数用法,以及遮罩与合成多图等实用示例。
· 12分钟 阅读

使用 AI 探索

几周前,ChatGPT 凭借其全新的图像生成模型在网络上迅速走红。这款模型是我迄今为止见过最出色的。它之所以与众不同,关键在于其图像编辑能力。它的准确度极高,让把想象变成现实变得异常轻松。其他模型也能做到,但准确度不在一个量级。

在界面中生成图像非常简单,我们只需提供一段文字提示即可。不过,作为程序员,我一直期待它登陆 API,这样我就能以编程方式与之交互。现在这一天终于到来,我写下这篇博客,教您如何用 Python 使用它。

如果您只想了解如何在聊天界面中使用它,我之前写过这篇GPT-4o 图像生成指南,其中包含八个实用示例。您也可以查看我们更新的文章,介绍使用 GPT-Image-1.5 模型的全新 ChatGPT Images。

GPT-Image-1 API 配置

新的 GPT 图像模型受保护,这意味着使用它需要进行额外的验证。本节将介绍如何设置 API。如果您已经有 API 密钥,可以跳过第一步。

步骤 1:生成 API 密钥

第一步是生成 API 密钥。我们可以登录其平台并进入 API keys 页面。然后点击“Create new secret key”按钮。

生成密钥后,新建一个名为 .env 的文件,并按如下格式粘贴:

OPENAI_API_KEY=<paste_your_api_key_here>

步骤 2:验证组织

与其他 OpenAI 模型的一个重大区别在于,使用 GPT 图像 API 需要验证您的组织。原因在于 GPT-Image-1 能生成逼真且细节丰富的图像,这引发了潜在滥用的担忧,例如制作深度伪造或不当内容。通过验证组织,OpenAI 能更好地监控使用情况并执行其安全政策。

即使您没有公司,也可以验证您的组织。但请注意,此过程需要提供您的政府签发身份证件并完成面部验证。

要进行验证,请前往 OpenAI API 平台的 general 选项卡,并点击“Verifications”部分下的按钮。

该流程由第三方执行,包含以下步骤:

  1. 上传身份证件的图像。
  2. 使用手机摄像头验证您的身份与所提供证件一致。

整个流程只需几分钟完成,随后大约 15 分钟即可处理完毕。

Python 环境设置

在本教程中,我们将安装以下 Python 包:

  • openai:官方 OpenAI 包,使我们能够与其 API 交互。
  • dotenv:用于安全加载我们上面创建的 .env 文件中的 API 密钥。

使用以下命令安装:

pip install openai dotenv

用 GPT-Image-1 生成第一张图

让我们看看如何用 gpt-image-1 生成图像。首先在与 .env 文件相同的文件夹中新建一个 Python 文件,例如 generate_image.py。

然后导入所需的包:

# Import the packages
from openai import OpenAI
from dotenv import load_dotenv
import os
import base64
import time

请注意,os 和 base64 是 Python 内置包,无需安装。

接下来,加载 API 密钥并初始化 OpenAI 客户端:

# Load the API key
load_dotenv()
api_key = os.getenv("OPENAI_API_KEY")
# Initialize the OpenAI client
client = OpenAI(api_key=api_key)

随后,使用内置函数 input() 让用户输入文字提示,并向 API 发送图像生成请求:

# Ask the user to input a prompt in the terminal
print("What do you want to generate?")
prompt = input("> ")
print("Generating image...")
# Send the prompt to the API
img = client.images.generate(
  model="gpt-image-1",
  prompt=prompt,
  background="auto",
  n=1,
  quality="high",
  size="1024x1024",
  output_format="png",
  moderation="auto",
)

最后,将生成的图像保存为文件:

# Save the image into a file
image_bytes = base64.b64decode(img.data[0].b64_json)
with open(f"output_{int(time.time())}.png", "wb") as f:
  f.write(image_bytes)

完整脚本见 此处。运行脚本的命令:

python generate_image.py

下面是一个示例及其输出:

通过 API 运行 gpt-image-1 的示例

GPT-Image 1 参数

本节介绍 gpt-image-1 模型最相关的参数:

  • prompt:描述我们希望模型生成何种图像的文本指令。
  • background:图像背景类型。必须为 "transparent"、"opaque" 或 "auto" 之一。默认值为 "auto",模型会根据内容决定最佳背景类型。请注意 JPEG 不支持透明背景。
  • n:生成的图像数量。必须为 1 到 10 之间的数字。
  • quality:生成图像的质量。必须为 "high"、"medium" 或 "low" 之一,默认 "high"。
  • size:图像像素尺寸。必须为 "1024x1024"(正方形)、"1536x1024"(横向)、"1024x1536"(纵向)之一。
  • output_format:图像格式。必须为 "png"、"jpeg" 或 "webp" 之一。默认 "png"。
  • moderation:内容审核级别。可为较不严格的 "low" 或默认的 "auto"。

我们已覆盖 gpt-image-1 模型最重要的参数。更多详情及完整参数列表,请查看 官方 API 文档。

quality 参数的影响

下面是使用相同提示、不同质量生成的图像并排对比:

gpt-image-1 在写实图像上的质量影响

可以看到第一只猫(最低质量)在眼睛周围有些伪影,且随着质量提升,图像显著更趋近真实。

再看一个卡通风格输出的例子:

gpt-image-1 在绘图上的质量影响

在这种情况下,同样能看到质量越高,图像越精致。不过在我看来,对于本就不追求写实的内容,这点的重要性会低一些。

请记住,质量越高,成本和计算时间也越高,因此根据使用场景找到合适的权衡很重要。建议从低到高尝试参数,找出在各个用例中能给出可接受结果的最低值。

background 参数

在我的实验中,我发现模型大多忽略了该参数。下面是我在并排示例中同时变化 background 参数与提示中的透明度指令的效果:

gpt-image-1 中背景透明度示例

在第一个例子中,透明度参数被忽略。第二个例子里,我把透明度指令加入提示中,效果稍好。最后一个例子里,我请求不透明背景,但在提示中说明我想要贴纸,结果得到的是透明背景。

我仍建议使用该参数与您的期望相匹配,但务必在提示中同时明确所需结果以加强意图。

使用 GPT-Image-1 编辑图像

正如在引言中所述,GPT-Image-1 最令人兴奋的部分是其图像编辑能力。我们先学习如何让它编辑一张图片,然后再探索几个用例。

要进行编辑,多数代码都可复用。不同之处在于,不再使用 client.images.generate(),而是使用 client.images.edit() 函数。

示例如下:

img = client.images.edit(
  model="gpt-image-1",
  image=[
    open("my-image.jpg", "rb"),
  ],
  prompt=prompt,
  n=1,
  quality="high",
  size="1024x1536",
)

新增的参数是 image。它是用于编辑的输入图像列表。此处我们只提供了一张图片 my-image.jpg,位于与脚本相同的文件夹中。

下面是用 GPT Image 1 编辑我一张照片的示例:

使用 gpt-image-1 编辑图像的示例

请注意,由于原图是纵向比例,我使用了纵向尺寸 1024x1536。不过,这与原图比例并不一致。即使在编辑模式下,模型也只能输出上述三种尺寸的图像。

完整编辑脚本见 此处。

使用遮罩(mask)

编辑模式提供了 mask 参数,我们可以用它指定需要编辑的区域。遮罩必须是大小不超过 4 MB、与原图大小一致的 PNG 图像。透明度 100% 的区域对应 GPT Image 1 被允许编辑的区域。

遮罩的提供方式与图像类似,但这里不是列表:

img = client.images.edit(
  model="gpt-image-1",
  image=[
    open(sys.argv[1], "rb"),
  ],
  # We provide the mask like this
  mask=open("mask.png", "rb"),
  prompt=prompt,
  n=1,
  quality="high",
  size="1536x1024",
)

不过,在我的实验中效果并不理想,我也在网上看到有类似问题的反馈。

示例如下:

在 GPT Image 1 中使用遮罩的示例

我也尝试用它在特定位置添加元素,但效果并不稳定。与在图像生成时使用 background 参数类似,我发现直接在提示中描述想要的内容通常效果更好。

使用多张图片

该模型可以一次处理并组合多张图片。下面的例子中,我们用它来创建一张营销海报,将三种饮品的单独图片合成:

在 gpt-image-1 中合并多张照片

我们在 image 参数中以列表形式提供三张图片,如下:

prompt = """
Create a vibrant and eye-catching marketing poster to 
promote the cold drinks offerings at our coffee shop.
"""

img = client.images.edit(
  model="gpt-image-1",
  # We can provide multiple images at once
  image=[
    open("latte.png", "rb"),
    open("americano.png", "rb"),
    open("icetea.png", "rb"),
  ],
  prompt=prompt,
  size="1536x1024",
)

效果如下:

用 gpt-image-1 合并多张照片的结果

GPT-Image-1 计费

生成图像的计费基于以下因素:

  1. 文本提示中的 token 数量。
  2. 输入图像中的 token 数量。
  3. 输出图像中的 token 数量。

gpt-image-1 的 token 计费信息

有时我们很难理解这些成本的含义,因为我们并不知道一张图像包含多少 token。

由于输出图像的尺寸是已知的,我们也就知道每种尺寸所需的 token 数量,因此可以给出输出图像 token 价格的精确值(这通常是最昂贵的部分):

gpt-image-1 的输出计费信息

价格取决于图像质量与尺寸。更多详情请查看 GPT Image 1 价格页面。

当我们生成图像时,API 会返回其使用的 token 数量,因此可以结合上述信息精确得知成本。

我们可以打印结果中的 usage 字段来显示使用的 token 数量:

img = client.images.generate(
  model="gpt-image-1",
  prompt=prompt,
  background="transparent",
  n=1,
  quality="medium",
  size="1024x1024",
  moderation="auto",
  output_format="png",
)
# Add this to see the usage
print("Prompt tokens:", img.usage.input_tokens_details.text_tokens)
print("Input images tokens:", img.usage.input_tokens_details.image_tokens)
print("Output image tokens:", img.usage.output_tokens)

输出:

Prompt tokens: 8
Input images tokens: 0
Output image tokens: 272

结语

尽管 API 存在一些不足,比如遮罩与透明度的可靠性不够高,但该模型能够高精度地执行提示中给出的指令。

我认为这个模型为围绕其构建应用带来了许多可能性。在本教程中,我们学习了其基本用法。以下是一些您可以在此基础上继续探索的想法:

  • 将手机拍摄的食物照高效转化为可用于餐厅菜单的精美美食摄影。
  • 基于好友照片或自拍,创建可在聊天应用中使用的多种情绪贴纸包。
  • 根据一系列场景描述,生成对应的连环漫画分镜。
François Aubry

作者

François Aubry

全栈工程师,CheapGPT 创始人。我一直热爱教学。从学生时代起,我就积极寻找机会为同学提供辅导与帮助。这份热情促使我攻读博士学位,并在此期间担任助教,以支持我的学术追求。那些年里,我在传统课堂环境中收获了极大的成就感,既建立联系也促进学习。随着在线学习平台的兴起,我也看到了数字教育的变革潜力。事实上,我曾参与我们大学一款此类平台的建设。我致力于将传统教学理念与创新的数字方法相融合。我的热情在于打造既有吸引力、信息量充足,又能让当代学习者轻松获取的课程。

主题