首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP ImageMagick 實作平鋪背景水印:convert 命令與 Imagick 類別雙重示範

     編輯:PHP 相關知識

平鋪水印:讓版權標記佈滿整張圖片

平鋪水印將小尺寸水印圖案(含文字或 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 Imagick 物件導向實作

<?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)覆蓋合成(此處為自我合成固定結果)

進階:使用半透明 PNG Logo 平鋪

<?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。
  • 批次處理時改用 CLI 模式 php batch_watermark.php,避免 HTTP 逾時。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved