Skip to content

addWatermark()

Adds a watermark to an image with flexible positioning and diagonal-based scaling.

public function addWatermark(
string $inputImagePath,
string $outputImagePath,
string $watermarkImagePath,
string $position = 'center',
int $scalePercent = 10
): void

Path to the input image file.

Path where the watermarked image will be saved.

Path to the watermark image file. PNG with transparency recommended.

Watermark position. Default: 'center'

Valid values:

  • 'center' - Center of image
  • 'top' - Top center
  • 'bottom' - Bottom center
  • 'left' - Left center
  • 'right' - Right center
  • 'top-left' - Top left corner
  • 'top-right' - Top right corner
  • 'bottom-left' - Bottom left corner
  • 'bottom-right' - Bottom right corner

Watermark size as percentage of image diagonal. Default: 10

  • Recommended: 5-30
  • Smaller values = subtle watermark
  • Larger values = prominent watermark

Returns void. Creates the output file with watermark.

Watermark size is calculated based on the image’s diagonal length:

diagonal = √(width² + height²)
watermark_width = (scalePercent / 100) × diagonal
watermark_height = watermark_width × (original_watermark_height / original_watermark_width)

This ensures consistent appearance across different image sizes and orientations.

Watermark aspect ratio is always preserved.

use Kenura\Imagick\ImageProcessor;
$processor = new ImageProcessor();
$processor->addWatermark(
'photo.jpg',
'watermarked.jpg',
'logo.png',
'bottom-right',
10
);
$positions = [
'center', 'top', 'bottom', 'left', 'right',
'top-left', 'top-right', 'bottom-left', 'bottom-right'
];
foreach ($positions as $position) {
$processor->addWatermark(
'photo.jpg',
"watermarked-{$position}.jpg",
'logo.png',
$position,
10
);
}
// Small, subtle watermark
$processor->addWatermark('photo.jpg', 'small.jpg', 'logo.png', 'bottom-right', 5);
// Medium watermark
$processor->addWatermark('photo.jpg', 'medium.jpg', 'logo.png', 'bottom-right', 10);
// Large, prominent watermark
$processor->addWatermark('photo.jpg', 'large.jpg', 'logo.png', 'center', 25);
$images = glob('photos/*.jpg');
$watermark = 'assets/watermark.png';
foreach ($images as $image) {
$filename = basename($image);
$processor->addWatermark(
$image,
"watermarked/{$filename}",
$watermark,
'bottom-right',
10
);
}
┌─────────────────────────────────┐
│ top-left top top-right│
│ │
│ │
│ left center right│
│ │
│ │
│bottom-left bottom bottom-right│
└─────────────────────────────────┘
// ✅ Good: PNG with transparency
$processor->addWatermark('photo.jpg', 'out.jpg', 'logo.png', 'bottom-right', 10);
// ⚠️ OK: JPEG watermark (no transparency)
$processor->addWatermark('photo.jpg', 'out.jpg', 'logo.jpg', 'bottom-right', 10);
// Create transparent watermark first
$processor->addOpacity('logo.png', 'watermark.png', 50);
// Then apply
$processor->addWatermark('photo.jpg', 'out.jpg', 'watermark.png', 'bottom-right', 10);
Use CaseScale %Description
Copyright protection5-8Small, corner placement
Branding10-15Medium, visible but not intrusive
Preview watermark20-30Large, center placement

Solution: Adjust $scalePercent parameter

// Too small? Increase scale
$processor->addWatermark('photo.jpg', 'out.jpg', 'logo.png', 'center', 20);
// Too large? Decrease scale
$processor->addWatermark('photo.jpg', 'out.jpg', 'logo.png', 'corner', 5);

Cause: Watermark color blends with image

Solution: Use contrasting colors or add opacity