import os import tempfile import gradio as gr from PIL import Image from core import Colorizer # Initialize global colorizer colorizer = Colorizer() def process_image( img_path: str, brightness: float, contrast: float, edge_enhance: bool, output_format: str, quality: str, progress=gr.Progress() ): if img_path is None: return None, None progress(0, desc="Loading image...") # Load input try: img = Image.open(img_path).convert("RGB") except Exception as e: print(f"Error loading image: {e}") return None, None # Map quality to resolution quality_map = { "Fast (256px)": 256, "Balanced (512px)": 512, "High (1080px)": 1080, "Original": 0 } res = quality_map.get(quality, 512) progress(0.3, desc="Colorizing & Enhancing...") # Process using Core Logic (In-Memory) enhanced_img = colorizer.process( img, brightness=brightness, contrast=contrast, edge_enhance=edge_enhance, adaptive_resolution=res ) progress(0.9, desc="Saving outputs...") # Save outputs for Gradio # 1. Enhanced image for gallery temp_dir = tempfile.mkdtemp() enhanced_path = os.path.join(temp_dir, "enhanced.png") enhanced_img.save(enhanced_path) # 2. Downloadable file filename = f"colorized_image.{output_format.lower()}" output_path = os.path.join(temp_dir, filename) enhanced_img.save(output_path, format=output_format.upper()) progress(1.0, desc="Done!") # Return side-by-side (original, enhanced) and the downloadable file return ([img_path, enhanced_path], output_path) # CSS to give a modern, centered layout with a colored header and clean panels custom_css = """ /* Overall background */ body { background-color: #f0f2f5; } /* Center the Gradio container and give it a max width */ .gradio-container { max-width: 900px !important; margin: auto !important; } /* Header styling */ #header { background-color: #4CAF50; padding: 20px; border-radius: 8px; text-align: center; margin-bottom: 20px; } #header h2 { color: white; margin: 0; font-size: 2rem; } #header p { color: white; margin: 5px 0 0 0; font-size: 1rem; } /* White panel for controls */ #control-panel { background-color: white; padding: 20px; border-radius: 8px; box-shadow: 0px 2px 8px rgba(0,0,0,0.1); margin-bottom: 20px; } /* Style the “Colorize” button */ #submit-btn { background-color: #4CAF50 !important; color: white !important; border-radius: 8px !important; font-weight: bold; padding: 10px 20px !important; margin-top: 10px !important; } /* Add some spacing around sliders and checkbox */ #control-panel .gr-row { gap: 15px; } .gr-slider, .gr-checkbox, .gr-dropdown { margin-top: 10px; } /* Gallery panel styling */ #comparison_gallery { background-color: white; padding: 10px; border-radius: 8px; box-shadow: 0px 2px 8px rgba(0,0,0,0.1); } /* Download button spacing */ #download-btn { margin-top: 15px !important; } """ TITLE = "🌈 Color Restorization Model" DESCRIPTION = "Bring your old black & white photos back to life—upload, adjust, and download in vivid color." with gr.Blocks(title=TITLE) as app: # Header section gr.HTML( """
Bring your old black & white photos back to life—upload, adjust, and download in vivid color.