强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

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 注意事项

  1. 内容政策:禁止生成名人、暴力、成人内容
  2. 版权:生成的图片可以商用,但注意内容合规
  3. Prompt 语言:DALL-E 3 对英文 prompt 效果最好
  4. 生成速度:通常 10-30 秒,HD 更慢
  5. 不可复现:相同 prompt 可能生成不同图片
  6. DALL-E 3 限制:单次只能生成 1 张,不支持编辑和变体

11.12 扩展阅读


下一章12 - Moderation API — 内容审核、自定义分类。