eienmojiki's picture
Simplify Gradio app layout and remove custom theme
3897042
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)