|
import torch |
|
import tkinter as tk |
|
from tkinter import filedialog, messagebox |
|
from PIL import Image, ImageTk |
|
from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler |
|
|
|
|
|
model_id = "runwayml/stable-diffusion-v1-5" |
|
device = "cuda" if torch.cuda.is_available() else "cpu" |
|
dtype = torch.float16 if device == "cuda" else torch.float32 |
|
|
|
print(f"Using device: {device.upper()}") |
|
|
|
pipeline = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=dtype) |
|
pipeline.safety_checker = None |
|
pipeline.scheduler = DPMSolverMultistepScheduler.from_config(pipeline.scheduler.config) |
|
pipeline = pipeline.to(device) |
|
pipeline.enable_attention_slicing() |
|
|
|
|
|
class RotonaGUI: |
|
def __init__(self, root): |
|
self.root = root |
|
self.root.title("Rotona - Unrestricted AI Image Generator") |
|
self.root.geometry("600x700") |
|
self.root.configure(bg="black") |
|
|
|
|
|
self.title_label = tk.Label(root, text="Rotona AI Generator", fg="red", bg="black", font=("Helvetica", 18, "bold")) |
|
self.title_label.pack(pady=10) |
|
|
|
|
|
self.prompt_label = tk.Label(root, text="Enter your prompt:", fg="white", bg="black", font=("Helvetica", 12)) |
|
self.prompt_label.pack() |
|
self.prompt_entry = tk.Entry(root, width=60) |
|
self.prompt_entry.pack(pady=5) |
|
|
|
|
|
self.generate_button = tk.Button(root, text="Generate Image", command=self.generate_image, bg="red", fg="white", font=("Helvetica", 12, "bold")) |
|
self.generate_button.pack(pady=10) |
|
|
|
|
|
self.canvas = tk.Canvas(root, width=512, height=512, bg="gray") |
|
self.canvas.pack(pady=10) |
|
|
|
|
|
self.save_button = tk.Button(root, text="Save Image", command=self.save_image, bg="blue", fg="white", font=("Helvetica", 12, "bold")) |
|
self.save_button.pack(pady=10) |
|
self.save_button["state"] = "disabled" |
|
|
|
self.generated_image = None |
|
|
|
def generate_image(self): |
|
user_prompt = self.prompt_entry.get() |
|
if not user_prompt: |
|
messagebox.showerror("Error", "Please enter a prompt!") |
|
return |
|
|
|
try: |
|
negative_prompt = "blurry, distorted, bad anatomy, missing fingers, extra limbs, bad proportions, deformed hands, low quality" |
|
image = pipeline(user_prompt, negative_prompt=negative_prompt, guidance_scale=7.5, num_inference_steps=50).images[0] |
|
|
|
self.generated_image = image |
|
self.display_image(image) |
|
self.save_button["state"] = "normal" |
|
|
|
except torch.cuda.OutOfMemoryError: |
|
messagebox.showerror("Error", "Out of GPU memory! Try reducing image size.") |
|
except Exception as e: |
|
messagebox.showerror("Error", f"Image generation failed: {e}") |
|
|
|
def display_image(self, image): |
|
image.thumbnail((512, 512)) |
|
img_tk = ImageTk.PhotoImage(image) |
|
self.canvas.create_image(256, 256, image=img_tk) |
|
self.canvas.image = img_tk |
|
|
|
def save_image(self): |
|
if self.generated_image: |
|
file_path = filedialog.asksaveasfilename(defaultextension=".png", filetypes=[("PNG files", "*.png")]) |
|
if file_path: |
|
self.generated_image.save(file_path) |
|
messagebox.showinfo("Saved", f"Image saved successfully as {file_path}") |
|
|
|
|
|
root = tk.Tk() |
|
app = RotonaGUI(root) |
|
root.mainloop() |
|
|