File size: 3,615 Bytes
6525763
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import cv2
import numpy as np
from PIL import Image

# Function to add watermark (logo or text) to the image
def add_watermark(image, watermark_type, text=None, logo=None, opacity=1.0):
    image_logow = image.resize((500, 300))
    image_logow = np.array(image_logow.convert('RGB'))
    
    h_image, w_image, _ = image_logow.shape

    if watermark_type == "Logo" and logo is not None:
        logo = logo.resize((int(w_image * 0.3), int(h_image * 0.1)))  # Resize logo to 30% of the image width
        logo = np.array(logo.convert('RGB'))
        h_logo, w_logo, _ = logo.shape

        # Center placement for logo
        center_y = int(h_image / 2)
        center_x = int(w_image / 2)
        top_y = center_y - int(h_logo / 2)
        left_x = center_x - int(w_logo / 2)
        bottom_y = top_y + h_logo
        right_x = left_x + w_logo

        # Get ROI and add logo with opacity
        roi = image_logow[top_y: bottom_y, left_x: right_x]
        result = cv2.addWeighted(roi, 1, logo, opacity, 0)

        # Replace the ROI on the image
        image_logow[top_y: bottom_y, left_x: right_x] = result

        return Image.fromarray(image_logow)

    elif watermark_type == "Text" and text:
        # Add text watermark at the bottom-right corner
        cv2.putText(image_logow, text=text, org=(w_image - 100, h_image - 10), fontFace=cv2.FONT_HERSHEY_COMPLEX, 
                    fontScale=0.6, color=(0, 0, 255), thickness=2, lineType=cv2.LINE_AA)

        return Image.fromarray(image_logow)

    return image  # Return original image if no watermark added

# Create the Gradio interface
def gradio_interface():
    with gr.Blocks() as demo:
        gr.Markdown("## Image Watermarking App")
        
        gr.Markdown("""
        ### Add Watermarks to Your Images
        This application allows you to add custom watermarks to your images. You can either add a **Text Watermark** or use a **Logo Watermark**.
        
        **Steps**:
        1. Upload your image.
        2. If using a logo watermark, upload your logo.
        3. Select the type of watermark (text or logo).
        4. Customize the watermark by adding text or adjusting logo opacity.
        5. See the output image with the watermark applied.
        """)

        # Upload original image and logo
        image_input = gr.Image(label="Upload Image", type="pil")  # Upload original image
        logo_input = gr.Image(label="Upload Logo (optional, for Logo Watermark)", type="pil")  # Upload logo (optional)

        # Select watermark type and adjust parameters
        watermark_type = gr.Radio(["Text", "Logo"], label="Watermark Type", value="Text")
        text_input = gr.Textbox(label="Watermark Text (for Text Watermark)", value="MyArt.Inc", placeholder="Enter text for text watermark")
        opacity_slider = gr.Slider(0.1, 1.0, step=0.1, label="Logo Opacity (for Logo Watermark)", value=1.0)

        # Output watermarked image
        output_image = gr.Image(label="Watermarked Image")

        # Function to update the watermark based on user input
        def update_watermark(image, watermark_type, text, logo, opacity):
            if watermark_type == "Logo" and logo is None:
                return "Please upload a logo for the logo watermark."
            return add_watermark(image, watermark_type, text, logo, opacity)

        # Link inputs to output
        inputs = [image_input, watermark_type, text_input, logo_input, opacity_slider]
        gr.Button("Apply Watermark").click(update_watermark, inputs, output_image)

    demo.launch()

# Run the interface
gradio_interface()