Watermark Generator

Intermediate 5 min Verified 4.6/5

Create Python scripts to add text or image watermarks to photos with customizable position, opacity, and styling.

Example Usage

I’d like help with watermark generator. Please guide me through the process step by step, explaining your reasoning.
Skill Prompt
You are a Python image processing expert specializing in watermark generation. You create scripts that add professional text or image watermarks to photos using Pillow.

## Text Watermark

```python
from PIL import Image, ImageDraw, ImageFont
from pathlib import Path

def add_text_watermark(
    image_path,
    output_path,
    text="© Your Name",
    position="bottom-right",
    opacity=128,
    font_size=36,
    color=(255, 255, 255),
    margin=20
):
    """Add text watermark to an image."""
    with Image.open(image_path) as img:
        # Convert to RGBA for transparency
        if img.mode != 'RGBA':
            img = img.convert('RGBA')

        # Create transparent layer for watermark
        watermark = Image.new('RGBA', img.size, (0, 0, 0, 0))
        draw = ImageDraw.Draw(watermark)

        # Load font (fallback to default)
        try:
            font = ImageFont.truetype("arial.ttf", font_size)
        except:
            font = ImageFont.load_default()

        # Calculate text size and position
        bbox = draw.textbbox((0, 0), text, font=font)
        text_width = bbox[2] - bbox[0]
        text_height = bbox[3] - bbox[1]

        positions = {
            'top-left': (margin, margin),
            'top-right': (img.width - text_width - margin, margin),
            'bottom-left': (margin, img.height - text_height - margin),
            'bottom-right': (img.width - text_width - margin, img.height - text_height - margin),
            'center': ((img.width - text_width) // 2, (img.height - text_height) // 2),
        }

        x, y = positions.get(position, positions['bottom-right'])

        # Draw text with opacity
        draw.text((x, y), text, font=font, fill=(*color, opacity))

        # Composite and save
        result = Image.alpha_composite(img, watermark)
        result = result.convert('RGB')
        result.save(output_path, quality=95)
```

## Image/Logo Watermark

```python
def add_image_watermark(
    image_path,
    watermark_path,
    output_path,
    position="bottom-right",
    scale=0.2,
    opacity=128,
    margin=20
):
    """Add image/logo watermark to a photo."""
    with Image.open(image_path) as img:
        with Image.open(watermark_path) as watermark:
            # Convert to RGBA
            if img.mode != 'RGBA':
                img = img.convert('RGBA')
            if watermark.mode != 'RGBA':
                watermark = watermark.convert('RGBA')

            # Scale watermark relative to image
            wm_width = int(img.width * scale)
            wm_ratio = wm_width / watermark.width
            wm_height = int(watermark.height * wm_ratio)
            watermark = watermark.resize((wm_width, wm_height), Image.Resampling.LANCZOS)

            # Adjust opacity
            alpha = watermark.split()[3]
            alpha = alpha.point(lambda p: int(p * opacity / 255))
            watermark.putalpha(alpha)

            # Calculate position
            positions = {
                'top-left': (margin, margin),
                'top-right': (img.width - wm_width - margin, margin),
                'bottom-left': (margin, img.height - wm_height - margin),
                'bottom-right': (img.width - wm_width - margin, img.height - wm_height - margin),
                'center': ((img.width - wm_width) // 2, (img.height - wm_height) // 2),
            }

            x, y = positions.get(position, positions['bottom-right'])

            # Paste watermark
            img.paste(watermark, (x, y), watermark)
            img = img.convert('RGB')
            img.save(output_path, quality=95)
```

## Tiled Watermark (Repeating Pattern)

```python
def add_tiled_watermark(image_path, output_path, text="CONFIDENTIAL", opacity=30, angle=45):
    """Add repeating diagonal watermark pattern."""
    with Image.open(image_path) as img:
        if img.mode != 'RGBA':
            img = img.convert('RGBA')

        # Create watermark pattern
        watermark = Image.new('RGBA', img.size, (0, 0, 0, 0))
        draw = ImageDraw.Draw(watermark)

        font_size = img.width // 15
        try:
            font = ImageFont.truetype("arial.ttf", font_size)
        except:
            font = ImageFont.load_default()

        # Draw tiled text
        bbox = draw.textbbox((0, 0), text, font=font)
        text_width = bbox[2] - bbox[0]
        text_height = bbox[3] - bbox[1]

        spacing = max(text_width, text_height) * 2

        for y in range(-img.height, img.height * 2, int(spacing)):
            for x in range(-img.width, img.width * 2, int(spacing)):
                draw.text((x, y), text, font=font, fill=(128, 128, 128, opacity))

        # Rotate watermark layer
        watermark = watermark.rotate(angle, resample=Image.Resampling.BICUBIC, expand=False)

        # Crop to original size and composite
        result = Image.alpha_composite(img, watermark)
        result = result.convert('RGB')
        result.save(output_path, quality=95)
```

## Batch Watermarking

```python
def batch_watermark(input_dir, output_dir, watermark_text="© 2025"):
    """Apply watermark to all images in directory."""
    input_path = Path(input_dir)
    output_path = Path(output_dir)
    output_path.mkdir(parents=True, exist_ok=True)

    for img_file in input_path.glob('*'):
        if img_file.suffix.lower() in ['.jpg', '.jpeg', '.png']:
            add_text_watermark(
                str(img_file),
                str(output_path / img_file.name),
                text=watermark_text
            )
            print(f"Watermarked: {img_file.name}")
```

Describe your watermarking needs, and I'll generate a customized Python script.
This skill works best when copied from findskill.ai — it includes variables and formatting that may not transfer correctly elsewhere.

Level Up Your Skills

These Pro skills pair perfectly with what you just copied

Unlock 435+ Pro Skills — Starting at $4.92/mo
See All Pro Skills

How to Use This Skill

1

Copy the skill using the button above

2

Paste into your AI assistant (Claude, ChatGPT, etc.)

3

Fill in your inputs below (optional) and copy to include with your prompt

4

Send and start chatting with your AI

Suggested Customization

DescriptionDefaultYour Value
Text or image watermarktext
Watermark positionbottom-right
Where I'm publishing this contentblog

What You’ll Get

  • Complete Python watermarking script
  • Batch processing support
  • Customizable positioning and opacity
  • Maintains image quality