傳統浮水印功能通常固定位置(如右下角),但這樣可能遮蔽圖片重要內容。本文介紹一種基於 ImageMagick 擴充套件,根據圖片色階特徵智慧判斷最佳浮水印位置的實作方案。
<?php
function add_wm($nmw_water, $src_file, $output_file, $x, $y) {
// 若輸出檔案已存在則直接返回
if (file_exists($output_file)) return;
// 取得浮水印圖片尺寸
$w1 = MagickGetImageWidth($nmw_water);
$h1 = MagickGetImageHeight($nmw_water);
// 建立新的 MagickWand 物件讀取來源圖片
$nmw = NewMagickWand();
MagickReadImage($nmw, $src_file);
// 預設浮水印位置微調參數
$lt_w = 50;
$lt_h = 50;
// 根據傳入座標決定定位策略
if ($x == 0) {
// 自動模式:取得圖片尺寸作為基準點
$w = MagickGetImageWidth($nmw);
$h = MagickGetImageHeight($nmw);
$x = $w;
$y = $h;
} else {
// 手動模式:調整微調參數
$lt_w = 30;
$lt_h = 40;
}
// 合成浮水印(右下角偏移)
MagickCompositeImage($nmw, $nmw_water, MW_OverCompositeOp,
$x - $w1 - $lt_w, $y - $h1 - $lt_h);
MagickWriteImage($nmw, $output_file);
DestroyMagickWand($nmw);
}
提供遞迴處理目錄下所有圖片的功能,自動建立對應輸出目錄結構:
function add_wm_recurse($nmw_water, $to_dir, $output_dir, $arr) {
$dp = dir($to_dir);
while ($file = $dp->read()) {
if ($file != '.' && $file != '..') {
if (is_dir($to_dir . '/' . $file)) {
mkdir($output_dir . '/' . $file);
add_wm_recurse($nmw_water, $to_dir . '/' . $file,
$output_dir . '/' . $file, $arr);
} else {
// 處理圖片檔案...
}
}
}
$dp->close();
}
需安裝 PHP ImageMagick 擴充套件(php-imagick),並確認伺服器已安裝 ImageMagick 程式庫。現代專案也可考慮使用 GD 函數庫或介入式工具如 Intervention Image 套件。