File size: 5,185 Bytes
28f913d
c4fd7c7
f07fead
2a16291
268c105
 
 
9f594b4
 
 
 
268c105
 
c4fd7c7
2fb8f76
268c105
2fb8f76
 
 
e5fa83a
2fb8f76
268c105
9f594b4
268c105
2fb8f76
e5fa83a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2fb8f76
 
 
923d55d
2fb8f76
 
 
 
 
 
 
 
 
 
 
 
 
 
9f594b4
2fb8f76
 
 
 
56ad03b
b964d22
2fb8f76
 
 
 
 
 
 
 
b964d22
2fb8f76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ee028eb
2fb8f76
 
 
 
 
8fafd8a
 
28f913d
 
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import gradio as gr
from PIL import Image, ImageEnhance, ImageFilter
import numpy as np

# 필터 추천에 따른 슬라이드바 값 설정
def set_preset_filter(preset):
    presets = {
        "자동": [0, 0, 0, 0, 0.25, 0, 0, 0, 0.16, 0, 0.06, 0],
        "따스한": [0.07, 0, 0, 0, 0.25, 0.16, 0, 0, 0.16, 0, 0.06, 0],
        "깨끗한": [0.02, 0, 0, 0, 0.25, 0, 0.04, 0, 0.21, 0, 0.06, 0],
        "흑백": [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
    }
    return presets.get(preset, [0] * 12)

# 필터 적용 함수
def apply_filters(image, *sliders):
    if image is None:
        return None
    pil_image = Image.fromarray(image)
    soft_glow, sepia, vintage, black_white, sharpen, warm_tone, cold_tone, film_grain, high_key, low_key, clarity, saturation = sliders

    if soft_glow > 0:
        glow = pil_image.filter(ImageFilter.GaussianBlur(radius=10))
        pil_image = Image.blend(pil_image, glow, alpha=soft_glow)

    if black_white > 0:
        gray = pil_image.convert("L")
        pil_image = Image.blend(pil_image, gray.convert("RGB"), alpha=black_white)

    if sharpen > 0:
        enhancer = ImageEnhance.Sharpness(pil_image)
        pil_image = enhancer.enhance(1 + sharpen)

    if warm_tone > 0:
        r, g, b = pil_image.split()
        r = r.point(lambda i: i * (1 + warm_tone))
        b = b.point(lambda i: i * (1 - warm_tone))
        pil_image = Image.merge("RGB", (r, g, b))

    if cold_tone > 0:
        r, g, b = pil_image.split()
        r = r.point(lambda i: i * (1 - cold_tone))
        b = b.point(lambda i: i * (1 + cold_tone))
        pil_image = Image.merge("RGB", (r, g, b))

    if high_key > 0:
        enhancer = ImageEnhance.Brightness(pil_image)
        pil_image = enhancer.enhance(1 + high_key)

    if clarity > 0:
        enhancer = ImageEnhance.Contrast(pil_image)
        pil_image = enhancer.enhance(1 + clarity)

    return np.array(pil_image)

# Gradio 인터페이스
with gr.Blocks() as app:
    gr.Markdown("## 고급 필터 조합기")

    # 첫 번째 행: 이미지 업로드 창 | 필터 적용 이미지
    with gr.Row():
        image_input = gr.Image(type="numpy", label="이미지 업로드", interactive=True)
        output_image = gr.Image(type="numpy", label="필터 적용 이미지")

    # 필터 초기화 버튼
    with gr.Row():
        reset_button = gr.Button("필터 초기화")

    # 두 번째 행: 필터 추천
    with gr.Row():
        preset_selector = gr.Radio(
            ["자동", "따스한", "깨끗한", "흑백"],
            label="필터 추천"
        )

    # 세 번째 행: 필터 속성 슬라이드바 (1열 | 2열)
    with gr.Row():
        with gr.Column():
            sliders_left = [
                gr.Slider(0, 1, value=0, step=0.01, label="Soft Glow (부드러운 빛)"),
                gr.Slider(0, 1, value=0, step=0.01, label="Sepia (세피아 톤)"),
                gr.Slider(0, 1, value=0, step=0.01, label="Vintage (빈티지 효과)"),
                gr.Slider(0, 1, value=0, step=0.01, label="Black & White (흑백)"),
                gr.Slider(0, 1, value=0, step=0.01, label="Sharpen (선명하게)"),
                gr.Slider(0, 1, value=0, step=0.01, label="Warm Tone (따뜻한 색조)"),
            ]
        with gr.Column():
            sliders_right = [
                gr.Slider(0, 1, value=0, step=0.01, label="Cold Tone (차가운 색조)"),
                gr.Slider(0, 1, value=0, step=0.01, label="Film Grain (필름 질감)"),
                gr.Slider(0, 1, value=0, step=0.01, label="High-Key (밝은 톤 강조)"),
                gr.Slider(0, 1, value=0, step=0.01, label="Low-Key (어두운 톤 강조)"),
                gr.Slider(0, 1, value=0, step=0.01, label="Clarity (선명도 강화)"),
                gr.Slider(0, 1, value=0, step=0.01, label="Saturation (채도)"),
            ]

    # 네 번째 행: 다운로드 형식과 버튼
    with gr.Row():
        download_format = gr.Radio(["JPG", "PNG"], label="다운로드 형식")
        download_button = gr.Button("다운로드")

    # 슬라이드바 연결
    all_sliders = sliders_left + sliders_right
    for slider in all_sliders:
        slider.change(
            apply_filters,
            inputs=[image_input] + all_sliders,
            outputs=[output_image]
        )

    # 필터 추천 선택 시 슬라이드바 업데이트
    preset_selector.change(
        lambda preset: set_preset_filter(preset),
        inputs=[preset_selector],
        outputs=all_sliders
    )

    # 이미지 삭제 시 필터 적용 이미지도 삭제
    image_input.change(
        lambda img: None if img is None else img,
        inputs=[image_input],
        outputs=[output_image]
    )

    # 다운로드 버튼 클릭
    download_button.click(
        lambda img, fmt: f"filtered_image.{fmt.lower()}" if img is not None else None,
        inputs=[output_image, download_format],
        outputs=[]
    )

    # 필터 초기화 버튼 클릭
    reset_button.click(
        lambda img: [None] + [0] * len(all_sliders),
        inputs=[image_input],
        outputs=[output_image] + all_sliders
    )

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