|
|
import streamlit as st
|
|
|
from PIL import Image, ImageDraw, ImageFont
|
|
|
import io
|
|
|
import numpy as np
|
|
|
def watermark_():
|
|
|
|
|
|
def add_visible_watermark(image, watermark_text, size, opacity):
|
|
|
width, height = image.size
|
|
|
font_size = int(size)
|
|
|
try:
|
|
|
font = ImageFont.truetype("arial.ttf", font_size)
|
|
|
except IOError:
|
|
|
font = ImageFont.load_default()
|
|
|
|
|
|
|
|
|
|
|
|
watermark_layer = Image.new("RGBA", image.size, (255, 255, 255, 0))
|
|
|
watermark_draw = ImageDraw.Draw(watermark_layer)
|
|
|
|
|
|
|
|
|
text_width, text_height = watermark_draw.textbbox((0, 0), watermark_text, font=font)[2:]
|
|
|
x = (width - text_width) / 2
|
|
|
y = (height - text_height) / 2
|
|
|
|
|
|
|
|
|
shadow_color = (0, 0, 0, int(opacity * 0.3))
|
|
|
watermark_draw.text((x + 3, y + 3), watermark_text, font=font, fill=shadow_color)
|
|
|
|
|
|
|
|
|
watermark_color = (255, 255, 255, int(opacity))
|
|
|
for i in range(-width, width, text_width + 20):
|
|
|
watermark_draw.text((x + i, y + i), watermark_text, font=font, fill=watermark_color)
|
|
|
|
|
|
|
|
|
|
|
|
combined_image = Image.alpha_composite(image.convert("RGBA"), watermark_layer).convert("RGB")
|
|
|
return combined_image
|
|
|
|
|
|
|
|
|
def add_invisible_watermark(image, watermark_text):
|
|
|
binary_watermark = ''.join(format(ord(char), '08b') for char in watermark_text)
|
|
|
img_array = np.array(image)
|
|
|
flat_image = img_array.flatten()
|
|
|
|
|
|
for i in range(len(binary_watermark)):
|
|
|
flat_image[i] = flat_image[i] & ~1 | int(binary_watermark[i])
|
|
|
|
|
|
watermarked_image = flat_image.reshape(img_array.shape)
|
|
|
return Image.fromarray(watermarked_image.astype(np.uint8))
|
|
|
|
|
|
|
|
|
def detect_invisible_watermark(image, watermark_length):
|
|
|
img_array = np.array(image)
|
|
|
flat_image = img_array.flatten()
|
|
|
binary_watermark = ''.join(str(flat_image[i] & 1) for i in range(watermark_length * 8))
|
|
|
watermark = ''.join(chr(int(binary_watermark[i:i + 8], 2)) for i in range(0, len(binary_watermark), 8))
|
|
|
return watermark
|
|
|
|
|
|
|
|
|
def main():
|
|
|
st.title("Visible and Invisible Watermarking Tool")
|
|
|
|
|
|
col1, col2 = st.tabs(["Visible","Invisible"])
|
|
|
|
|
|
with col1:
|
|
|
st.header("Visible Watermark")
|
|
|
watermark_text = st.text_input("Enter Watermark Text", key="visible_text")
|
|
|
|
|
|
uploaded_file = st.file_uploader("Upload an Image", type=["png", "jpg", "jpeg"], key="visible_upload")
|
|
|
|
|
|
if uploaded_file and (watermark_text):
|
|
|
image = Image.open(uploaded_file).convert("RGB")
|
|
|
|
|
|
size = st.slider("Select Font Size", 10, 200, 50, key="font_size")
|
|
|
opacity = st.slider("Select Opacity", 0, 255, 128, key="opacity")
|
|
|
|
|
|
|
|
|
watermarked_image = add_visible_watermark(
|
|
|
image, watermark_text, size, opacity
|
|
|
)
|
|
|
|
|
|
st.image(watermarked_image, caption="Watermarked Image")
|
|
|
buffer = io.BytesIO()
|
|
|
watermarked_image.save(buffer, format="PNG")
|
|
|
st.download_button("Download Watermarked Image", buffer.getvalue(), "visible_watermarked_image.png")
|
|
|
|
|
|
with col2:
|
|
|
st.header("Invisible Watermark")
|
|
|
|
|
|
watermark_text = st.text_input("Enter Invisible Watermark Text", key="invisible_text")
|
|
|
uploaded_file = st.file_uploader("Upload an Image", type=["png", "jpg", "jpeg"], key="invisible_upload")
|
|
|
|
|
|
if uploaded_file and watermark_text:
|
|
|
image = Image.open(uploaded_file).convert("RGB")
|
|
|
watermarked_image = add_invisible_watermark(image, watermark_text)
|
|
|
|
|
|
st.image(watermarked_image, caption="Image with Invisible Watermark")
|
|
|
buffer = io.BytesIO()
|
|
|
watermarked_image.save(buffer, format="PNG")
|
|
|
st.download_button("Download Image with Invisible Watermark", buffer.getvalue(), "invisible_watermarked_image.png")
|
|
|
|
|
|
if st.checkbox("Check Invisible Watermark"):
|
|
|
uploaded_file = st.file_uploader("Upload an Image to Check Watermark", type=["png", "jpg", "jpeg"], key="check_upload")
|
|
|
watermark_length = st.number_input("Enter Watermark Length", min_value=1, step=1, key="watermark_length")
|
|
|
|
|
|
if uploaded_file and watermark_length:
|
|
|
image = Image.open(uploaded_file).convert("RGB")
|
|
|
extracted_watermark = detect_invisible_watermark(image, watermark_length)
|
|
|
st.write("Extracted Watermark:", extracted_watermark)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
main()
|
|
|
|