使用 GPT Image 生成和编辑图像

在本指南中,您将学习如何使用我们新的具有图像生成功能的语言模型 GPT Image。

该模型拥有世界知识,并能利用其对世界的广泛理解来生成图像。 与我们上一代图像模型 DallE 2 和 3 相比,它在遵循指令和生成逼真图像方面也表现得更好。

要了解有关图像生成的更多信息,请参阅我们的指南

设置

%pip install pillow openai -U
import base64
import os
from openai import OpenAI
from PIL import Image
from io import BytesIO
from IPython.display import Image as IPImage, display
client = OpenAI()
# 如果未全局设置 API 密钥,请设置它
#client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY", "<your OpenAI API key if not set as env var>"))
# 创建 imgs/ 文件夹
folder_path = "imgs"
os.makedirs(folder_path, exist_ok=True)

生成图像

GPT Image 1 非常擅长遵循指令,这意味着您可以提示模型生成具有非常详细指令的图像。

prompt1 = """
渲染一个逼真的角色图像:
Blobby Alien Character Spec Name: Glorptak (或昵称:“Glorp”)
视觉外观 身体形状:无定形且粘液状。整体轮廓类似于泪滴或融化的棉花糖,会随着时间略微变化。在情绪激动或受惊时可以挤压和拉长。
材质纹理:半透明、生物发光的粘液,具有果冻般的晃动感。表面在交流或快速移动时偶尔会起涟漪。
调色板:

- 基础:彩虹色薰衣草色或海沫绿色
- 强调色:内部发光的霓虹粉色、电蓝色或金色脉络
- 基于情绪的颜色变化(愤怒=深红色,快乐=亮青色,恐惧=浅灰色)
面部特征:

- 眼睛:3-5 个不对称的漂浮眼球,位于粘液内部,可以独立旋转或眨眼
- 嘴巴:可选 — 说话或表达情绪时,表面会出现一个波纹状的新月形
- 没有可见的鼻子或耳朵;使用嵌入粘液中的振动敏感受体
- 四肢:默认情况下没有四肢,但在需要互动或移动时可以伸出假肢(触手状四肢)。可以暂时形成脚或手。
移动与行为 移动方式:

- 滑行、弹跳和滚动。
- 可以通过吸力粘附在墙壁和天花板上。害怕时,可能会压扁并迅速渗出。
举止:

- 即使在静止时也持续摆动或晃动
- 留下无害的发光粘液痕迹
- 出于好奇,倾向于暂时吸收附近的小物体
"""

img_path1 = "imgs/glorptak.jpg"
# 生成图像
result1 = client.images.generate(
    model="gpt-image-1",
    prompt=prompt1,
    size="1024x1024"
)
# 将图像保存到文件并调整大小/压缩以获得更小的文件
image_base64 = result1.data[0].b64_json
image_bytes = base64.b64decode(image_base64)

# 如果您想要高质量的 Glorptak,请调整此设置
image = Image.open(BytesIO(image_bytes))
image = image.resize((300, 300), Image.LANCZOS)
image.save(img_path1, format="JPEG", quality=80, optimize=True)
# 显示结果
display(IPImage(img_path1))

jpeg

自定义输出

您可以自定义以下输出属性:

  • 质量可以是 lowmediumhighauto(默认值)
  • 大小可以是 1024x1024(方形)、1536x1024(纵向)、1024x1536(横向)或 auto(默认)
  • 您可以调整 JPEG 和 WEBP 格式的压缩级别(从 0-100%)
  • 您可以选择生成具有透明背景的图像(仅适用于 PNG 或 WEBP)
prompt2 = "生成一张像素艺术风格的灰色虎斑猫的肖像,它打扮成一个金发女郎,背景是深色的。"
img_path2 = "imgs/cat_portrait_pixel.jpg"
# 生成图像
result2 = client.images.generate(
    model="gpt-image-1",
    prompt=prompt2,
    quality="low",
    output_compression=50,
    output_format="jpeg",
    size="1024x1536"
)
# 将图像保存到文件并调整大小/压缩以获得更小的文件
image_base64 = result2.data[0].b64_json
image_bytes = base64.b64decode(image_base64)

image = Image.open(BytesIO(image_bytes))
image = image.resize((250, 375), Image.LANCZOS)
image.save(img_path2, format="JPEG", quality=80, optimize=True)
# 显示结果
display(IPImage(img_path2))

jpeg

透明背景

您可以使用 background 属性请求透明背景,但如果您在提示中包含想要透明背景,它将默认设置为 transparent

prompt3 = "生成一张像素艺术风格的绿色桶帽图片,上面有一根粉红色的羽毛,背景是透明的。"
img_path3 = "imgs/hat.png"
result3 = client.images.generate(
    model="gpt-image-1",
    prompt=prompt3,
    quality="low",
    output_format="png",
    size="1024x1024"
)
image_base64 = result3.data[0].b64_json
image_bytes = base64.b64decode(image_base64)
# 将图像保存到文件并调整大小/压缩以获得更小的文件
image_base64 = result3.data[0].b64_json
image_bytes = base64.b64decode(image_base64)

