File size: 3,628 Bytes
9878999
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
103
104
105
106
107
108
109
110
111
import gradio as gr
import numpy as np
from PIL import Image, ImageOps, ImageFilter

def process_image(image, filter_type):
    if image is None:
        return None
    
    # Gradio images are usually numpy arrays
    if isinstance(image, np.ndarray):
        img = Image.fromarray(image.astype('uint8'), 'RGB')
    else:
        img = image

    if filter_type == "Grayscale":
        img = ImageOps.grayscale(img)
    elif filter_type == "Blur":
        img = img.filter(ImageFilter.BLUR)
    elif filter_type == "Flip Horizontal":
        img = ImageOps.mirror(img)
    elif filter_type == "Flip Vertical":
        img = ImageOps.flip(img)
    elif filter_type == "Sepia":
        # Apply sepia filter
        img_np = np.array(img).astype(float)
        sepia_matrix = np.array([[0.393, 0.769, 0.189],
                                 [0.349, 0.686, 0.168],
                                 [0.272, 0.534, 0.131]])
        sepia_img = img_np @ sepia_matrix.T
        sepia_img /= sepia_img.max()
        img = Image.fromarray((sepia_img * 255).astype(np.uint8))
    
    return img

# Define custom CSS for Ethiopian theme
custom_css = """
body, .gradio-container {
    background-color: #0b1121 !important;
    color: #f8fafc !important;
}
.gradio-container h1, .gradio-container p, .gradio-container span {
    color: #f8fafc !important;
}
.primary-button {
    background: linear-gradient(90deg, #009A44 0%, #FEDD00 50%, #EF3340 100%) !important;
    border: none !important;
    color: white !important;
    font-weight: bold !important;
}
footer {
    visibility: hidden;
}
.custom-footer {
    text-align: center;
    margin-top: 20px;
    padding: 10px;
    border-top: 1px solid #1e293b;
    font-size: 0.9em;
    color: #94a3b8;
}
.custom-footer a {
    color: #FEDD00;
    text-decoration: none;
    font-weight: bold;
}
"""

# Define the Gradio interface
with gr.Blocks(theme=gr.themes.Soft(), css=custom_css) as demo:
    gr.Markdown("# 🎨 α‰€αˆ‹αˆ α‹¨αˆαˆ΅αˆ αˆ›α‰€αŠ“α‰ αˆͺα‹«", elem_id="header")
    gr.Markdown("ምሡል α‹«αˆ΅αŒˆα‰‘ αŠ₯αŠ“ α‹¨αˆšαˆαˆαŒ‰α‰΅αŠ• αˆ›αŒ£αˆͺα‹« α‹­αˆαˆ¨αŒ‘α’", elem_id="sub-header")
    
    with gr.Row():
        with gr.Column():
            input_img = gr.Image(label="ምሡል α‹«αˆ΅αŒˆα‰‘")
            filter_opt = gr.Radio(
                ["Original", "Grayscale", "Blur", "Flip Horizontal", "Flip Vertical", "Sepia"], 
                label="αˆ›αŒ£αˆͺα‹« α‹­αˆαˆ¨αŒ‘", 
                value="Original"
            )
            # Map labels for UI display while keeping logic compatible
            filter_opt.choices = [
                ("α‹‹αŠ“α‹", "Original"), 
                ("αŒ₯α‰αˆ­ αŠ₯αŠ“ ነጭ", "Grayscale"), 
                ("α‹΅αŠ•αŒα‹αŒα‹", "Blur"), 
                ("α‰ αŠ αŒα‹΅αˆ ገልα‰₯αŒ₯", "Flip Horizontal"), 
                ("α‰ α‰αˆ˜α‰΅ ገልα‰₯αŒ₯", "Flip Vertical"), 
                ("αˆ΄α’α‹«", "Sepia")
            ]
            
            submit_btn = gr.Button("αˆ›αŒ£αˆͺα‹«α‹αŠ• α‰°αŒα‰₯ር", variant="primary", elem_classes="primary-button")
        
        with gr.Column():
            output_img = gr.Image(label="α‹¨α‰°α‰€αŠα‰£α‰ αˆ¨ ምሡል")

    gr.HTML("""
        <div class="custom-footer">
            α‰ α‹«αˆ¬α‹΅ αŠ¨α‰ α‹° αŠ¨α‹«αˆ¬α‹΅ α‰΄αŠ­αŠ–αˆŽαŒ‚ α‰΅αˆαˆ…αˆ­α‰΅ ቀቡ α‹¨α‰°αˆ°αˆ« - 
            <a href="https://www.yared-coding.com.et/" target="_blank">www.yared-coding.com.et</a>
        </div>
    """)

    submit_btn.click(
        fn=process_image, 
        inputs=[input_img, filter_opt], 
        outputs=output_img
    )

if __name__ == "__main__":
    demo.launch()