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 = """

✍️ Invisible Watermark

""" 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()