• 1 Post
  • 1 Comment
Joined 2 years ago
cake
Cake day: July 30th, 2023

help-circle
  • Try this Python script:

    from PIL import Image, ImageDraw, ImageFont
    import os
    from pathlib import Path
    
    def watermark_from_filename(input_dir, output_dir=None, 
                               position='bottom-right', 
                               font_size=36,
                               color='white',
                               opacity=200):
        """
        Add watermark to images using their filename (without extension)
        
        Args:
            input_dir: Directory containing images
            output_dir: Output directory (if None, creates 'watermarked' subfolder)
            position: 'bottom-right', 'bottom-left', 'top-right', 'top-left', 'center'
            font_size: Size of the watermark text
            color: Color of the text ('white', 'black', or RGB tuple)
            opacity: Transparency (0-255, 255 is fully opaque)
        """
        
        # Setup directories
        input_path = Path(input_dir)
        if output_dir is None:
            output_path = input_path / 'watermarked'
        else:
            output_path = Path(output_dir)
        
        output_path.mkdir(exist_ok=True)
        
        # Supported image formats
        supported_formats = {'.jpg', '.jpeg', '.png', '.tiff', '.bmp'}
        
        # Process each image
        for img_file in input_path.iterdir():
            if img_file.suffix.lower() not in supported_formats:
                continue
                
            print(f"Processing: {img_file.name}")
            
            # Open image
            img = Image.open(img_file)
            
            # Convert to RGBA if needed (for transparency support)
            if img.mode != 'RGBA':
                img = img.convert('RGBA')
            
            # Create transparent overlay
            txt_layer = Image.new('RGBA', img.size, (255, 255, 255, 0))
            draw = ImageDraw.Draw(txt_layer)
            
            # Get filename without extension
            watermark_text = img_file.stem
            
            # Try to load a nice font, fall back to default if not available
            try:
                font = ImageFont.truetype("arial.ttf", font_size)
            except:
                try:
                    font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", font_size)
                except:
                    font = ImageFont.load_default()
            
            # Get text size using textbbox
            bbox = draw.textbbox((0, 0), watermark_text, font=font)
            text_width = bbox[2] - bbox[0]
            text_height = bbox[3] - bbox[1]
            
            # Calculate position
            margin = 20
            if position == 'bottom-right':
                x = img.width - text_width - margin
                y = img.height - text_height - margin
            elif position == 'bottom-left':
                x = margin
                y = img.height - text_height - margin
            elif position == 'top-right':
                x = img.width - text_width - margin
                y = margin
            elif position == 'top-left':
                x = margin
                y = margin
            elif position == 'center':
                x = (img.width - text_width) // 2
                y = (img.height - text_height) // 2
            else:
                x = img.width - text_width - margin
                y = img.height - text_height - margin
            
            # Convert color name to RGB if needed
            if color == 'white':
                rgb_color = (255, 255, 255, opacity)
            elif color == 'black':
                rgb_color = (0, 0, 0, opacity)
            else:
                rgb_color = (*color, opacity) if isinstance(color, tuple) else (255, 255, 255, opacity)
            
            # Draw text
            draw.text((x, y), watermark_text, font=font, fill=rgb_color)
            
            # Composite the watermark onto the image
            watermarked = Image.alpha_composite(img, txt_layer)
            
            # Convert back to RGB for JPEG
            if img_file.suffix.lower() in {'.jpg', '.jpeg'}:
                watermarked = watermarked.convert('RGB')
            
            # Save
            output_file = output_path / img_file.name
            watermarked.save(output_file, quality=95)
            print(f"Saved: {output_file.name}")
        
        print(f"\nDone! Watermarked images saved to: {output_path}")
    
    # Example usage:
    if __name__ == "__main__":
        # Watermark all images in current directory
        watermark_from_filename(
            input_dir=".",
            position='bottom-right',
            font_size=48,
            color='white',
            opacity=200
        )
    

    To use this script:

    1. Install Pillow: pip install Pillow

    2. Save the script as watermark_dates.py

    3. Run it in your image directory:

      python watermark_dates.py
      

    Customization options:

    • position: Choose where the watermark appears
    • font_size: Adjust text size
    • color: ‘white’, ‘black’, or RGB tuple like (255, 0, 0) for red
    • opacity: 0-255 (lower = more transparent)