File size: 5,066 Bytes
de08da3
 
1cd2670
a68d5f1
de08da3
 
 
 
 
 
 
a68d5f1
de08da3
 
 
 
 
 
a68d5f1
de08da3
 
 
a68d5f1
 
 
de08da3
a68d5f1
 
 
 
 
 
de08da3
 
 
 
 
 
 
 
 
 
 
 
a68d5f1
de08da3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9b0b991
de08da3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9b0b991
21ed458
de08da3
 
 
 
 
 
 
 
a68d5f1
 
 
 
 
de08da3
 
21ed458
de08da3
 
 
9b0b991
de08da3
 
 
 
 
 
 
 
a68d5f1
 
 
 
 
de08da3
 
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import gradio as gr 
from steganography import Steganography
from util_functions.utils import draw_multiple_line_text, generate_qr_code
from SSL_watermark import encode, decode


TITLE = """<h2 align="center"> ✍️ Invisible Watermark </h2>"""


def apply_watermark(radio_button, input_image, watermark_image, watermark_text, watermark_url):
    input_image = input_image.convert('RGB')
    print(f'radio_button: {radio_button}')
    if radio_button == "Image":
        watermark_image = watermark_image.resize((input_image.width, input_image.height)).convert('L').convert('RGB')
        return Steganography().merge(input_image, watermark_image, digit=7)
    elif radio_button == "Text":
        watermark_image = draw_multiple_line_text(input_image.size, watermark_text)
        return Steganography().merge(input_image, watermark_image, digit=7)
    elif radio_button == "QRCode":
        size = min(input_image.width, input_image.height)
        watermark_image = generate_qr_code(watermark_url).resize((size, size)).convert('RGB')
        return Steganography().merge(input_image, watermark_image, digit=7)
    else:
        print('start encoding ssl watermark...')
        return encode(input_image, epochs=5)

def extract_watermark(extract_radio_button, input_image_to_extract):
    if extract_radio_button == 'Steganography':
        return Steganography().unmerge(input_image_to_extract.convert('RGB'), digit=7).convert('RGBA')
    else:
        decoded_info = decode(image=input_image_to_extract)
        return draw_multiple_line_text(input_image_size=input_image_to_extract.size, text=decoded_info)


with gr.Blocks() as demo:
    gr.HTML(TITLE)
    with gr.Tab("Add watermark"):
        with gr.Row():
            with gr.Column():
                gr.Markdown("### Image to apply watermark")
                input_image = gr.Image(type='pil')
                with gr.Blocks():
                    gr.Markdown("### Which type of watermark you want to apply?")
                    radio_button = gr.Radio(
                        choices=["QRCode", "Text", "Image", "SSL Watermark"], 
                        label="Watermark type", 
                        value="QRCode",
                        # info="Which type of watermark you want to apply?"
                    )
                    watermark_url = gr.Textbox(
                        placeholder="URL to generate QR code", 
                        visible=True
                    )
                    watermark_text = gr.Textbox(
                        placeholder="What text you want to use as watermark?",
                        visible=False
                    )
                    watermark_image = gr.Image(
                        type='pil', 
                        visible=False
                    )
                    
                    def update_visibility(radio_value):
                        return { 
                            watermark_image: 
                                { 
                                    "visible":radio_value == "Image", 
                                    "__type__": "update"
                                }, 
                            watermark_text: 
                                {
                                    "visible":radio_value == "Text", 
                                    "__type__": "update"
                                },
                            watermark_url: 
                                {
                                    "visible":radio_value == "QRCode", 
                                    "__type__": "update"
                                }
                            }

            with gr.Column():
                gr.Markdown("### Applied watermark image")
                output_image = gr.Image(show_label=False).style(height=500)
        with gr.Row():
            apply_button =gr.Button("Apply")
        
    with gr.Tab("Extract watermark"):
        with gr.Row():
            with gr.Column():
                gr.Markdown("### Image to extract watermark")
                input_image_to_extract = gr.Image(type='pil')
                extract_radio_button = gr.Radio(
                    choices=["Steganography", "SSL Watermark"], 
                    label="Extract methods", 
                    value="Steganography"
                )
            with gr.Column():
                gr.Markdown("### Extracted watermark")
                extracted_watermark = gr.Image(type='pil').style(height=500)
        extract_button = gr.Button("Extract")
    
    radio_button.change(
        fn=update_visibility, 
        inputs=radio_button,
        outputs=[watermark_image, watermark_text, watermark_url]
    )
    apply_button.click(
        fn=apply_watermark, 
        inputs=[radio_button, input_image, watermark_image, watermark_text, watermark_url], 
        outputs=[output_image]
    )
    extract_button.click(
        fn=extract_watermark, 
        inputs=[extract_radio_button, input_image_to_extract], 
        outputs=[extracted_watermark]
    )

demo.launch()