ImageKit Watermark Positions: The 9 Supported Anchor Points
ImageKit supports nine distinct watermark anchor points including all four corners, four edge centers, and the image center, with South-East (lower-right) as the default position.
The hzbd/imagekit Rust library provides precise text overlay control through the WatermarkPosition enum. These imagekit watermark positions eliminate manual coordinate calculations by automatically aligning watermarks to predefined anchor points relative to the image boundaries.
Supported Watermark Positions
ImageKit defines nine anchor points in the WatermarkPosition enum located in src/cli.rs. The following positions are available via case-insensitive CLI arguments:
| Anchor Point | CLI Value | Screen Location |
|---|---|---|
| North-West | nw |
Upper-left corner |
| North | north |
Top edge, centered horizontally |
| North-East | ne |
Upper-right corner |
| West | west |
Left edge, centered vertically |
| Center | center |
Exact geometric center of image |
| East | east |
Right edge, centered vertically |
| South-West | sw |
Lower-left corner |
| South | south |
Bottom edge, centered horizontally |
| South-East | se |
Lower-right corner (default) |
The string parsing logic implemented in the FromStr trait within src/cli.rs accepts these values case-insensitively. If the user provides an invalid position, the parser returns a descriptive error defined in src/errors.rs.
Coordinate Calculation Logic
When applying a watermark, the library converts the abstract WatermarkPosition into concrete pixel coordinates within the add_watermark function in src/processor.rs. The implementation uses a match position block to determine the alignment, applying a consistent 10-pixel padding from the image edges to prevent text from touching the borders.
For corners and edges, the processor calculates the appropriate offset based on the text bounding box dimensions and the chosen anchor. If the specified text size exceeds image bounds, the library automatically scales the watermark to fit while preserving the selected position anchor.
Using Watermark Positions
Command Line Interface
You can specify positions via the --watermark-position argument in the CLI. The following examples demonstrate anchoring at different positions:
# Default position: South-East (lower-right)
imagekit -i ./input -o ./output --watermark-text "Demo"
# Explicitly set to top-center
imagekit -i ./input -o ./output \
--watermark-text "Demo" --watermark-position north
# Left edge center
imagekit -i ./input -o ./output \
--watermark-text "Demo" --watermark-position west
Rust API
In Rust code, import WatermarkPosition from the CLI module and pass it directly to add_watermark:
use imagekit::{processor::add_watermark, cli::WatermarkPosition};
use rusttype::Font;
// Assuming img is a DynamicImage and fonts are loaded
let position = WatermarkPosition::NorthEast; // Upper-right corner
add_watermark(&mut img, "Copyright 2024", &fonts, 24, position, color);
You can also parse positions from strings using the standard FromStr implementation:
use std::str::FromStr;
use imagekit::cli::WatermarkPosition;
let pos = WatermarkPosition::from_str("center")?; // Returns WatermarkPosition::Center
Error Handling
Invalid position strings trigger a specific error variant defined in src/errors.rs. The error message clearly indicates that the provided value does not match any supported anchor point, helping users correct typos or invalid inputs immediately.
Summary
- ImageKit provides nine watermark positions: four corners, four edge centers, and the image center
- The
WatermarkPositionenum is defined insrc/cli.rswith case-insensitive string parsing viaFromStr - South-East (
se) serves as the default position when none is specified in the CLI or API - Coordinate calculation occurs in
src/processor.rswith a standard 10-pixel padding from edges - Invalid positions generate descriptive errors from
src/errors.rs - Integration tests in
tests/integration_test.rsexercise all nine positions includingWatermarkPosition::SeandWatermarkPosition::Center
Frequently Asked Questions
What is the default watermark position in ImageKit?
South-East (se) is the default anchor point, placing the watermark in the lower-right corner of the image. This default is applied automatically when the --watermark-position argument is omitted in the CLI or when using default parameters in the Rust API.
Are watermark position arguments case-sensitive?
No. The FromStr implementation in src/cli.rs parses position strings case-insensitively, so North, north, and NORTH all resolve to WatermarkPosition::North.
How does ImageKit prevent watermarks from touching image edges?
The processor applies a 10-pixel padding buffer when calculating coordinates in src/processor.rs. This ensures text watermarks maintain consistent spacing from the image boundaries regardless of which anchor point is selected.
Where can I find examples of all watermark positions in use?
The integration test suite in tests/integration_test.rs contains test cases exercising each WatermarkPosition variant, including WatermarkPosition::Se, WatermarkPosition::Center, and others. These tests verify correct pixel placement for each anchor point.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →