CSB261 commited on
Commit
6b887c2
ยท
verified ยท
1 Parent(s): 28fd0ef

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +91 -19
app.py CHANGED
@@ -1,45 +1,117 @@
1
  import gradio as gr
2
  from PIL import Image, ImageEnhance, ImageOps, ImageFilter
 
 
3
 
4
- def convert_to_moody_bw(image):
5
  """
6
- ์ด๋ฏธ์ง€๋ฅผ ํ‘๋ฐฑ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  ๋ถ„์œ„๊ธฐ๋ฅผ ๋”ํ•ฉ๋‹ˆ๋‹ค.
7
  """
8
- # ์ด๋ฏธ์ง€๋ฅผ ํ‘๋ฐฑ์œผ๋กœ ๋ณ€ํ™˜
 
 
 
 
 
 
 
 
 
 
9
  bw_image = ImageOps.grayscale(image)
10
 
11
  # ๋Œ€๋น„ ํ–ฅ์ƒ
12
  enhancer = ImageEnhance.Contrast(bw_image)
13
- bw_image = enhancer.enhance(1.5)
14
 
15
  # ๋ฐ๊ธฐ ์กฐ์ ˆ
16
  enhancer = ImageEnhance.Brightness(bw_image)
17
- bw_image = enhancer.enhance(0.9)
18
 
19
- # ์•ฝ๊ฐ„์˜ ํ๋ฆผ ํšจ๊ณผ ์ถ”๊ฐ€
20
- bw_image = bw_image.filter(ImageFilter.GaussianBlur(radius=1))
21
 
22
  return bw_image
23
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  with gr.Blocks() as demo:
25
- gr.Markdown("## ๋ถ„์œ„๊ธฐ ์žˆ๋Š” ํ‘๋ฐฑ ์‚ฌ์ง„ ๋ณ€ํ™˜๊ธฐ")
 
26
 
27
  with gr.Row():
28
  with gr.Column():
