Spaces:
Sleeping
Sleeping
File size: 5,189 Bytes
dc4fc93 dd92272 dc4fc93 dd92272 dc4fc93 dd92272 dc4fc93 dd92272 dc4fc93 dd92272 d070dfc dd92272 dc4fc93 dd92272 dc4fc93 dd92272 dc4fc93 dd92272 dc4fc93 dd92272 dc4fc93 dd92272 dc4fc93 d070dfc dc4fc93 d070dfc dc4fc93 d070dfc dc4fc93 dd92272 d070dfc dd92272 d070dfc dd92272 d070dfc dd92272 d070dfc dc4fc93 dd92272 dc4fc93 d070dfc dc4fc93 d070dfc dc4fc93 d070dfc dc4fc93 d070dfc dc4fc93 dd92272 dc4fc93 d070dfc dc4fc93 d070dfc dd92272 dc4fc93 dd92272 d070dfc dc4fc93 d070dfc dc4fc93 d070dfc dd92272 dc4fc93 d070dfc dd92272 d070dfc dc4fc93 d070dfc dc4fc93 d070dfc bc17174 dc4fc93 d070dfc dc4fc93 d070dfc dd92272 d070dfc dd92272 d070dfc dc4fc93 dd92272 d070dfc dd92272 dc4fc93 dd92272 dc4fc93 dd92272 dc4fc93 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
import gradio as gr
from PIL import Image, ImageEnhance, ImageDraw
import os
# --- 1. Processing Logic (Updated with Preview) ---
def process_image(image, split_count, should_enhance, format_type):
if image is None: return None, None # Return 2 nones (Preview & Gallery)
# A. Enhancement
if should_enhance:
enhancer = ImageEnhance.Sharpness(image)
image = enhancer.enhance(1.5)
contrast = ImageEnhance.Contrast(image)
image = contrast.enhance(1.1)
img_width, img_height = image.size
split_width = img_width // int(split_count)
output_files = []
# B. Creating the "Insta-Preview" (Stitching parts together)
# Hum parts ko wapas jod kar dikhayenge taaki user ko 'Seamless' feel aaye
preview_img = Image.new('RGB', (img_width, img_height))
if not os.path.exists("outputs"): os.makedirs("outputs")
for i in range(int(split_count)):
left = i * split_width
right = (i + 1) * split_width
# Crop
part = image.crop((left, 0, right, img_height))
# Transparency Fix
if part.mode in ('RGBA', 'LA') or (part.mode == 'P' and 'transparency' in part.info):
part = part.convert('RGB')
# Save for Gallery
ext = "png" if format_type == "PNG (HQ)" else "jpg"
save_path = f"outputs/ts_part_{i+1}.{ext}"
part.save(save_path, quality=95)
output_files.append(save_path)
# Add to Preview (Paste side by side)
preview_img.paste(part, (left, 0))
return preview_img, output_files
# --- 2. New Premium Lighting CSS (SAME AS YOURS) ---
custom_css = """
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;900&display=swap');
body, .gradio-container {
font-family: 'Inter', sans-serif !important;
background: #0a0a0a !important; /* Deep Dark Background */
color: #ffffff !important;
}
/* The Main Card with Lighting Effect */
#main_card {
background: rgba(30, 30, 40, 0.8);
backdrop-filter: blur(30px);
-webkit-backdrop-filter: blur(30px);
border: 1px solid rgba(255, 255, 255, 0.15);
border-radius: 30px;
padding: 50px;
box-shadow: 0 0 50px rgba(100, 200, 255, 0.15), inset 0 0 20px rgba(255, 255, 255, 0.05);
max-width: 1100px;
margin: 40px auto;
}
/* New TS Logo Style */
#logo_text h1 {
color: #ffffff;
font-size: 5rem !important;
font-weight: 900;
text-align: center;
margin-bottom: 0px;
letter-spacing: -2px;
text-shadow: 0 0 25px rgba(150, 220, 255, 0.8);
}
#subtitle_text h3 {
text-align: center;
color: #bbbbbb;
font-size: 1.3rem;
font-weight: 400;
margin-top: 15px;
margin-bottom: 50px;
letter-spacing: 1px;
}
/* Input Controls Styling */
.block, .svelte-12cmxck, .form {
background: rgba(255,255,255,0.03) !important;
border: 1px solid rgba(255,255,255,0.1) !important;
border-radius: 20px !important;
padding: 20px !important;
}
.gradio-row { gap: 25px !important; flex-wrap: wrap; }
label span { color: #fff !important; font-weight: 600; font-size: 1rem;}
/* The Button - Glowing */
.primary-btn {
background: linear-gradient(135deg, #ffffff, #d0d0d0) !important;
color: #000 !important;
border: none !important;
font-size: 1.3rem !important;
font-weight: 900 !important;
padding: 20px !important;
border-radius: 20px !important;
box-shadow: 0 0 30px rgba(255, 255, 255, 0.3);
transition: all 0.3s ease;
}
.primary-btn:hover {
transform: translateY(-3px);
box-shadow: 0 0 50px rgba(255, 255, 255, 0.5);
}
"""
# --- 3. Spacious Interface Structure ---
with gr.Blocks(css=custom_css, theme=gr.themes.Soft()) as app:
with gr.Column(elem_id="main_card"):
gr.Markdown("# TS", elem_id="logo_text")
gr.Markdown("### PREMIUM CAROUSEL STUDIO", elem_id="subtitle_text")
with gr.Row():
# Left Side (Inputs)
with gr.Column(scale=1):
inp_img = gr.Image(type="pil", label="1. Drop Your Wide Image", sources=["upload", "clipboard"], height=300)
with gr.Column():
slider = gr.Slider(2, 5, value=3, step=1, label="2. How many parts?")
with gr.Row():
enhance_opt = gr.Checkbox(label="Magic Enhance", value=True)
fmt_opt = gr.Radio(["JPG", "PNG (HQ)"], label="Format", value="JPG")
btn = gr.Button("⚡ GENERATE & PREVIEW", variant="primary", elem_classes=["primary-btn"])
# Right Side (Output - Now with Preview)
with gr.Column(scale=1.5):
# Ye hai wo naya FEATURE:
preview_out = gr.Image(label="📱 Insta-Preview (Check Seamless Look)", interactive=False)
out_gal = gr.Gallery(label="⬇️ Download Parts Here", columns=3, height="auto", object_fit="contain")
# Connect both outputs (Preview + Gallery)
btn.click(process_image, inputs=[inp_img, slider, enhance_opt, fmt_opt], outputs=[preview_out, out_gal])
app.launch()
|