探索OpenAI DALL·E的魔力 – 用Python打开图像生成的新世界

本文介绍了一个基于Python和Tkinter的图像生成应用,利用DALL·E模型生成创意图片,通过多线程提高响应性,展示了深度学习在生成艺术中的应用。
摘要由CSDN通过智能技术生成

随着人工智能领域的不断发展,OpenAI的DALL·E模型引起了广泛关注。本文将深入介绍一个使用DALL·E模型的图像生成应用,采用Python编写,利用Tkinter实现用户界面,并通过多线程处理提高响应性。

DALL·E模型简介

DALL·E模型是一种生成模型,通过学习图像和描述性文本之间的关系,能够根据用户提供的文字提示生成创意丰富的图像。深度学习和神经网络技术使计算机能够理解并生成与语言相关的视觉内容。

 

Python源码:

import tkinter as tk
from tkinter import ttk
import openai  #pip install openai==0.28.0
import random
import json
from PIL import Image, ImageTk
from io import BytesIO
import requests
import threading

class ImageGenerationApp:
    def __init__(self, root):
        self.root = root
        self.root.title("Dalle Paint")

        # 注册窗口关闭事件
        root.protocol("WM_DELETE_WINDOW", self.on_closing)

        # 设置默认参数
        self.model_var = tk.StringVar(value="dall-e-2")
        self.prompt_var = tk.StringVar()
        self.size_var = tk.StringVar(value="512x512")
        self.n_var = tk.StringVar(value="1")
        self.quality_var = tk.StringVar(value="standard")
        self.style_var = tk.StringVar(value="vivid")
        self.api_key_var = tk.StringVar()
        self.proxy_var = tk.StringVar(value="https://api.openai-proxy.com/v1")  # 默认代理网址

        # 图片列表和当前显示的图片索引
        self.image_paths = []
        self.current_image_index = 0

        # 加载配置
        self.load_config()

        # 创建左右两个框架
        self.left_frame = tk.Frame(root)
        self.right_frame = tk.Frame(root)
        self.left_frame.grid(row=0, column=0, padx=5, pady=5, sticky="nsew")
        self.right_frame.grid(row=0, column=1, padx=5, pady=5, sticky="nsew")
        # 设置列比例
        self.root.columnconfigure(0, weight=2)
        self.root.columnconfigure(1, weight=8)
        # 创建界面元素
        self.create_widgets()

    def create_widgets(self):
        # 左侧框架部件
        model_label = ttk.Label(self.left_frame, text="Model:")
        model_combobox = ttk.Combobox(self.left_frame, textvariable=self.model_var, values=["dall-e-2", "dall-e-3"], state="readonly")

        prompt_label = ttk.Label(self.left_frame, text="Prompt:")
        prompt_entry = ttk.Entry(self.left_frame, textvariable=self.prompt_var, width=24)

        size_label = ttk.Label(self.left_frame, text="Size:")
        size_combobox = ttk.Combobox(self.left_frame, textvariable=self.size_var, values=["256x256", "512x512", "1024x1024", "1792x1024", "1024x1792"], state="readonly")

        n_label = ttk.Label(self.left_frame, text="Number(1-10):")
        n_entry = ttk.Entry(self.left_frame, textvariable=self.n_var)

        quality_label = ttk.Label(self.left_frame, text="Quality:")
        quality_combobox = ttk.Combobox(self.left_frame, textvariable=self.quality_var, values=["standard", "hd"], state="readonly")

        style_label = ttk.Label(self.left_frame, text="Style:")
        style_combobox = ttk.Combobox(self.left_frame, textvariable=self.style_var, values=["vivid", "natural"], state="readonly")

        api_key_label = ttk.Label(self.left_frame, text="API Key(s):")
        api_key_entry = ttk.Entry(self.left_frame, textvariable=self.api_key_var)

        proxy_label = ttk.Label(self.left_frame, text="Proxy:")
        proxy_entry = ttk.Entry(self.left_frame, textvariable=self.proxy_var)

        generate_button = ttk.Button(self.left_frame, text="生成图片", command=self.generate_image)

        # 在左侧框架布局部件
        model_label.grid(row=0, column=0, sticky="e", pady=20)
        model_combobox.grid(row=0, column=1, padx=5, pady=20, sticky="w")
        prompt_label.grid(row=1, column=0, sticky="e", pady=20)
        prompt_entry.grid(row=1, column=1, padx=5, pady=20, sticky="w")
        size_label.grid(row=2, column=0, sticky="e", pady=20)
        size_combobox.grid(row=2, column=1, padx=5, pady=20, sticky="w")
        n_label.grid(row=3, column=0, sticky="e", pady=20)
        n_entry.grid(row=3, column=1, padx=5, pady=20, sticky="w")
        quality_label.grid(row=4, column=0, sticky="e", pady=20)
        quality_combobox.grid(row=4, column=1, padx=5, pady=20, sticky="w")
        style_label.grid(row=5, column=0, sticky="e", pady=20)
        style_combobox.grid(row=5, column=1, padx=5, pady=20, sticky="w")
        api_key_label.grid(row=6, column=0, sticky="e", pady=5)
        api_key_entry.grid(row=6, column=1, padx=5, pady=20, sticky="w")
        proxy_label.grid(row=7, column=0, sticky="e", pady=5)
        proxy_entry.grid(row=7, column=1, padx=5, pady=20, sticky="w")
        generate_button.grid(row=8, column=0, columnspan=2, pady=30)

        # 右侧框架部件
        prev_button = ttk.Button(self.right_frame, text="< Prev", command=self.show_previous_image)
        next_button = ttk.Button(self.right_frame, text="Next >", command=self.show_next_image)
        self.image_label = tk.Label(self.right_frame)

        # 在右侧框架布局部件
        prev_button.grid(row=0, column=0, padx=5, pady=5)
        next_button.grid(row=0, column=1, padx=5, pady=5)
        self.image_label.grid(row=1, column=1, rowspan=9, padx=10, pady=10)

        # 设置风格
        style = ttk.Style(self.root)
        style.theme_use("clam")
        style.configure("TLabel", background="sky blue")
        style.configure("TCombobox", background="light blue")  # 修改此行为浅蓝色
        style.configure("TEntry", background="light blue")  # 修改此行为浅蓝色
        style.configure("TButton", background="sky blue")

    def generate_image(self):
        model = self.model_var.get()
        prompt = self.prompt_var.get()
        size = self.size_var.get()
        n = int(self.n_var.get())
        quality = self.quality_var.get()
        style = self.style_var.get()
        api_keys = self.api_key_var.get().split(",")
        proxy = self.proxy_var.get()

        openai.api_key = random.choice(api_keys)
        openai.api_base = proxy  # 设置代理

        params = {
            "model": model,
            "prompt": prompt,
            "n": n,
            "size": size,
            "quality": quality,
            "style": style
        }

        threading.Thread(target=self.process_image_generation, args=(params,)).start()

    def process_image_generation(self, params):
        try:
            response = openai.Image.create(**params)
            self.image_paths = [image['url'] for image in response['data']]
            for i, image_path in enumerate(self.image_paths):
                prompt = self.prompt_var.get()
                self.save_image(image_path, f"{prompt}_{i}.jpg")
            self.show_image(0)
            self.save_config()
        except Exception as e:
            print(f"Error during image generation: {e}")

    def show_image(self, index):
        if 0 <= index < len(self.image_paths):
            img = Image.open(self.load_image(self.image_paths[index]))
            # 图像大小调整
            img = img.resize((512, 512))
            tk_img = ImageTk.PhotoImage(img)
            self.image_label.config(image=tk_img)
            self.image_label.photo = tk_img
            self.current_image_index = index

    def show_previous_image(self):
        if self.current_image_index > 0:
            self.show_image(self.current_image_index - 1)

    def show_next_image(self):
        if self.current_image_index < len(self.image_paths) - 1:
            self.show_image(self.current_image_index + 1)

    def save_image(self, image_url, file_name):
        response = requests.get(image_url)
        image_content = response.content
        with open(file_name, "wb") as image_file:
            image_file.write(image_content)

    def load_image(self, image_url):
        response = requests.get(image_url)
        image_content = response.content
        image = Image.open(BytesIO(image_content))
        prompt = self.prompt_var.get()
        temp_path = f"{prompt}_{self.current_image_index}.jpg"  # 修改图片命名为prompt+i
        image.save(temp_path, "JPEG")
        return temp_path

    def save_config(self):
        config = {
            "model": self.model_var.get(),
            "prompt": self.prompt_var.get(),
            "size": self.size_var.get(),
            "n": self.n_var.get(),
            "quality": self.quality_var.get(),
            "style": self.style_var.get(),
            "api_keys": self.api_key_var.get(),
            "proxy": self.proxy_var.get()
        }
        with open("dalle-config.json", "w") as config_file:
            json.dump(config, config_file)

    def load_config(self):
        try:
            with open("dalle-config.json", "r") as config_file:
                config = json.load(config_file)
                self.model_var.set(config.get("model", ""))
                self.prompt_var.set(config.get("prompt", ""))
                self.size_var.set(config.get("size", ""))
                self.n_var.set(config.get("n", ""))
                self.quality_var.set(config.get("quality", ""))
                self.style_var.set(config.get("style", ""))
                self.api_key_var.set(config.get("api_keys", ""))
                self.proxy_var.set(config.get("proxy", ""))
        except FileNotFoundError:
            self.save_config()

    def on_closing(self):
        # 窗口关闭时保存配置
        self.save_config()
        self.root.destroy()


