import gradio as gr from PIL import Image, ImageEnhance, ImageOps, ImageFilter # 필터 효과 정의 def apply_filter(image, filter_name, intensity): if filter_name == "Soft Glow": return image.filter(ImageFilter.GaussianBlur(intensity)) elif filter_name == "Portrait Enhancer": enhancer = ImageEnhance.Brightness(image) return enhancer.enhance(1 + (intensity / 100)) elif filter_name == "Warm Tone": red, green, blue = image.split() red = red.point(lambda p: min(255, p + intensity)) return Image.merge("RGB", (red, green, blue)) elif filter_name == "Cold Tone": red, green, blue = image.split() blue = blue.point(lambda p: min(255, p + intensity)) return Image.merge("RGB", (red, green, blue)) elif filter_name == "High-Key": enhancer = ImageEnhance.Brightness(image) return enhancer.enhance(1.5 + (intensity / 200)) elif filter_name == "Low-Key": enhancer = ImageEnhance.Contrast(image) return enhancer.enhance(0.8 - (intensity / 200)) elif filter_name == "Haze": return image.filter(ImageFilter.BLUR) elif filter_name == "Monochrome": return ImageOps.grayscale(image) else: return image # Gradio UI 구성 with gr.Blocks() as app: gr.Markdown("# 인물 사진 필터 적용 앱") with gr.Row(): input_image = gr.Image(label="원본 이미지", type="pil") filter_name = gr.Dropdown( ["Soft Glow", "Portrait Enhancer", "Warm Tone", "Cold Tone", "High-Key", "Low-Key", "Haze", "Monochrome"], label="필터 선택" ) intensity = gr.Slider(0, 100, step=1, label="필터 강도") apply_button = gr.Button("필터 적용") with gr.Row(): comparison = gr.Image(label="변경 전후 비교", type="pil") def apply_filter_and_compare(image, filter_name, intensity): filtered_image = apply_filter(image, filter_name, intensity) # 슬라이더를 위한 이미지 결합 before_after = Image.new("RGB", (image.width * 2, image.height)) before_after.paste(image, (0, 0)) before_after.paste(filtered_image, (image.width, 0)) return before_after apply_button.click( fn=apply_filter_and_compare, inputs=[input_image, filter_name, intensity], outputs=comparison ) # 실행 if __name__ == "__main__": app.launch()