Spaces:
Running
Running
| import gradio as gr | |
| from PIL import Image, ImageEnhance, ImageOps | |
| import numpy as np | |
| # Styling presets for prompt expansion | |
| STYLES = { | |
| "None (Pass-through)": "{prompt}", | |
| "Photorealistic": "{prompt}, macro photography, extremely shallow depth of field, sharp focus, natural lighting, high-contrast minimal composition, warm skin tones, cinematic color palette, shot on 85mm lens, 8k resolution, photorealistic", | |
| "3D Toy Figure": "3D rendered matte {prompt} toy figure, stylized round anthropomorphic shape, smooth vinyl texture, studio lighting, solid vibrant background, high contrast, minimal composition, octane render, raytracing, 3d art", | |
| "Anime / Manga": "highly detailed digital painting of {prompt}, anime key art style, vibrant color palette, dynamic lighting, beautiful eyes, dramatic angle, concept art aesthetic, studio ghibli or makoto shinkai style", | |
| "Cyberpunk": "retro-futuristic cyberpunk style {prompt}, neon glow, wet streets with reflections, holographic details, cinematic lighting, dark atmosphere, blade runner aesthetic, highly detailed, 8k", | |
| "Ligne Claire / Minimalist": "minimalist flat-color illustration of {prompt}, clean lines, delicate paper texture, vast negative space, high-angle perspective, harmonious color palette, ligne claire style, modern vector graphic", | |
| "Surreal Oil Painting": "surreal dreamlike painting of {prompt}, thick impasto oil paint texture, visible coarse brushstrokes, rich color blending, atmospheric lighting, masterpiece, gallery quality" | |
| } | |
| def enhance_prompt(prompt: str = "immense rocket launch exhaust as seen from extremely close up", style: str = "None (Pass-through)") -> str: | |
| """ | |
| Enhance a base prompt with descriptive style templates. | |
| """ | |
| if not prompt: | |
| return "immense rocket launch exhaust as seen from extremely close up" | |
| template = STYLES.get(style, "{prompt}") | |
| return template.replace("{prompt}", prompt) | |
| def apply_filter(image: Image.Image, filter_type: str = "None") -> Image.Image: | |
| """ | |
| Apply a PIL-based aesthetic filter to the input image. | |
| """ | |
| if image is None: | |
| return None | |
| # Ensure it is a PIL Image | |
| if not isinstance(image, Image.Image): | |
| try: | |
| image = Image.fromarray(np.array(image).astype('uint8'), 'RGB') | |
| except Exception: | |
| return image | |
| # Convert to RGB if not already | |
| if image.mode != "RGB": | |
| image = image.convert("RGB") | |
| if filter_type == "None": | |
| return image | |
| elif filter_type == "Black & White": | |
| return ImageOps.grayscale(image) | |
| elif filter_type == "Sepia / Vintage": | |
| # Vintage sepia filter | |
| width, height = image.size | |
| pixels = image.load() | |
| for py in range(height): | |
| for px in range(width): | |
| r, g, b = pixels[px, py] | |
| tr = int(0.393 * r + 0.769 * g + 0.189 * b) | |
| tg = int(0.349 * r + 0.686 * g + 0.168 * b) | |
| tb = int(0.272 * r + 0.534 * g + 0.131 * b) | |
| pixels[px, py] = (min(tr, 255), min(tg, 255), min(tb, 255)) | |
| return image | |
| elif filter_type == "High Contrast": | |
| enhancer = ImageEnhance.Contrast(image) | |
| return enhancer.enhance(1.6) | |
| elif filter_type == "Cool / Cyberpunk": | |
| # Enhance blue/cyan, lower red | |
| r, g, b = image.split() | |
| r = r.point(lambda i: i * 0.8) | |
| b = b.point(lambda i: min(255, int(i * 1.3))) | |
| return Image.merge("RGB", (r, g, b)) | |
| elif filter_type == "Warm / Golden Hour": | |
| # Enhance red/yellow | |
| r, g, b = image.split() | |
| r = r.point(lambda i: min(255, int(i * 1.25))) | |
| g = g.point(lambda i: min(255, int(i * 1.1))) | |
| b = b.point(lambda i: i * 0.8) | |
| return Image.merge("RGB", (r, g, b)) | |
| return image | |
| # Initialize the Gradio Workflow, binding our custom nodes | |
| gr.Workflow( | |
| graph="workflow.json", | |
| bind={ | |
| "Enhance Prompt": enhance_prompt, | |
| "Apply Filter": apply_filter | |
| } | |
| ).launch() | |