image = Image.open(BytesIO(image_bytes))
image = image.resize((250, 250), Image.LANCZOS)
image.save(img_path3, format="PNG")
# 显示结果
display(IPImage(img_path3))

png

编辑图像

GPT Image 还可以接受图像输入,并使用它们来创建新图像。您还可以提供蒙版,如果您不想让模型更改输入图像的特定部分。

您最多可以使用 10 张输入图像,如果您使用蒙版,它将应用于 image 数组中提供的第一张图像。

prompt_edit = """
将猫和帽子的图像结合起来,展示猫戴着帽子,栖息在一棵树上,仍然是像素艺术风格。
"""
img_path_edit = "imgs/cat_with_hat.jpg"
img1 = open(img_path2, "rb")
img2 = open(img_path3, "rb")
# 生成新图像
result_edit = client.images.edit(
    model="gpt-image-1",
    image=[img1,img2],
    prompt=prompt_edit,
    size="1024x1536"
)
# 将图像保存到文件并调整大小/压缩以获得更小的文件
image_base64 = result_edit.data[0].b64_json
image_bytes = base64.b64decode(image_base64)

image = Image.open(BytesIO(image_bytes))
image = image.resize((250, 375), Image.LANCZOS)
image.save(img_path_edit, format="JPEG", quality=80, optimize=True)
# 显示结果
display(IPImage(img_path_edit))

jpeg

使用蒙版编辑图像

您还可以提供蒙版以及输入图像(如果有多张,蒙版将应用于第一张图像),以仅编辑蒙版未覆盖的输入图像部分。请注意,模型可能仍会编辑蒙版内的某些部分,但会尽量避免。

重要提示:蒙版应包含 alpha 通道。如果您是手动生成蒙版,例如使用图像编辑软件,请确保包含此 alpha 通道。

img_path_mask = "imgs/mask.png"
prompt_mask = "生成一个蒙版,划定图片中的整个角色,使用白色表示角色所在区域,黑色表示背景。返回与输入图像相同大小的图像。"
img_input = open(img_path1, "rb")

# 生成蒙版
result_mask = client.images.edit(
    model="gpt-image-1",
    image=img_input,
    prompt=prompt_mask
)
# 将图像保存到文件并调整大小/压缩以获得更小的文件
image_base64 = result_mask.data[0].b64_json
image_bytes = base64.b64decode(image_base64)

image = Image.open(BytesIO(image_bytes))
image = image.resize((300, 300), Image.LANCZOS)
image.save(img_path_mask, format="PNG")
# 显示蒙版
display(IPImage(img_path_mask))

png

创建 alpha 通道

此步骤是可选的,如果您想将黑白图像转换为带有 alpha 通道的蒙版,该蒙版可用于图像编辑 API。

# 1. 将您的黑白蒙版加载为灰度图像
mask = Image.open(img_path_mask).convert("L")

# 2. 将其转换为 RGBA,以便为其分配 alpha 通道
mask_rgba = mask.convert("RGBA")

# 3. 然后使用蒙版本身填充该 alpha 通道
mask_rgba.putalpha(mask)

# 4. 将蒙版转换为字节
buf = BytesIO()
mask_rgba.save(buf, format="PNG")
mask_bytes = buf.getvalue()
# 保存结果文件
img_path_mask_alpha = "imgs/mask_alpha.png"
with open(img_path_mask_alpha, "wb") as f:
    f.write(mask_bytes)

使用蒙版进行编辑

使用蒙版时,我们仍然需要模型描述整个结果图像的提示,而不仅仅是被蒙版覆盖的区域。

prompt_mask_edit = "一个奇怪的角色,背景是色彩斑斓的星系,有很多星星和行星。"
mask = open(img_path_mask_alpha, "rb")
result_mask_edit = client.images.edit(
    model="gpt-image-1",
    prompt=prompt_mask_edit,
    image=img_input,
    mask=mask,
    size="1024x1024"
)
# 显示结果

img_path_mask_edit = "imgs/mask_edit.png"

image_base64 = result_mask_edit.data[0].b64_json
image_bytes = base64.b64decode(image_base64)

image = Image.open(BytesIO(image_bytes))
image = image.resize((300, 300), Image.LANCZOS)
image.save(img_path_mask_edit, format="JPEG", quality=80, optimize=True)

display(IPImage(img_path_mask_edit))

png

总结

在本指南中,我们学习了如何使用我们新的图像生成模型 GPT Image,来从头开始生成新图像,或使用参考图像。我们还介绍了如何创建带有 alpha 通道的蒙版,并将其应用于输入图像,以进一步指导图像编辑。

您可以将其作为起点,探索其他用例,如果您正在寻找灵感,请查看我们文档中的图像库

祝您构建愉快!