if __name__ == "__main__":
    root = tk.Tk()
    app = ImageGenerationApp(root)
    root.geometry("888x600")
    root.resizable(False, False)
    root.mainloop()

图像生成应用概述

该图像生成应用使用Tkinter创建直观的用户界面,用户可以选择模型、输入文字提示、指定图像大小和数量等参数,通过简单的操作即可生成高质量图像。Tkinter作为Python的GUI工具包,为用户提供了良好的交互体验。

关键组件和功能

  • 用户界面:选择模型、输入文字提示、设置图像大小、数量等参数。
  • 图像展示:通过上一页和下一页按钮浏览生成的图像,提供直观的导航。
  • 多线程处理:采用多线程处理,确保图像生成的耗时操作不影响应用程序的响应性。
  • 保存配置:在用户关闭窗口时自动保存当前配置,方便下次使用。

技术概念

  • Tkinter:Python内置的GUI工具包,用于创建用户界面元素。
  • 多线程处理:通过多线程确保图像生成过程不阻塞用户界面,提高应用程序性能。

软件脚本:

Dalle Paint(无需梯子,可直接使用!!!)icon-default.png?t=N7T8https://pan.baidu.com/s/1EHNBWbtMcuIK_BS_qUZN8g?pwd=6666

Dalle3-图片展示:

Dalle3-图片展示icon-default.png?t=N7T8https://pan.baidu.com/share/init?surl=zSxedE6qrlG-MWryMleFqQ&pwd=6666

结语

通过这个应用程序,用户能够深入了解DALL·E模型的强大功能,同时体验到Python、Tkinter和多线程处理的结合应用。这不仅是一个有趣的实践项目,也展示了OpenAI在人工智能领域的领先地位。通过不断探索和应用先进技术,我们能够更好地理解人工智能的潜力,并为未来的创新贡献一份力量。

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值