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

OpenAI API 接口对接完全教程 / 11 - DALL-E 图片生成

第 11 章 · DALL-E 图片生成 API

DALL-E 系列模型可以根据文本描述生成、编辑和变体化图片。本章详解图片生成、编辑和变体操作。


11.1 模型对比

特性DALL-E 2DALL-E 3
Model IDdall-e-2dall-e-3
最大分辨率1024×10241024×1792
图片质量standardstandard / hd
单次生成数1-101
编辑 (Inpainting)
变体生成
价格$0.016-0.020/张$0.04-0.12/张
Prompt 理解较弱更强、更精准

DALL-E 3 分辨率与定价

分辨率质量价格
1024×1024standard$0.04
1024×1792 / 1792×1024standard$0.08
1024×1024hd$0.08
1024×1792 / 1792×1024hd$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 3standard$0.04
产品宣传海报DALL-E 3hd$0.08-$0.12
UI 原型素材DALL-E 3standard$0.04
游戏素材批量DALL-E 2standard$0.016
图片局部修改DALL-E 2standard$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 — 内容审核、自定义分类。