官方API文档:
https://platform.openai.com/docs/guides/image-generation?image-generation-model=gpt-image-1
概述
OpenAI API 允许您使用 GPT Image 或 DALL·E 模型根据文本提示生成和编辑图像。
目前,图片生成功能仅支持通过Image API实现。我们正在积极扩展对Responses API 的支持。
["Image API"是OpenAI专门为图像生成设计的编程接口]
今天我们的主角是:gpt-image-1,可以接受文本和图像输入,并支持图像输出!
Image API 提供三个端点,每个端点具有不同的功能:
- Generations:根据文本提示从头生成图像
- Edits:使用新提示修改现有图像,部分或全部
- Variations:生成现有图像的变化(仅适用于 DALL·E 2)
您还可以通过指定质量、大小、格式、压缩以及是否需要透明背景来定制输出。
下面我们直接来看如何运用代码,来进行图片的生成(python代码)
【1】图片生成
您可以使用图像生成端点根据文本提示创建图像。要了解有关自定义输出(大小、质量、格式、透明度)的更多信息,请参阅下面的自定义图像输出部分。
您可以设置n
参数以在单个请求中一次生成多张图片(默认情况下,API 返回一张图片)。
示例代码:
# 导入必要的库
from openai import OpenAI # 导入OpenAI的Python客户端库
import base64 # 导入base64模块,用于处理二进制数据的编码和解码
# 创建OpenAI客户端实例
# 默认情况下,客户端会从环境变量OPENAI_API_KEY中读取API密钥
client = OpenAI()
# 定义图像生成的提示词(prompt)
# 这段文本描述了我们想要生成的图像内容:一个兽医用听诊器聆听小水獭心跳的儿童书籍风格插画
prompt = """
A children's book drawing of a veterinarian using a stethoscope to
listen to the heartbeat of a baby otter.
"""
# 调用OpenAI的图像生成API
# model="gpt-image-1":指定使用OpenAI的gpt-image-1模型进行图像生成
# prompt参数传入我们定义的图像描述文本
result = client.images.generate(
model="gpt-image-1",
prompt=prompt
)
# 从API响应中提取base64编码的图像数据
# API返回结果中,data数组包含所有生成的图像,这里我们取第一张图片的b64_json属性
# b64_json属性包含了base64编码的图像数据
image_base64 = result.data[0].b64_json
# 将base64编码的图像数据解码为二进制数据
# 使用base64.b64decode函数将文本格式的base64编码转换回原始的二进制图像数据
image_bytes = base64.b64decode(image_base64)
# 将二进制图像数据保存到本地文件
# 使用二进制写入模式('wb')打开名为"otter.png"的文件
# 将解码后的图像二进制数据写入文件,完成图像保存
with open("otter.png", "wb") as f:
f.write(image_bytes)
先来看一下效果:
简单来说:发布请求——解析数据——保存数据
不过需要注意的是:代码中并没有API请求地址和 API 密钥,代码是从环境中读取的地址和API密钥,如果想更换URL请求地址或者API密钥的话,请看我的改写程序:
from openai import OpenAI
import base64
# 创建OpenAI客户端,明确指定API密钥和基础URL
client = OpenAI(
api_key="sk-6idfJwXzLLENQJiOB61cAa63E2684c119c6e0cF71eD4488c", # 您的API密钥
base_url="自己的URL地址", # API基础URL
timeout=300.0 # 设置更长的超时时间以处理网络延迟
)
prompt = """
可爱的小猫咪 吉卜力风格.
"""
# 调用API生成图像
result = client.images.generate(
model="gpt-image-1",
prompt=prompt,
response_format="b64_json" # 明确请求base64编码的JSON响应
)
# 从响应中提取base64编码的图像数据
image_base64 = result.data[0].b64_json
# 将base64编码转换为二进制数据
image_bytes = base64.b64decode(image_base64)
# 保存图像到文件
with open("otter.png", "wb") as f:
f.write(image_bytes)
# 打印确认信息
print(f"图像已成功生成并保存为'otter.png'")
测试结果:
【2】编辑图像
图像编辑端点允许您:
- 编辑现有图像
- 使用其他图像作为参考生成新图像
- 通过上传图像和蒙版来编辑图像的各个部分,蒙版指示哪些区域应该被替换(该过程称为修复)
使用图像引用创建新图像
您可以使用一个或多个图像作为参考来生成新图像。
在这个例子中,我们将使用 4 张输入图像来生成一个包含参考图像中物品的礼品篮的新图像。
示例代码:
import base64
from openai import OpenAI
client = OpenAI()
prompt = """
Generate a photorealistic image of a gift basket on a white background
labeled 'Relax & Unwind' with a ribbon and handwriting-like font,
containing all the items in the reference pictures.
"""
result = client.images.edit(
model="gpt-image-1",
image=[
open("body-lotion.png", "rb"),
open("bath-bomb.png", "rb"),
open("incense-kit.png", "rb"),
open("soap.png", "rb"),
],
prompt=prompt
)
image_base64 = result.data[0].b64_json
image_bytes = base64.b64decode(image_base64)
# Save the image to a file
with open("gift-basket.png", "wb") as f:
f.write(image_bytes)
分析:
1. 使用【request = client.images.edit】对上传的图像进行处理
2. edit里面包含模型名称、提示词以及图像路径
3. 剩下的就和生成图像一样了
【3】使用蒙版编辑图像(修复)
您可以提供一个遮罩来指示图像需要编辑的位置。
遮罩的透明区域将被替换,而填充区域将保持不变。
您可以使用提示描述您希望最终编辑的图像是什么样子,或者您想要具体编辑哪些内容。如果您提供多张输入图像,则蒙版将应用于第一张图像。
from openai import OpenAI
client = OpenAI()
result = client.images.edit(
model="gpt-image-1",
image=open("sunlit_lounge.png", "rb"),
mask=open("mask.png", "rb"),
prompt="A sunlit indoor lounge area with a pool containing a flamingo"
)
image_base64 = result.data[0].b64_json
image_bytes = base64.b64decode(image_base64)
# Save the image to a file
with open("composition.png", "wb") as f:
f.write(image_bytes)
蒙版通常由系统直接在界面中提供,用户可通过内置的绘图工具进行在线标记和涂改,无需离开应用程序即可完成图像编辑工作。
注意:
要编辑和遮罩的图像必须具有相同的格式和大小(大小小于 25MB)。
蒙版图片还必须包含 Alpha 通道。如果您使用图片编辑工具创建蒙版,请务必保存带有 Alpha 通道的蒙版。
【4】自定义图像输出
您可以配置以下输出选项:
- 尺寸:图像尺寸(例如,
1024x1024
,1024x1536
) - 质量:渲染质量(例如
low
、medium
、high
) - 格式:文件输出格式
- 压缩:JPEG 和 WebP 格式的压缩级别(0-100%)
- 背景:透明或不透明
size
、quality
、 并background
支持auto
选项,模型将根据提示自动选择最佳选项。
参数记得用英文!
尺寸和质量选项
标准质量的方形图像生成速度最快。默认尺寸为 1024x1024 像素。
可用尺寸 |
|
质量选项 |
|
输出格式
图像 API 返回 base64 编码的图像数据。默认格式为png
,但您也可以请求jpeg
或webp
。
如果使用jpeg
或webp
,您还可以指定output_compression
参数来控制压缩级别(0-100%)。例如,output_compression=50
将图像压缩 50%。
透明度
该gpt-image-1
模型支持透明背景。如需启用透明度,请将background
参数设置为transparent
。
它仅支持png
和webp
输出格式。
当将质量设置为medium
或 时,透明度效果最佳high
。
<span style="color:#353740"><span style="color:#353740"><code class="language-python"><code><span style="color:#8e8ea0">1
</span><span style="color:#8e8ea0">2
</span><span style="color:#8e8ea0">3
</span><span style="color:#8e8ea0">4
</span><span style="color:#8e8ea0">5
</span><span style="color:#8e8ea0">6
</span><span style="color:#8e8ea0">7
</span><span style="color:#8e8ea0">8
</span><span style="color:#8e8ea0">9
</span><span style="color:#8e8ea0">10
</span><span style="color:#8e8ea0">11
</span><span style="color:#8e8ea0">12
</span><span style="color:#8e8ea0">13
</span><span style="color:#8e8ea0">14
</span><span style="color:#8e8ea0">15
</span><span style="color:#8e8ea0">16
</span><span style="color:#8e8ea0">17
</span><span style="color:#8e8ea0">18
</span></code><span style="color:#1971a8">from</span> openai <span style="color:#1971a8">import</span> OpenAI
<span style="color:#1971a8">import</span> base64
client = OpenAI()
result = client.images.generate(
model=<span style="color:#008c6a">"gpt-image-1"</span>,
prompt=<span style="color:#008c6a">"Draw a 2D pixel art style sprite sheet of a tabby gray cat"</span>,
size=<span style="color:#008c6a">"1024x1024"</span>,
background=<span style="color:#008c6a">"transparent"</span>,
quality=<span style="color:#008c6a">"high"</span>,
)
image_base64 = result.json()[<span style="color:#008c6a">"data"</span>][<span style="color:#e62c7a">0</span>][<span style="color:#008c6a">"b64_json"</span>]
image_bytes = base64.b64decode(image_base64)
<span style="color:#353740"># Save the image to a file</span>
<span style="color:#1971a8">with</span> <span style="color:#c0660d">open</span>(<span style="color:#008c6a">"sprite.png"</span>, <span style="color:#008c6a">"wb"</span>) <span style="color:#1971a8">as</span> f:
f.write(image_bytes)</code></span></span>
限制
GPT-4o 图像模型是一个强大且多功能的图像生成模型,但它仍然有一些需要注意的局限性:
- 延迟:复杂的提示可能需要长达 2 分钟才能处理。
- 文本渲染:尽管与 DALL·E 系列相比有了显著改进,但该模型在文本的精确放置和清晰度方面仍然存在困难。
- 一致性:虽然该模型能够产生一致的图像,但有时可能会难以保持跨代重复出现的角色或品牌元素的视觉一致性。
- 构图控制:尽管改进了指令遵循性,但模型可能难以将元素精确地放置在结构化或布局敏感的构图中。
内容审核
所有提示和生成的图像均按照我们的内容政策进行过滤。
对于使用 的图像生成gpt-image-1
,您可以使用moderation
参数控制审核严格度。此参数支持两个值:
auto
(默认):标准过滤,旨在限制创建某些类别的潜在不适合年龄的内容。low
:限制较少的过滤。
成本和延迟
该模型首先生成专门的图像 token,然后生成图像。延迟和最终成本都与渲染图像所需的 token 数量成正比——图像尺寸越大、质量设置越高,所需的 token 数量也就越多。
生成的标记数量取决于图像尺寸和质量:
质量 | 正方形(1024×1024) | 肖像(1024×1536) | 风景(1536×1024) |
---|---|---|---|
低的 | 272个代币 | 408 个代币 | 400个代币 |
中等的 | 1056个代币 | 1584 个代币 | 1568 个代币 |
高的 | 4160 个代币 | 6240 个代币 | 6208 个代币 |
请注意,您还需要考虑输入标记:提示的文本标记和编辑图像时输入图像的图像标记。
因此最终成本是以下各项的总和:
- 输入文本标记
- 如果使用编辑端点,则输入图像令牌
- 图像输出标记