Spaces:
Sleeping
Sleeping
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()
|