OpenAI API 接口对接完全教程 / 11 - DALL-E 图片生成
第 11 章 · DALL-E 图片生成 API
DALL-E 系列模型可以根据文本描述生成、编辑和变体化图片。本章详解图片生成、编辑和变体操作。
11.1 模型对比
| 特性 | DALL-E 2 | DALL-E 3 |
|---|
| Model ID | dall-e-2 | dall-e-3 |
| 最大分辨率 | 1024×1024 | 1024×1792 |
| 图片质量 | standard | standard / hd |
| 单次生成数 | 1-10 | 1 |
| 编辑 (Inpainting) | ✅ | ❌ |
| 变体生成 | ✅ | ❌ |
| 价格 | $0.016-0.020/张 | $0.04-0.12/张 |
| Prompt 理解 | 较弱 | 更强、更精准 |
DALL-E 3 分辨率与定价
| 分辨率 | 质量 | 价格 |
|---|
| 1024×1024 | standard | $0.04 |
| 1024×1792 / 1792×1024 | standard | $0.08 |
| 1024×1024 | hd | $0.08 |
| 1024×1792 / 1792×1024 | hd | $0.12 |
11.2 DALL-E 3 图片生成
基础用法
from openai import OpenAI
client = OpenAI()
def generate_image(prompt: str, size: str = "1024x1024",
quality: str = "standard") -> str:
"""生成图片并返回 URL"""
response = client.images.generate(
model="dall-e-3",
prompt=prompt,
size=size,
quality=quality,
n=1,
)
return response.data[0].url
# 使用
url = generate_image("一只在东京街头漫步的赛博朋克风格猫,霓虹灯效果")
print(url)
完整参数
response = client.images.generate(
model="dall-e-3",
prompt="A serene Japanese garden with cherry blossoms",
size="1024x1792", # 1024x1024 | 1024x1792 | 1792x1024
quality="hd", # standard | hd
style="natural", # natural | vivid
n=1, # DALL-E 3 只能是 1
response_format="url", # url | b64_json
)
Style 参数效果
| Style | 效果 | 适用场景 |
|---|
natural | 更真实、自然 | 照片级写实、产品图 |
vivid | 更饱和、艺术化 | 插画、海报、创意设计 |
11.3 保存图片到本地
import httpx
def save_image(url: str, path: str):
"""下载并保存图片"""
response = httpx.get(url)
with open(path, "wb") as f:
f.write(response.content)
print(f"已保存: {path}")
# 也可以用 b64_json 格式
import base64
def generate_and_save(prompt: str, path: str):
response = client.images.generate(
model="dall-e-3",
prompt=prompt,
response_format="b64_json",
size="1024x1024",
)
image_data = base64.b64decode(response.data[0].b64_json)
with open(path, "wb") as f:
f.write(image_data)
print(f"已保存: {path}")
11.4 DALL-E 2 图片生成
# DALL-E 2 支持单次生成多张
response = client.images.generate(
model="dall-e-2",
prompt="a white siamese cat sitting on a windowsill",
size="1024x1024", # 256x256 | 512x512 | 1024x1024
n=3, # 最多 10 张
response_format="url",
)
for i, img in enumerate(response.data):
print(f"图片 {i+1}: {img.url}")
11.5 图片编辑 (DALL-E 2 Only)
Inpainting:根据遮罩编辑图片指定区域。
def edit_image(image_path: str, mask_path: str, prompt: str) -> str:
"""编辑图片的指定区域"""
response = client.images.edit(
model="dall-e-2",
image=open(image_path, "rb"),
mask=open(mask_path, "rb"),
prompt=prompt,
size="1024x1024",
n=1,
)
return response.data[0].url
# 使用:在遮罩区域添加内容
url = edit_image(
image_path="original.png",
mask_path="mask.png", # 白色区域为编辑区域
prompt="在空白处添加一只蝴蝶",
)
遮罩 (Mask) 要求
| 属性 | 要求 |
|---|
| 格式 | PNG |
| 尺寸 | 与原图相同 |
| 编辑区域 | 白色(不透明) |
| 保留区域 | 透明(Alpha=0) |
11.6 图片变体 (DALL-E 2 Only)
def create_variation(image_path: str, n: int = 3) -> list[str]:
"""生成图片变体"""
response = client.images.create_variation(
model="dall-e-2",
image=open(image_path, "rb"),
n=n,
size="1024x1024",
)
return [img.url for img in response.data]
11.7 Prompt 工程技巧
DALL-E 3 Prompt 结构
[主体] + [风格] + [环境] + [光线] + [镜头] + [色调]
Prompt 示例对比
| 简单 Prompt | 优化 Prompt |
|---|
| “一只猫” | “一只橘色的虎斑猫坐在阳光明媚的窗台上,窗外是秋天的落叶,柔和的自然光,温暖色调,35mm摄影风格” |
| “城市夜景” | “上海外滩夜景全景,霓虹灯倒映在黄浦江中,长曝光摄影,冷暖色调对比,4K高清细节” |
| “产品图” | “白色无线耳机产品摄影,纯白背景,柔和阴影,商业摄影风格,85mm镜头” |
常用风格关键词
| 类型 | 关键词 |
|---|
| 艺术风格 | 油画、水彩、像素艺术、赛博朋克、浮世绘 |
| 摄影风格 | 微距、航拍、35mm胶片、人像、长曝光 |
| 渲染风格 | 3D渲染、等距、低多边形、卡通渲染 |
| 光线 | 柔光、硬光、逆光、霓虹灯、金色时段 |
| 色调 | 暖色调、冷色调、高对比、复古、淡雅 |
11.8 批量图片生成
import asyncio
from openai import AsyncOpenAI
async_client = AsyncOpenAI()
async def generate_batch(prompts: list[str]) -> list[str]:
"""批量生成图片"""
async def gen(prompt):
response = await async_client.images.generate(
model="dall-e-3",
prompt=prompt,
size="1024x1024",
quality="standard",
)
return response.data[0].url
tasks = [gen(p) for p in prompts]
return await asyncio.gather(*tasks)
# 使用
prompts = [
"未来城市的天际线",
"海底珊瑚礁的水下世界",
"火星上的第一个人类基地",
]
urls = asyncio.run(generate_batch(prompts))
for prompt, url in zip(prompts, urls):
print(f"{prompt}: {url}")
11.9 结合 Chat Completions 生成 Prompt
def generate_from_conversation(user_request: str) -> str:
"""用 GPT 优化 DALL-E prompt"""
# 第一步:GPT 优化 prompt
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是一个DALL-E prompt专家。将用户的简单描述转化为详细的英文图片生成prompt。只输出prompt文本。"},
{"role": "user", "content": user_request},
],
max_tokens=300,
)
optimized_prompt = response.choices[0].message.content
print(f"优化后的 prompt: {optimized_prompt}")
# 第二步:生成图片
image_response = client.images.generate(
model="dall-e-3",
prompt=optimized_prompt,
size="1024x1024",
quality="hd",
)
return image_response.data[0].url
url = generate_from_conversation("一只可爱的机器猫在弹吉他")
11.10 业务场景
| 场景 | 模型 | 质量 | 单张成本 |
|---|
| 社交媒体配图 | DALL-E 3 | standard | $0.04 |
| 产品宣传海报 | DALL-E 3 | hd | $0.08-$0.12 |
| UI 原型素材 | DALL-E 3 | standard | $0.04 |
| 游戏素材批量 | DALL-E 2 | standard | $0.016 |
| 图片局部修改 | DALL-E 2 | standard | $0.02 |
11.11 注意事项
- 内容政策:禁止生成名人、暴力、成人内容
- 版权:生成的图片可以商用,但注意内容合规
- Prompt 语言:DALL-E 3 对英文 prompt 效果最好
- 生成速度:通常 10-30 秒,HD 更慢
- 不可复现:相同 prompt 可能生成不同图片
- DALL-E 3 限制:单次只能生成 1 张,不支持编辑和变体
11.12 扩展阅读
下一章:12 - Moderation API — 内容审核、自定义分类。