唠嗑

又好久好久没写博客了,我又忘记怎么排版了,笑死,调用DALL-E画图倒是很简单,也不用多说,不过目前DALL-E还不支持图生图,我平常都是放一张图片给gpt-4o分析后,再让它重新画的,能有点相似度,这里只放怎么调用DALL-E。


通过调用openai库来实现

代码

import openai
import requests
import os
from datetime import datetime

# 设置 API 密钥和基础 URL
API_KEY = ''
API_BASE = ''

# 配置 OpenAI
openai.api_key = API_KEY
openai.api_base = API_BASE

def generate_image(prompt, size="1024x1024", quality="standard", n=1):
    """
    使用 DALL-E 3 生成图像
    :param prompt: 图像描述提示
    :param size: 图像尺寸 ("1024x1024", "1792x1024", or "1024x1792")
    :param quality: 图像质量 ("standard" or "hd")
    :param n: 生成图像的数量
    :return: 生成的图像文件路径列表
    """
    try:
        # 获取当前脚本所在目录并创建输出目录
        current_dir = os.path.dirname(os.path.abspath(__file__))
        output_dir = os.path.join(current_dir, 'generated_images')
        os.makedirs(output_dir, exist_ok=True)

        # 调用 DALL-E 3 API
        response = openai.Image.create(
            model="dall-e-3",  # 使用 DALL-E 3 模型
            prompt=prompt,
            size=size,
            quality=quality,
            n=n
        )

        print("数据结构:", response)

        # 保存生成的图像
        image_files = []
        for i, image_data in enumerate(response['data']):
            image_url = image_data['url']
            
            # 下载图像
            image_response = requests.get(image_url)
            if image_response.status_code == 200:
                # 生成唯一的文件名
                timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
                filename = f"dalle3_image_{timestamp}_{i}.png"
                filepath = os.path.join(output_dir, filename)
                
                # 保存图像
                with open(filepath, 'wb') as f:
                    f.write(image_response.content)
                image_files.append(filepath)
                print(f"图像已保存: {filepath}")

        return image_files

    except Exception as e:
        print(f"生成图像时发生错误: {str(e)}")
        return None

def main():
    print("欢迎使用 DALL-E 3 图像生成器!")
    print("可用的图像尺寸: 1024x1024, 1792x1024, 1024x1792")
    print("图像质量选项: standard, hd")

    prompt = input("\n请输入图像描述(输入 'exit' 退出): ")
    if prompt.lower() == 'exit':
        return

    size = input("请选择图像尺寸 (默认 1024x1024): ") or "1024x1024"
    quality = input("请选择图像质量 (默认 standard): ") or "standard"
    n = int(input("生成图像数量 (默认 1): ") or "1")

    try:
        image_files = generate_image(prompt, size, quality, n)
        if image_files:
            print("\n成功生成以下图像:")
            for file in image_files:
                print(f"- {file}")
        else:
            print("生成图像失败")
    except Exception as e:
        print(f"发生错误: {str(e)}")


if __name__ == "__main__":
    main()

调用API实现


代码

import requests
import os
from datetime import datetime

# 设置 API 密钥和基础 URL
API_KEY = ''
API_BASE = ''

def generate_image(prompt, size="1024x1024", quality="standard", n=1):
    """
    使用 DALL-E 3 生成图像
    :param prompt: 图像描述提示
    :param size: 图像尺寸 ("1024x1024", "1792x1024", or "1024x1792")
    :param quality: 图像质量 ("standard" or "hd")
    :param n: 生成图像的数量
    :return: 生成的图像文件路径列表
    """
    try:
        # 获取当前脚本所在目录并创建输出目录
        current_dir = os.path.dirname(os.path.abspath(__file__))
        output_dir = os.path.join(current_dir, 'generated_images')
        os.makedirs(output_dir, exist_ok=True)

        # 调用 DALL-E 3 API
        headers = {
            "Content-Type": "application/json",
            "Authorization": f"Bearer {API_KEY}"
        }
        
        payload = {
            "model": "dall-e-3", # 使用的模型
            "prompt": prompt, # 提示词
            "size": size, # 尺寸 
            "quality": quality, # 生成的质量
            "n": n # 生成的图像数量
        }
        
        response = requests.post(
            f"{API_BASE}/images/generations",
            headers=headers,
            json=payload
        )
        print("API响应:", response)

        if response.status_code != 200:
            print(f"API错误: {response.status_code}")
            print(f"错误信息: {response.text}")
            return None

        response_data = response.json()
        print("数据结构:", response_data)

        # 保存生成的图像
        image_files = []
        for i, image_data in enumerate(response_data['data']):
            image_url = image_data['url']
            
            # 下载图像
            image_response = requests.get(image_url)
            if image_response.status_code == 200:
                # 生成唯一的文件名
                timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
                filename = f"dalle3_image_{timestamp}_{i}.png"
                filepath = os.path.join(output_dir, filename)
                
                # 保存图像
                with open(filepath, 'wb') as f:
                    f.write(image_response.content)
                image_files.append(filepath)
                print(f"图像已保存: {filepath}")

        return image_files

    except Exception as e:
        print(f"生成图像时发生错误: {str(e)}")
        return None

def main():
    print("欢迎使用 DALL-E 3 图像生成器!")
    print("可用的图像尺寸: 1024x1024, 1792x1024, 1024x1792")
    print("图像质量选项: standard, hd")

    prompt = input("\n请输入图像描述(输入 'exit' 退出): ")
    if prompt.lower() == 'exit':
        return

    size = input("请选择图像尺寸 (默认 1024x1024): ") or "1024x1024"
    quality = input("请选择图像质量 (默认 standard): ") or "standard"
    n = int(input("生成图像数量 (默认 1): ") or "1")

    try:
        image_files = generate_image(prompt, size, quality, n)
        if image_files:
            print("\n成功生成以下图像:")
            for file in image_files:
                print(f"- {file}")
        else:
            print("生成图像失败")
    except Exception as e:
        print(f"发生错误: {str(e)}")

if __name__ == "__main__":
    main()

效果

笑死了这个出图,它可能认为兔子不应该追着老虎?

dalle3_image_20241112_154018_0-gkah.png


响应数据结构

{
    # 创建时间戳(Unix时间戳格式)
    'created': 1731397770,
    
    # 生成的图像数据数组
    'data': [
        {
            # DALL-E可能对你的提示词进行修改后的版本
            'revised_prompt': 'A cute rabbit is chasing a tiger.',
            
            # 生成图像的临时URL(有效期限制)
            'url': 'https://dalleproduse.blob.core.windows.net/private/images/31e88f89-c74d-4080-ab7b-f385a3ec8ab9/generated_00.png?se=2024-11-13T07%3A49%3A39Z&sig=2yU9N9sULo0v2tGTAIOxWWN9fqiDXrn7fkJqg8nQ3CI%3D&ske=2024-11-19T06%3A04%3A27Z&skoid=09ba021e-c417-441c-b203-c81e5dcd7b7f&sks=b&skt=2024-11-12T06%3A04%3A27Z&sktid=33e01921-4d64-4f8c-a055-5bdaffd5e33d&skv=2020-10-02&sp=r&spr=https&sr=b&sv=2020-10-02'
        }
    ]
}

再跑了一张