adds size and opacity sliders for the watermark image

#1
by ysharma HF Staff - opened
Files changed (1) hide show
  1. app.py +114 -8
app.py CHANGED
@@ -1,5 +1,8 @@
1
  import gradio as gr
2
  import os
 
 
 
3
 
4
  css = """
5
  p {
@@ -58,11 +61,57 @@ w5 = os.path.join(os.path.dirname(__file__), "files/frog.jpg")
58
  w6 = os.path.join(os.path.dirname(__file__), "files/Human_generated.png")
59
  w7 = os.path.join(os.path.dirname(__file__), "files/hf-logo_transpng.png")
60
 
61
- def generate_image(original_image, watermark):
62
- return gr.Image(original_image, watermark=watermark)
63
 
64
- def generate_video(original_video, watermark):
65
- return gr.Video(original_video, watermark=watermark)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
 
67
 
68
  with gr.Blocks(css=css) as demo:
@@ -96,15 +145,72 @@ with gr.Blocks(css=css) as demo:
96
  gr.Markdown("**Inputs**: Image and watermark file")
97
  with gr.Column():
98
  gr.Markdown("**Output**: Watermarked image")
99
- gr.Interface(generate_image, [gr.Image(), gr.Image(type='filepath', image_mode=None)], gr.Image(),
100
- examples=[[d, w7], [w4, w5], [c, w6],])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  with gr.Tab("Video Watermarking"):
102
  with gr.Column():
103
  gr.Markdown("**Inputs**: Video and watermark file")
104
  with gr.Column():
105
  gr.Markdown("**Output**: Watermarked video")
106
- gr.Interface(generate_video, [gr.Video(), gr.Image(type='filepath', image_mode=None)], gr.Video(),
107
- examples=[[a, w1], [b, w2], [a, w3], [b, w4]])
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
 
109
  if __name__ == "__main__":
110
  demo.launch()
 
1
  import gradio as gr
2
  import os
3
+ import tempfile
4
+ from PIL import Image
5
+ import numpy as np
6
 
7
  css = """
