Skip to content
πŸ› οΈToolsShed

Image Watermark

Add a custom text watermark to your images with control over position, opacity, and font size.

About this tool

Image Watermark adds a custom text watermark to your photos right in the browser, so you can protect or brand your images by overlaying your own text. It is a quick way to mark ownership before sharing pictures online.

To use it, upload an image, type your watermark text, then adjust its position, opacity, and font size before downloading the finished result. It is handy for photographers protecting their work, sellers branding marketplace listings, labeling drafts, or adding a copyright notice.

Tip: lower the opacity for a subtle, semi-transparent mark that does not distract from the photo. All processing happens locally in your browser, and your images are never uploaded to any server.

Frequently Asked Questions

Code Implementation

from PIL import Image, ImageDraw, ImageFont

# Text watermark
def add_text_watermark(input_path, output_path, text, opacity=128):
    base = Image.open(input_path).convert("RGBA")
    layer = Image.new("RGBA", base.size, (0, 0, 0, 0))
    draw = ImageDraw.Draw(layer)
    try:
        font = ImageFont.truetype("arial.ttf", size=40)
    except:
        font = ImageFont.load_default()
    bbox = draw.textbbox((0, 0), text, font=font)
    tw, th = bbox[2] - bbox[0], bbox[3] - bbox[1]
    x = (base.width - tw) // 2
    y = (base.height - th) // 2
    draw.text((x, y), text, font=font, fill=(255, 255, 255, opacity))
    watermarked = Image.alpha_composite(base, layer)
    watermarked.convert("RGB").save(output_path)

add_text_watermark("input.jpg", "output.jpg", "Β© MyBrand")

# Image watermark (logo overlay)
def add_image_watermark(base_path, logo_path, output_path):
    base = Image.open(base_path).convert("RGBA")
    logo = Image.open(logo_path).convert("RGBA")
    logo.thumbnail((base.width // 4, base.height // 4))
    pos = (base.width - logo.width - 20, base.height - logo.height - 20)
    base.paste(logo, pos, logo)
    base.convert("RGB").save(output_path)

Comments & Feedback

Comments are powered by Giscus. Sign in with GitHub to leave a comment.