{"repo": "aaron-official/advanced-image-processing-suite", "files": {"app.py": {"e4da01af5a8d1778864d027078a9c6d8a72b6dd2": {"t": 1785674058.350138, "n": 23187, "h": "8efda7d7afc950de", "c": "import os\nfrom config.settings import (\n OPENAI_API_KEY, ANTHROPIC_API_KEY, REMOVE_BG_API_KEY, DEEPSEEK_API_KEY,\n GRADIO_SERVER_NAME, GRADIO_SERVER_PORT\n)\nfrom config.logging_config import setup_logging\nfrom src.image_processing import ImageProcessor\nfrom src.ai_image_generator import AIImageGenerator\nfrom src.background_removal import BackgroundRemover\nfrom src.image_analysis import ImageAnalysis\nfrom src.custom_filters import apply_custom_filter\nfrom src.resize_crop import resize_crop_image\nimport logging\nimport io\nimport zipfile\nimport tempfile\nfrom PIL import Image\n\nsetup_logging()\nlogger = logging.getLogger(__name__)\n\nimport gradio as gr\n\nSUPPORTED_FORMATS = [\n \"JPEG\", \"JPG\", \"PNG\", \"BMP\", \"TIFF\", \"TIF\", \"WEBP\", \"GIF\", \n \"ICO\", \"EPS\", \"PDF\", \"PSD\", \"SVG\", \"HEIC\", \"AVIF\", \"JXL\"\n]\nENHANCEMENT_OPTIONS = [\n \"AI Super Resolution\", \"Noise Reduction\", \"Color Enhancement\", \"Brightness/Contrast\", \"Sharpening\", \"HDR Effect\", \"Vintage Filter\", \"Black & White\", \"Sepia\", \"Vignette\", \"Blur Background\"\n]\n\nprocessor = ImageProcessor()\nai_generator = AIImageGenerator(openai_key=OPENAI_API_KEY, anthropic_key=ANTHROPIC_API_KEY)\nbg_remover = BackgroundRemover()\n\n# Restore AI_MODELS and BG_REMOVAL_SERVICES constants\nAI_MODELS = {\n \"OpenAI DALL-E 3\": \"dall-e-3\",\n \"OpenAI DALL-E 2\": \"dall-e-2\",\n \"Anthropic Claude (via API)\": \"claude-3-5-sonnet-20241022\",\n \"DeepSeek\": \"deepseek-chat\"\n}\nBG_REMOVAL_SERVICES = {\n \"Remove.bg\": \"removebg\",\n \"Removal.ai\": \"removelai\",\n \"Local rembg\": \"local\",\n \"Clipdrop\": \"clipdrop\"\n}\n\n# Custom CSS for better styling\ncustom_css = \"\"\"\n.gradio-container {\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n background: #f4f6fb;\n color: #222 !important;\n}\n.tab-nav {\n background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);\n}\n.tab-nav button {\n background: transparent !important;\n border: none !important;\n color: #fff !important;\n font-weight: 600 !important;\n font-size: 1.1rem !important;\n text-shadow: 0 1px 2px rgba(0,0,0,0.15);\n}\n.tab-nav button.selected {\n background: rgba(255,255,255,0.2) !important;\n border-radius: 8px !important;\n}\n.upload-container {\n border: 2px dashed #667eea;\n border-radius: 12px;\n padding: 20px;\n text-align: center;\n background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);\n color: #222 !important;\n font-size: 1.05rem;\n transition: all 0.3s ease;\n}\n.upload-container:hover {\n border-color: #764ba2;\n transform: translateY(-2px);\n box-shadow: 0 8px 25px rgba(102, 126, 234, 0.15);\n}\n.feature-card {\n background: #fff;\n border-radius: 12px;\n padding: 20px;\n box-shadow: 0 4px 15px rgba(0,0,0,0.1);\n margin: 10px 0;\n border-left: 4px solid #667eea;\n color: #222 !important;\n}\n.success-message {\n color: #22c55e;\n font-weight: 600;\n font-size: 1.05rem;\n}\n.error-message {\n color: #ef4444;\n font-weight: 600;\n font-size: 1.05rem;\n}\n.gr-textbox label, .gr-dropdown label, .gr-slider label, .gr-number label, .gr-checkbox label {\n color: #222 !important;\n font-weight: 600;\n font-size: 1.05rem;\n}\n.gr-textbox input, .gr-dropdown select, .gr-slider input, .gr-number input, .gr-checkbox input {\n color: #222 !important;\n background: #f8fafc !important;\n border-radius: 6px !important;\n border: 1px solid #c3cfe2 !important;\n font-size: 1.05rem;\n}\n.gr-button {\n font-size: 1.08rem !important;\n font-weight: 600 !important;\n}\n\"\"\"\n\n# Android icon sizes (density: size in px)\nANDROID_ICON_SIZES = {\n \"mdpi\": 48,\n \"hdpi\": 72,\n \"xhdpi\": 96,\n \"xxhdpi\": 144,\n \"xxxhdpi\": 192,\n}\n\ndef make_android_icons_zip(image: Image.Image) -> str:\n import tempfile\n with tempfile.NamedTemporaryFile(suffix=\".zip\", delete=False) as tmp:\n with zipfile.ZipFile(tmp, mode=\"w\") as zf:\n for density, size in ANDROID_ICON_SIZES.items():\n icon = image.resize((size, size), Image.LANCZOS)\n icon_bytes = io.BytesIO()\n icon.save(icon_bytes, format=\"PNG\")\n icon_bytes.seek(0)\n zf.writestr(f\"ic_launcher_{density}.png\", icon_bytes.read())\n return tmp.name # Return the file path for gr.File\n\n# Main Gradio Interface\nwith gr.Blocks(css=custom_css, title=\"🎨 Advanced Image Processing Suite\", theme=gr.themes.Soft()) as demo:\n \n gr.HTML(\"\"\"\n
Professional-grade image processing, AI generation, and enhancement tools
\n\n • Made with ❤️ & Gradio — by Aaron 🚀 • \n
\n