eienmojiki's picture
Added motion blur filter and fixed duplicate controls.
ad0c787
raw
history blame
3.96 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(theme="CultriX/gradio-theme") as app:
gr.Markdown("# 📷 Photo Filter App")
# Khởi tạo components
controls = create_filter_controls()
filter_names = list(registry.filters.keys())
# Re-initialize controls and filter_names after adding the new filter
controls = create_filter_controls()
filter_names = list(registry.filters.keys())
controls = create_filter_controls()
filter_names = list(registry.filters.keys())
filter_groups = {} # Store filter groups
with gr.Row():
with gr.Column():
input_image = gr.Image(label="Input Image", type="numpy")
filter_select = gr.Dropdown(
label="Select Filter",
choices=filter_names,
value="Original"
)
# Thêm các control vào UI
control_components = []
filter_groups = controls # Assign controls directly to filter_groups
for filter_name, group in filter_groups.items():
for component in group.children: # Iterate over children of the group
control_components.append(component) # Collect sliders for event handling
apply_button = gr.Button("Apply Filter") # Add Apply button
with gr.Column():
output_image = gr.Image(label="Filtered Image")
filter_doc = gr.Markdown()
# Xử lý cập nhật UI
def update_controls(filter_name):
updates = []
for group_name, group in filter_groups.items():
visibility = (group_name == filter_name)
updates.append(gr.update(visible=visibility)) # Changed from gr.Group.update
# Get filter documentation
doc = registry.filters[filter_name].__doc__ or "No documentation available."
return updates + [doc]
# Xử lý ảnh khi button click
def process(image, filter_name, *args): # Update process function to take image, filter_name and *args
if image is None:
return None
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] # Get parameter values from args
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
except Exception as e:
print(f"Error processing image: {e}")
return image
# Kết nối sự kiện
filter_select.change(
update_controls,
inputs=filter_select,
outputs=list(filter_groups.values()) + [filter_doc], # Pass list of groups as outputs
api_name=False
)
input_components = [input_image, filter_select] + control_components # Input components for button click
apply_button.click( # Attach click event to Apply button
process,
inputs=input_components, # Use all input components
outputs=output_image,
)
return app
if __name__ == "__main__":
app = create_app()
app.launch(share=True)