Observed since 20 Oct, 19:25 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
Python CLI for batch image watermarking with logo or text
Python CLI for batch image watermarking with logo or text.
wmk is built for people searching "how to add watermark to image", "add watermark to photo", "put watermark on picture", "add logo to image", "add text watermark to photo", "batch watermark images", "watermark multiple photos at once", and "protect photos with watermark".
pipx install add-watermark
wmk add
# Expert one-liner: add text watermark to photo
wmk add --input ".\photo.jpg" --text "(c) ACME" --pos br --opacity 40
PyPI package name: add-watermark; CLI commands: wmk (primary) and add-watermark (alias).
pipx install add-watermark
If pipx is not on PATH yet:
pipx ensurepath
python -m pip install add-watermark
git clone https://github.com/ibrahimm7004/add-watermark.git
cd add-watermark
Install from this repo with pipx:
pipx install .
Install from this repo with pip:
python -m pip install .
pipx uninstall add-watermark
python -m pip uninstall add-watermark
You can also run the beginner-friendly alias:
add-watermark add
This project follows Semantic Versioning (MAJOR.MINOR.PATCH):
MAJOR: breaking CLI/API changesMINOR: backward-compatible featuresPATCH: backward-compatible fixesCheck the installed CLI version:
wmk --version
| Before | After |
|---|---|
![]() | ![]() |
Regenerate both demo images:
python examples/generate_examples.py
Beginner wizard:
wmk add
Single image with text watermark:
wmk add --input ".\photo.jpg" --text "(c) ACME Studio" --pos br --opacity 40
Single image with logo watermark:
wmk add --input ".\photo.jpg" --watermark ".\logo.png" --pos tr --opacity 35
Batch watermark folder:
wmk add --input ".\photos" --watermark ".\logo.png" --pos br --opacity 35
Batch watermark folder recursively:
wmk add --input ".\photos" --recursive --text "(c) ACME" --pos br --opacity 35
Glob input:
wmk add --input ".\photos\**\*.png" --watermark ".\logo.png" --opacity 35
Dry run (plan only):
wmk add --input ".\photos" --watermark ".\logo.png" --dry-run
wmk add defaults (from current implementation):
br35 (0 is invisible, 100 is fully visible)24px20% of base image width, clamped to at least 48px and at most 80% of base width5% of image width, clamped to 16..256<input_stem>_watermarked.<ext> next to inputwatermarked/ next to the input folder./watermarked/ in current working directory./watermarked/--overwrite, existing destination paths are not replaced; a _watermarked suffix is appended to avoid collisions--input "C:\Users\me\My Photos\photo 01.jpg"--input ".\photos\**\*.jpg"wmk add --input ".\My Photos\Client A" --recursive --text "(c) ACME" --pos br --opacity 35
wmk add --input ".\My Photos\*.jpg" --watermark ".\brand logo.png" --pos tr --opacity 35
If you are searching for "add watermark to image online free", an offline CLI is often better for production workflows:
jpg, jpeg, png, webp, tiff, bmp, gifwmk add [OPTIONS]
Options:
--input, -i File path, folder path, or glob pattern
--output, -o Output file (single mode) or output folder (batch mode)
--watermark, -w Watermark image path
--text, -t Text watermark content
--pos Watermark position: tl|tr|bl|br|c
--opacity Opacity 0-100 (0 invisible, 100 fully visible)
--recursive Recurse subfolders for folder input
--overwrite Overwrite existing outputs
--dry-run Print planned outputs without writing files
--verbose Show traceback/debug details
Validation rules:
--watermark or --text in non-interactive mode--input is missing, wizard prompts for required fieldsCLI is the primary interface. If you need direct Python usage:
from pathlib import Path
from watermarker.engine import process_single
process_single(
input_path=Path("photo.jpg"),
output_path=Path("photo_watermarked.jpg"),
text="(c) ACME",
position="br",
opacity=35,
overwrite=True,
)
.github/workflows/ci.ymlpytest suite for position logic, opacity mapping, and integration behaviorruff check . and ruff format --check .CONTRIBUTING.mdCODE_OF_CONDUCT.mdCHANGELOG.mdMITwmk command is not found on Windowspipx installs, run pipx ensurepath and restart terminal.pip installs, ensure your Python Scripts directory is on PATH.python -m pip install -e .[dev]
ruff check .
ruff format --check .
pytest
Download counts and popularity will appear here as the collector receives them.
| Version | Published | Direct dependencies | Open version |
|---|---|---|---|
| 0.1.1 | 19 Feb 2026 | 5 |
This describes our collected data; it is not a security assessment.
Shared repository data · GitHub
Observed since 20 Oct, 19:25 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:bbeafc1f2ac6c04d7972949001d2af3f310dda3484d02c9b045668f0ed0b915c