|
import gradio as gr |
|
import requests |
|
from PIL import Image |
|
import io |
|
|
|
|
|
MODEL_INFO = { |
|
"None": "Default model (good for general purposes)", |
|
"stability": "Stability AI's Stable Diffusion (balanced quality)", |
|
"openjourney": "Midjourney-style images", |
|
"dreamlike": "Dreamlike photorealistic art", |
|
"protogen": "Sci-fi and futuristic styles", |
|
"sd14": "Stable Diffusion 1.4 (classic model)", |
|
"sd21": "Stable Diffusion 2.1 (improved details)", |
|
"kontext": "Context-aware generation", |
|
"gptimage": "GPT-assisted image generation", |
|
"anything": "Anime-style generation", |
|
"realistic": "Photorealistic outputs", |
|
"analog": "Film photography style", |
|
"arcanediffusion": "Fantasy art style", |
|
"dreamshaper": "Enhanced creative variations", |
|
"deliberate": "Precise prompt following", |
|
"revanimated": "Animated/cartoon styles", |
|
"meinamix": "Anime/portrait hybrid" |
|
} |
|
|
|
|
|
|
|
|
|
def get_models(): |
|
try: |
|
r = requests.get("https://image.pollinations.ai/models", timeout=10) |
|
models = [m.strip() for m in r.text.splitlines() if m.strip()] |
|
except: |
|
|
|
models = list(MODEL_INFO.keys()) |
|
|
|
|
|
for m in MODEL_INFO: |
|
if m not in models and m != "None": |
|
models.append(m) |
|
|
|
|
|
models = sorted(models) |
|
if "None" in models: |
|
models.remove("None") |
|
models.insert(0, "None") |
|
return models |
|
|
|
|
|
|
|
|
|
def generate_image(prompt, model): |
|
if model == "None": |
|
model = "" |
|
|
|
url = f"https://image.pollinations.ai/prompt/{prompt}?nologo=true&seed=random" |
|
if model: |
|
url += f"&model={model}" |
|
|
|
try: |
|
r = requests.get(url, timeout=30) |
|
r.raise_for_status() |
|
img = Image.open(io.BytesIO(r.content)) |
|
return img |
|
except Exception as e: |
|
raise gr.Error(f"Failed to generate image: {str(e)}") |
|
|
|
|
|
|
|
|
|
models = get_models() |
|
|
|
with gr.Blocks(theme="soft") as demo: |
|
gr.Markdown("""# Openimage |
|
### Select a model style that matches your desired output |
|
""") |
|
|
|
with gr.Row(): |
|
with gr.Column(scale=3): |
|
prompt_box = gr.Textbox( |
|
label="Prompt", |
|
placeholder="A cat wearing sunglasses on the moon...", |
|
lines=2 |
|
) |
|
|
|
|
|
model_dropdown = gr.Dropdown( |
|
choices=models, |
|
value="None", |
|
label="Model Style", |
|
info="Select a generation style", |
|
interactive=True, |
|
filterable=True, |
|
elem_classes="model-selector" |
|
) |
|
|
|
|
|
model_description = gr.Markdown(MODEL_INFO["None"]) |
|
|
|
|
|
def update_description(model): |
|
return MODEL_INFO.get(model, "No description available") |
|
|
|
model_dropdown.change( |
|
fn=update_description, |
|
inputs=model_dropdown, |
|
outputs=model_description |
|
) |
|
|
|
generate_btn = gr.Button("Generate", variant="primary") |
|
|
|
with gr.Column(scale=3): |
|
output_img = gr.Image(type="pil", label="Generated Image") |
|
|
|
generate_btn.click( |
|
fn=generate_image, |
|
inputs=[prompt_box, model_dropdown], |
|
outputs=output_img |
|
) |
|
|
|
if __name__ == "__main__": |
|
demo.launch() |