8
  p {
 
61
  w6 = os.path.join(os.path.dirname(__file__), "files/Human_generated.png")
62
  w7 = os.path.join(os.path.dirname(__file__), "files/hf-logo_transpng.png")
63
 
 
 
64
 
65
+ def process_watermark(watermark_path, opacity, size, for_video=False):
66
+ """Process watermark image with opacity and size adjustments"""
67
+ if watermark_path is None:
68
+ return None
69
+
70
+ # Load watermark image
71
+ if isinstance(watermark_path, str):
72
+ watermark = Image.open(watermark_path)
73
+ else:
74
+ watermark = Image.fromarray(watermark_path) if isinstance(watermark_path, np.ndarray) else watermark_path
75
+
76
+ # Convert to RGBA if not already
77
+ if watermark.mode != 'RGBA':
78
+ watermark = watermark.convert('RGBA')
79
+
80
+ # Resize watermark based on size parameter
81
+ original_size = watermark.size
82
+ new_size = (int(original_size[0] * size), int(original_size[1] * size))
83
+ watermark = watermark.resize(new_size, Image.Resampling.LANCZOS)
84
+
85
+ # Applying Opacity
86
+ # Get the alpha channel and multiply by opacity
87
+ r, g, b, a = watermark.split()
88
+ a = a.point(lambda x: int(x * opacity))
89
+ watermark = Image.merge('RGBA', (r, g, b, a))
90
+
91
+ # Return PIL Image for images, file path for videos
92
+ if for_video:
93
+ temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.png')
94
+ watermark.save(temp_file.name, 'PNG')
95
+ temp_file.close()
96
+ return temp_file.name
97
+ else:
98
+ return watermark
99
+
100
+ def generate_image(original_image, watermark, opacity, size):
101
+ if original_image is None:
102
+ return None
103
+ processed_watermark = process_watermark(watermark, opacity, size, for_video=False)
104
+ # Convert original_image to PIL Image if it's a numpy array
105
+ if isinstance(original_image, np.ndarray):
106
+ original_image = Image.fromarray(original_image)
107
+ return gr.Image(original_image, watermark=processed_watermark)
108
+
109
+ def generate_video(original_video, watermark, opacity, size):
110
+ if original_video is None:
111
+ return None
112
+ processed_watermark = process_watermark(watermark, opacity, size, for_video=True)
113
+ return gr.Video(original_video, watermark=processed_watermark)
114
+
115
 
116
 
117
  with gr.Blocks(css=css) as demo:
 
145
  gr.Markdown("**Inputs**: Image and watermark file")
146
  with gr.Column():
147
  gr.Markdown("**Output**: Watermarked image")
148
+
149
+ with gr.Row():
150
+ with gr.Column():
151
+ input_image = gr.Image(label="Original Image")
152
+ watermark_image = gr.Image(type='filepath', image_mode=None, label="Watermark Image")
153
+ with gr.Accordion("Watermark settings", open=False):
154
+ opacity_slider = gr.Slider(minimum=0.0, maximum=1.0, value=1.0, step=0.1, label="Watermark Opacity")
155
+ size_slider = gr.Slider(minimum=0.1, maximum=2.0, value=1.0, step=0.1, label="Watermark Size")
156
+ generate_btn = gr.Button("Generate Watermarked Image")
157
+ with gr.Column():
158
+ output_image = gr.Image(label="Watermarked Image")
159
+
160
+ # Examples
161
+ gr.Examples(
162
+ examples=[
163
+ [d, w7, 1.0, 1.0],
164
+ [w4, w5, 0.7, 0.8],
165
+ [c, w6, 0.9, 1.2]
166
+ ],
167
+ inputs=[input_image, watermark_image, opacity_slider, size_slider],
168
+ outputs=output_image,
169
+ fn=generate_image,
170
+ cache_examples=False
171
+ )
172
+
173
+ generate_btn.click(
174
+ fn=generate_image,
175
+ inputs=[input_image, watermark_image, opacity_slider, size_slider],
176
+ outputs=output_image
177
+ )
178
+
179
  with gr.Tab("Video Watermarking"):
180
  with gr.Column():
181
  gr.Markdown("**Inputs**: Video and watermark file")
182
  with gr.Column():
183
  gr.Markdown("**Output**: Watermarked video")
184
+
185
+ with gr.Row():
186
+ with gr.Column():
187
+ input_video = gr.Video(label="Original Video")
188
+ watermark_video = gr.Image(type='filepath', image_mode=None, label="Watermark Image")
189
+ with gr.Accordion("Watermark settings", open=False):
190
+ opacity_slider_video = gr.Slider(minimum=0.0, maximum=1.0, value=1.0, step=0.1, label="Watermark Opacity")
191
+ size_slider_video = gr.Slider(minimum=0.1, maximum=2.0, value=1.0, step=0.1, label="Watermark Size")
192
+ generate_btn_video = gr.Button("Generate Watermarked Video")
193
+ with gr.Column():
194
+ output_video = gr.Video(label="Watermarked Video")
195
+
196
+ # Examples
197
+ gr.Examples(
198
+ examples=[
199
+ [a, w1, 1.0, 1.0],
200
+ [b, w2, 0.8, 0.9],
201
+ [a, w3, 0.6, 1.5],
202
+ [b, w4, 0.7, 0.8]
203
+ ],
204
+ inputs=[input_video, watermark_video, opacity_slider_video, size_slider_video],
205
+ outputs=output_video,
206
+ fn=generate_video
207
+ )
208
+
209
+ generate_btn_video.click(
210
+ fn=generate_video,
211
+ inputs=[input_video, watermark_video, opacity_slider_video, size_slider_video],
212
+ outputs=output_video
213
+ )
214
 
215
  if __name__ == "__main__":
216
  demo.launch()