import gradio as gr import threading from util import process_image_edit, check_nsfw, get_country_info_safe IP_Dict = {} def edit_image_interface(input_image, prompt, request: gr.Request, progress=gr.Progress()): """ Interface function for processing image editing """ # 提取用户IP client_ip = request.client.host x_forwarded_for = dict(request.headers).get('x-forwarded-for') if x_forwarded_for: client_ip = x_forwarded_for if client_ip not in IP_Dict: IP_Dict[client_ip] = 0 IP_Dict[client_ip] += 1 # 获取IP属地信息 country_info = get_country_info_safe(client_ip) if input_image is None: return None, "Please upload an image first" if not prompt or prompt.strip() == "": return None, "Please enter editing prompt" # 检查prompt长度是否大于3个字符 if len(prompt.strip()) <= 3: return None, "❌ Editing prompt must be more than 3 characters" # 检查是否包含NSFW内容 if check_nsfw(prompt.strip()) == 1: print(f"❌ NSFW content detected - IP: {client_ip}({country_info}), prompt: {prompt.strip()}") return None, "❌ Content not allowed. Please modify your prompt" result_url = None status_message = "" def progress_callback(message): nonlocal status_message status_message = message progress(0.5, desc=message) try: # 打印成功访问的信息 print(f"✅ Processing started - IP: {client_ip}({country_info}), count: {IP_Dict[client_ip]}, prompt: {prompt.strip()}") # Call image editing processing function result_url, message = process_image_edit(input_image, prompt.strip(), progress_callback) if result_url: print(f"✅ Processing completed successfully - IP: {client_ip}({country_info}), result_url: {result_url}") progress(1.0, desc="Processing completed") return result_url, "✅ " + message else: print(f"❌ Processing failed - IP: {client_ip}({country_info}), error: {message}") return None, "❌ " + message except Exception as e: return None, f"❌ Error occurred during processing: {str(e)}" # Create Gradio interface def create_app(): with gr.Blocks( title="AI Image Editor", theme=gr.themes.Soft(), css=""" .main-container { max-width: 1200px; margin: 0 auto; } .upload-area { border: 2px dashed #ccc; border-radius: 10px; padding: 20px; text-align: center; } .result-area { margin-top: 20px; padding: 20px; border-radius: 10px; background-color: #f8f9fa; } """ ) as app: gr.Markdown( """ # 🎨 AI Image Editor """, elem_classes=["main-container"] ) with gr.Row(): with gr.Column(scale=1): gr.Markdown("### 📸 Upload Image") input_image = gr.Image( label="Select image to edit", type="filepath", height=400, elem_classes=["upload-area"] ) gr.Markdown("### ✍️ Editing Instructions") prompt_input = gr.Textbox( label="Enter editing prompt", placeholder="For example: change background to beach, add rainbow, remove background, etc...", lines=3, max_lines=5 ) edit_button = gr.Button( "🚀 Start Editing", variant="primary", size="lg" ) with gr.Column(scale=1): gr.Markdown("### 🎯 Editing Result") output_image = gr.Image( label="Edited image", height=400, elem_classes=["result-area"] ) status_output = gr.Textbox( label="Processing status", lines=2, max_lines=3, interactive=False ) # Example area gr.Markdown("### 💡 Prompt Examples") with gr.Row(): example_prompts = [ "Change the character's background to a sunny seaside with blue waves.", "Change the character's background to New York at night with neon lights.", "Change the character's background to a fairytale castle with bright colors.", "Change background to forest", "Change background to snow mountain" ] for prompt in example_prompts: gr.Button( prompt, size="sm" ).click( lambda p=prompt: p, outputs=prompt_input ) # Bind button click event edit_button.click( fn=edit_image_interface, inputs=[input_image, prompt_input], outputs=[output_image, status_output], show_progress=True ) return app if __name__ == "__main__": app = create_app() app.queue() # Enable queue to handle concurrent requests app.launch()