import gradio as gr from PIL import Image, ImageEnhance, ImageOps, ImageFilter import io import base64 import tempfile import os def image_to_base64(img): """ PIL 이미지를 base64 인코딩된 문자열로 변환합니다. """ buffered = io.BytesIO() img.save(buffered, format="JPEG") img_bytes = buffered.getvalue() img_base64 = base64.b64encode(img_bytes).decode() return img_base64 def transform_image(image, contrast, brightness, blur): """ 이미지를 흑백으로 변환하고, 사용자가 조절한 대비, 밝기, 흐림 효과를 적용합니다. """ # 흑백 변환 bw_image = ImageOps.grayscale(image) # 대비 향상 enhancer = ImageEnhance.Contrast(bw_image) bw_image = enhancer.enhance(contrast) # 밝기 조절 enhancer = ImageEnhance.Brightness(bw_image) bw_image = enhancer.enhance(brightness) # 흐림 효과 추가 bw_image = bw_image.filter(ImageFilter.GaussianBlur(radius=blur)) return bw_image def generate_comparison_html(original_base64, transformed_base64): """ 변환된 이미지와 원본 이미지를 비교할 수 있는 수평 슬라이더 HTML을 생성합니다. 변환된 이미지를 기준으로 슬라이더를 움직여 원본 이미지를 확인할 수 있습니다. """ html = f"""
변환 후 변환 전
""" return html def process_image(image, contrast, brightness, blur): """ 사용자가 업로드한 이미지를 변환하고, 비교 슬라이더와 다운로드 링크를 생성합니다. """ if image is None: return "이미지가 업로드되지 않았습니다.", None # 이미지 변환 transformed = transform_image(image, contrast, brightness, blur) # 이미지를 base64로 변환 original_base64 = image_to_base64(image) transformed_base64 = image_to_base64(transformed) # 비교 슬라이드 HTML 생성 comparison_html = generate_comparison_html(original_base64, transformed_base64) # 변환된 이미지를 임시 파일로 저장 with tempfile.NamedTemporaryFile(suffix=".jpg", delete=False, prefix="transformed_", dir="/tmp") as tmp_file: transformed.save(tmp_file, format="JPEG") tmp_file_path = tmp_file.name return comparison_html, tmp_file_path with gr.Blocks() as demo: gr.Markdown("## 📸 분위기 있는 흑백 사진 변환기") gr.Markdown("원본 이미지와 변환된 이미지를 슬라이더로 비교하고, 변환된 이미지를 다운로드할 수 있습니다.") with gr.Row(): with gr.Column(): input_image = gr.Image(type="pil", label="📥 원본 이미지 업로드") contrast_slider = gr.Slider( minimum=0.5, maximum=3.0, step=0.1, value=1.5, label="🔍 대비 조절" ) brightness_slider = gr.Slider( minimum=0.5, maximum=3.0, step=0.1, value=0.9, label="💡 밝기 조절" ) blur_slider = gr.Slider( minimum=0, maximum=5, step=0.5, value=1, label="🌫️ 흐림 효과" ) convert_button = gr.Button("🔄 변환하기") with gr.Column(): comparison = gr.HTML(label="🔍 변환 전후 비교") download_link = gr.File(label="⬇️ JPG로 다운로드") convert_button.click( fn=process_image, inputs=[input_image, contrast_slider, brightness_slider, blur_slider], outputs=[comparison, download_link] ) gr.Markdown("©️ 2024 분위기 있는 흑백 사진 변환기 by OpenAI") demo.launch()