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