平鋪水印將小尺寸水印圖案(含文字或 Logo)重複排列覆蓋整張圖片,常用於圖庫版權保護。ImageMagick 的 composite -tile 指令與 PHP Imagick 的 textureImage() 方法均可實現,本文提供雙重示範。
convert -size 140x80 xc:none -fill grey \ -gravity northwest -draw "text 10,10 'copyright'" \ -gravity southeast -draw "text 5,15 'copyright'" \ miff:- | composite -tile - logo.jpg wmark_text_tiled.jpg
解析:先建立 140×80 透明畫布,繪製兩處灰色文字,輸出為 MIFF 串流,再以 composite -tile 平鋪合成至 logo.jpg。
<?php
// 1. 載入主圖
$image = new Imagick('logo.jpg');
// 2. 建立水印圖案(140x80 透明底)
$mark = new Imagick();
$mark->newImage(140, 80, new ImagickPixel('none'));
// 3. 繪製水印內容
$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('grey'));
$draw->setGravity(Imagick::GRAVITY_NORTHWEST);
$draw->annotation(10, 10, 'copyright');
$draw->setGravity(Imagick::GRAVITY_SOUTHEAST);
$draw->annotation(5, 15, 'copyright');
$mark->drawImage($draw);
// 4. 將水印圖案轉為紋理並合成
$image = $image->textureImage($mark); // 關鍵:平鋪
$image->compositeImage($image, Imagick::COMPOSITE_COPY, 0, 0);
// 5. 輸出
header("Content-Type: image/{$image->getImageFormat()}");
$image->writeImage('wmark_text_tiled.jpg');
$image->clear();
$image->destroy();
?>
| 方法 | 用途 |
|---|---|
newImage(w, h, $color) | 建立新畫布 |
drawImage($draw) | 套用繪圖指令 |
textureImage($pattern) | 將 $pattern 平鋪填充當前圖片 |
compositeImage($src, COMPOSITE_COPY, x, y) | 覆蓋合成(此處為自我合成固定結果) |
<?php
$logo = new Imagick('watermark.png'); // 含 Alpha 通道
$logo->resizeImage(80, 80, Imagick::FILTER_LANCZOS, 1);
$main = new Imagick('photo.jpg');
$main = $main->textureImage($logo); // 直接平鋪 Logo
header("Content-Type: image/jpeg");
echo $main->getImagesBlob();
?>
pecl install imagick 版本相容 PHP 版本(PHP 8.x 需 imagick 3.6+)。Imagick::setResourceLimit(Imagick::RESOURCETYPE_MEMORY, 256*1024*1024) 限制 256MB。php batch_watermark.php,避免 HTTP 逾時。