Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import cv2 | |
| import numpy as np | |
| from registry import registry | |
| from filters import * | |
| from components import create_filter_controls | |
| def create_app(): | |
| with gr.Blocks() as app: | |
| gr.Markdown(""" | |
| # 📷 Photo Filter App | |
| ### Chỉnh sửa ảnh với các bộ lọc chuyên nghiệp | |
| """) | |
| # Khởi tạo components | |
| controls = create_filter_controls() | |
| filter_names = list(registry.filters.keys()) | |
| filter_groups = controls | |
| with gr.Row(): | |
| with gr.Column(): | |
| input_image = gr.Image( | |
| label="Ảnh gốc", | |
| type="numpy" | |
| ) | |
| filter_select = gr.Dropdown( | |
| label="Chọn bộ lọc", | |
| choices=filter_names, | |
| value="Original" | |
| ) | |
| # Các điều khiển bộ lọc | |
| control_components = [] | |
| for filter_name, group in filter_groups.items(): | |
| for component in group.children: | |
| control_components.append(component) | |
| apply_button = gr.Button("Áp dụng bộ lọc") | |
| filter_doc = gr.Markdown() | |
| with gr.Column(): | |
| output_image = gr.Image(label="Ảnh đã chỉnh sửa") | |
| error_message = gr.Markdown(visible=False) | |
| # Xử lý cập nhật UI | |
| def update_controls(filter_name): | |
| updates = [] | |
| for group_name, group in filter_groups.items(): | |
| updates.append(gr.update(visible=group_name == filter_name)) | |
| doc = registry.filters[filter_name].__doc__ or "Không có mô tả chi tiết." | |
| return updates + [doc] | |
| # Xử lý ảnh | |
| def process(image, filter_name, *args): | |
| if image is None: | |
| return None, gr.update(visible=True, value="⚠️ Vui lòng chọn ảnh trước khi áp dụng bộ lọc") | |
| try: | |
| image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) | |
| params = {} | |
| param_names = list(registry.params_map.get(filter_name, {}).keys()) | |
| for i, param_name in enumerate(param_names): | |
| params[param_name] = args[i] | |
| processed = registry.filters[filter_name](image, **params) | |
| if len(processed.shape) == 2: | |
| processed = cv2.cvtColor(processed, cv2.COLOR_GRAY2RGB) | |
| else: | |
| processed = cv2.cvtColor(processed, cv2.COLOR_BGR2RGB) | |
| return processed, gr.update(visible=False) | |
| except Exception as e: | |
| return None, gr.update(visible=True, value=f"❌ Lỗi xử lý ảnh: {str(e)}") | |
| # Kết nối sự kiện | |
| filter_select.change( | |
| update_controls, | |
| inputs=filter_select, | |
| outputs=list(filter_groups.values()) + [filter_doc], | |
| api_name=False | |
| ) | |
| input_components = [input_image, filter_select] + control_components | |
| apply_button.click( | |
| process, | |
| inputs=input_components, | |
| outputs=[output_image, error_message], | |
| ) | |
| return app | |
| if __name__ == "__main__": | |
| app = create_app() | |
| app.launch(share=True) |