Spaces:
				
			
			
	
			
			
		Sleeping
		
	
	
	
			
			
	
	
	
	
		
		
		Sleeping
		
	File size: 3,963 Bytes
			
			a3f0f2d 27a8994 b3bac6f a3f0f2d 41bdd67 ad0c787 41bdd67 1c73813 dbdffeb a3f0f2d 1c73813 b4e799c f90960c a3f0f2d fd32459 a3f0f2d 1705ce6 a3f0f2d 1c73813 96bd4e6 fd32459 54f4fee a3f0f2d 4e37a66 f90960c fd32459 a3f0f2d f90960c a3f0f2d f90960c a3f0f2d 1705ce6 54f4fee b8e12f6 3e282cd a3f0f2d f90960c a3f0f2d dbdffeb  | 
								1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102  | 
								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) |