29
- input_image = gr.Image(type="pil", label="์›๋ณธ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ")
30
- convert_button = gr.Button("๋ณ€ํ™˜ํ•˜๊ธฐ")
31
- with gr.Column():
32
- output_image = gr.Image(
33
- type="pil",
34
- label="๋ณ€ํ™˜๋œ ์ด๋ฏธ์ง€",
35
- interactive=False,
36
- download=True # ๋‹ค์šด๋กœ๋“œ ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”
37
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
38
 
39
  convert_button.click(
40
- fn=convert_to_moody_bw,
41
- inputs=input_image,
42
- outputs=output_image
43
  )
44
 
 
 
45
  demo.launch()
 
1
  import gradio as gr
2
  from PIL import Image, ImageEnhance, ImageOps, ImageFilter
3
+ import io
4
+ import base64
5
 
6
+ def image_to_base64(img):
7
  """
8
+ PIL ์ด๋ฏธ์ง€๋ฅผ base64 ์ธ์ฝ”๋”ฉ๋œ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
9
  """
10
+ buffered = io.BytesIO()
11
+ img.save(buffered, format="JPEG")
12
+ img_bytes = buffered.getvalue()
13
+ img_base64 = base64.b64encode(img_bytes).decode()
14
+ return img_base64
15
+
16
+ def transform_image(image, contrast, brightness, blur):
17
+ """
18
+ ์ด๋ฏธ์ง€๋ฅผ ํ‘๋ฐฑ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์กฐ์ ˆํ•œ ๋Œ€๋น„, ๋ฐ๊ธฐ, ํ๋ฆผ ํšจ๊ณผ๋ฅผ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
19
+ """
20
+ # ํ‘๋ฐฑ ๋ณ€ํ™˜
21
  bw_image = ImageOps.grayscale(image)
22
 
23
  # ๋Œ€๋น„ ํ–ฅ์ƒ
24
  enhancer = ImageEnhance.Contrast(bw_image)
25
+ bw_image = enhancer.enhance(contrast)
26
 
27
  # ๋ฐ๊ธฐ ์กฐ์ ˆ
28
  enhancer = ImageEnhance.Brightness(bw_image)
29
+ bw_image = enhancer.enhance(brightness)
30
 
31
+ # ํ๋ฆผ ํšจ๊ณผ ์ถ”๊ฐ€
32
+ bw_image = bw_image.filter(ImageFilter.GaussianBlur(radius=blur))
33
 
34
  return bw_image
35
 
36
+ def generate_comparison_html(original_base64, transformed_base64):
37
+ """
38
+ ์›๋ณธ ์ด๋ฏธ์ง€์™€ ๋ณ€ํ™˜๋œ ์ด๋ฏธ์ง€๋ฅผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋Š” ์Šฌ๋ผ์ด๋” HTML์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
39
+ """
40
+ html = f"""
41
+ <div style="position: relative; width: 100%; max-width: 600px; margin: auto;">
42
+ <img src="data:image/jpeg;base64,{original_base64}" style="width: 100%;">
43
+ <div id="overlay" style="position: absolute; top:0; left:0; width:50%; overflow: hidden;">
44
+ <img src="data:image/jpeg;base64,{transformed_base64}" style="width: 100%;">
45
+ </div>
46
+ <input type="range" min="0" max="100" value="50" oninput="document.getElementById('overlay').style.width = this.value + '%';" style="position: absolute; bottom: 20px; left: 50%; transform: translateX(-50%); width: 80%;">
47
+ <div style="text-align: center; margin-top: 10px;">
48
+ <span>๋ณ€ํ™˜ ์ „</span> <span style="float: right;">๋ณ€ํ™˜ ํ›„</span>
49
+ </div>
50
+ </div>
51
+ """
52
+ return html
53
+
54
+ def process_image(image, contrast, brightness, blur):
55
+ """
56
+ ์‚ฌ์šฉ์ž๊ฐ€ ์—…๋กœ๋“œํ•œ ์ด๋ฏธ์ง€๋ฅผ ๋ณ€ํ™˜ํ•˜๊ณ , ๋น„๊ต ์Šฌ๋ผ์ด๋“œ์™€ ๋‹ค์šด๋กœ๋“œ ๋งํฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
57
+ """
58
+ # ์ด๋ฏธ์ง€ ๋ณ€ํ™˜
59
+ transformed = transform_image(image, contrast, brightness, blur)
60
+
61
+ # ์ด๋ฏธ์ง€๋ฅผ base64๋กœ ๋ณ€ํ™˜
62
+ original_base64 = image_to_base64(image)
63
+ transformed_base64 = image_to_base64(transformed)
64
+
65
+ # ๋น„๊ต ์Šฌ๋ผ์ด๋“œ HTML ์ƒ์„ฑ
66
+ comparison_html = generate_comparison_html(original_base64, transformed_base64)
67
+
68
+ # ๋ณ€ํ™˜๋œ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋„๋ก ์ค€๋น„
69
+ buf = io.BytesIO()
70
+ transformed.save(buf, format="JPEG")
71
+ buf.seek(0)
72
+ transformed_bytes = buf.read()
73
+
74
+ return comparison_html, ("transformed.jpg", transformed_bytes)
75
+
76
  with gr.Blocks() as demo:
77
+ gr.Markdown("## ๐Ÿ“ธ ๋ถ„์œ„๊ธฐ ์žˆ๋Š” ํ‘๋ฐฑ ์‚ฌ์ง„ ๋ณ€ํ™˜๊ธฐ")
78
+ gr.Markdown("์›๋ณธ ์ด๋ฏธ์ง€์™€ ๋ณ€ํ™˜๋œ ์ด๋ฏธ์ง€๋ฅผ ์Šฌ๋ผ์ด๋”๋กœ ๋น„๊ตํ•˜๊ณ , ๋ณ€ํ™˜๋œ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.")
79
 
80
  with gr.Row():
81
  with gr.Column():
82
+ input_image = gr.Image(type="pil", label="๐Ÿ“ฅ ์›๋ณธ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ")
83
+ contrast_slider = gr.Slider(
84
+ minimum=0.5,
85
+ maximum=3.0,
86
+ step=0.1,
87
+ value=1.5,
88
+ label="๐Ÿ” ๋Œ€๋น„ ์กฐ์ ˆ"
 
89
  )
90
+ brightness_slider = gr.Slider(
91
+ minimum=0.5,
92
+ maximum=3.0,
93
+ step=0.1,
94
+ value=0.9,
95
+ label="๐Ÿ’ก ๋ฐ๊ธฐ ์กฐ์ ˆ"
96
+ )
97
+ blur_slider = gr.Slider(
98
+ minimum=0,
99
+ maximum=5,
100
+ step=0.5,
101
+ value=1,
102
+ label="๐ŸŒซ๏ธ ํ๋ฆผ ํšจ๊ณผ"
103
+ )
104
+ convert_button = gr.Button("๐Ÿ”„ ๋ณ€ํ™˜ํ•˜๊ธฐ")
105
+ with gr.Column():
106
+ comparison = gr.HTML(label="๐Ÿ” ๋ณ€ํ™˜ ์ „ํ›„ ๋น„๊ต")
107
+ download_link = gr.File(label="โฌ‡๏ธ JPG๋กœ ๋‹ค์šด๋กœ๋“œ")
108
 
109
  convert_button.click(
110
+ fn=process_image,
111
+ inputs=[input_image, contrast_slider, brightness_slider, blur_slider],
112
+ outputs=[comparison, download_link]
113
  )
114
 
115
+ gr.Markdown("ยฉ๏ธ 2024 ๋ถ„์œ„๊ธฐ ์žˆ๋Š” ํ‘๋ฐฑ ์‚ฌ์ง„ ๋ณ€ํ™˜๊ธฐ by OpenAI")
116
+
117
  demo.launch()