首頁 > 後端開發 > php教程 > PHP主|用Imagick添加文字水印

PHP主|用Imagick添加文字水印

Christopher Nolan
發布: 2025-02-25 16:13:09
原創
123 人瀏覽過

Imagick PHP擴展庫詳解:為圖片添加文本水印

本文將介紹如何使用PHP的Imagick擴展庫為圖片添加文本水印。我們將探討多種方法,包括簡單的文本疊加、使用字體蒙版創建透明文本水印,以及更高級的文字平鋪技術。

關鍵要點:

  • Imagick是一個強大的PHP擴展庫,可以用來處理圖像,包括添加文本水印。
  • 通過創建Imagick類實例,讀取圖像,並使用ImagickDraw實例設置字體屬性,然後使用annotateImage()方法將文本添加到圖像中,即可實現文本水印。
  • 有多種方法可以添加文本水印,包括直接在圖像上疊加文本字符串,使用字體蒙版創建透明文本水印,以及將文本平鋪在整個圖像上以提高水印移除難度。
  • ImagickDraw類提供了多種方法來自定義水印文本,例如setFillColor()更改字體顏色,setFontSize()更改字體大小,setFont()更改字體,setFillOpacity()添加透明度,以及annotateImage()定位和旋轉文本。

在之前的文章中,Timothy Boronczyk 介紹瞭如何使用Imagick和疊加圖像創建水印。本文將展示如何使用純文本實現類似效果。目前,PHP的Imagick API文檔非常匱乏,但ImageMagick網站上有很多命令行示例,我們將以此為起點。將命令行代碼轉換為PHP代碼只是找到執行相同功能的相應方法的問題。以下示例將使用一張隨機帥哥的圖片。

PHP Master | Adding Text Watermarks with Imagick

在圖像上繪製文本

最簡單的文本水印是直接在圖像上疊加字符串。命令行示例如下:

convert image.png  -font Arial -pointsize 20 \
    -draw "gravity south \
        fill black  text 0,12 'Copyright' \
        fill white  text 1,11 'Copyright'" \
    result.png
登入後複製
登入後複製
登入後複製

對應的PHP代碼:

<?php 
// 创建对象
$image = new Imagick('image.png');

// 水印文本
$text = 'Copyright';

// 创建新的绘图面板
$draw = new ImagickDraw();

// 设置字体属性
$draw->setFont('Arial');
$draw->setFontSize(20);
$draw->setFillColor('black');

// 将文本定位在图像的右下角
$draw->setGravity(Imagick::GRAVITY_SOUTHEAST);

// 在图像上绘制文本
$image->annotateImage($draw, 10, 12, 0, $text);

// 稍微偏移位置,使用不同的颜色再次绘制文本
$draw->setFillColor('white');
$image->annotateImage($draw, 11, 11, 0, $text);

// 设置输出图像格式
$image->setImageFormat('png');

// 输出新图像
header('Content-type: image/png');
echo $image;
?>
登入後複製
登入後複製
登入後複製

效果圖:

PHP Master | Adding Text Watermarks with Imagick

這個例子非常簡單,代碼註釋也很清晰。雖然有效,但文本與圖像對比度太強,效果不夠柔和。

使用字體蒙版創建透明文本

為了使水印文本效果更柔和,可以使用字體蒙版創建透明文本。命令行示例:

convert -size 300x50 xc:grey30 -font Arial -pointsize 20 \
    -gravity center -draw "fill grey70  text 0,0  'Copyright'" \
    fgnd.png
convert -size 300x50 xc:black -font Arial -pointsize 20 -gravity center \
    -draw "fill white  text  1,1  'Copyright' \
        text  0,0  'Copyright' \
        fill black  text -1,-1 'Copyright'" \
    +matte mask.png
composite -compose CopyOpacity  mask.png  fgnd.png  stamp.png 
    mogrify -trim +repage stamp.png
composite -gravity south -geometry +0+10 stamp.png  image.png \
    result.png
登入後複製
登入後複製
登入後複製

PHP代碼:

<?php
// 创建对象
$image = new Imagick('image.png');
$watermark = new Imagick();
$mask = new Imagick();
$draw = new ImagickDraw();

// 定义尺寸
$width = $image->getImageWidth();
$height = $image->getImageHeight();

// 创建调色板
$watermark->newImage($width, $height, new ImagickPixel('grey30'));
$mask->newImage($width, $height, new ImagickPixel('black'));

// 水印文本
$text = 'Copyright';

// 设置字体属性
$draw->setFont('Arial');
$draw->setFontSize(20);
$draw->setFillColor('grey70');

// 将文本定位在图像的右下角
$draw->setGravity(Imagick::GRAVITY_SOUTHEAST);

// 在水印调色板上绘制文本
$watermark->annotateImage($draw, 10, 12, 0, $text);

// 在蒙版调色板上绘制文本
$draw->setFillColor('white');
$mask->annotateImage($draw, 11, 13, 0, $text);
$mask->annotateImage($draw, 10, 12, 0, $text);
$draw->setFillColor('black');
$mask->annotateImage($draw, 9, 11, 0, $text);

// 这是蒙版生效的必要条件
$mask->setImageMatte(false);

// 将蒙版应用于水印
$watermark->compositeImage($mask, Imagick::COMPOSITE_COPYOPACITY, 0, 0);

// 将水印叠加到图像上
$image->compositeImage($watermark, Imagick::COMPOSITE_DISSOLVE, 0, 0);

// 设置输出图像格式
$image->setImageFormat('png');

// 输出新图像
header('Content-type: image/png');
echo $image;
?>
登入後複製
登入後複製
登入後複製

效果圖:

PHP Master | Adding Text Watermarks with Imagick

此示例創建了多個圖像。第一個圖像$watermark是灰度圖像,第二個圖像$mask使用純黑色表示要透明的部分,白色表示要保留的部分。當通過組合圖像應用蒙版時,由於抗鋸齒效果而在$mask中找到的任何灰色陰影都將是半透明的,從而產生更平滑的邊緣。在命令行版本代碼中,在疊加水印之前會裁剪透明圖像的外部邊緣,但似乎存在一個錯誤,阻止compositeImage()方法保留setGravity()定義的位置。這意味著如果裁剪邊緣,水印將失去其右下角的位置,並重新定位到左上角。為了解決此問題,創建的調色板與源圖像具有相同的尺寸,因此不會發生裁剪。

文本平鋪

最後一個示例將文本平鋪在整個圖像上,這使得移除水印更加困難。命令行:

convert image.png  -font Arial -pointsize 20 \
    -draw "gravity south \
        fill black  text 0,12 'Copyright' \
        fill white  text 1,11 'Copyright'" \
    result.png
登入後複製
登入後複製
登入後複製

PHP代碼:

<?php 
// 创建对象
$image = new Imagick('image.png');

// 水印文本
$text = 'Copyright';

// 创建新的绘图面板
$draw = new ImagickDraw();

// 设置字体属性
$draw->setFont('Arial');
$draw->setFontSize(20);
$draw->setFillColor('black');

// 将文本定位在图像的右下角
$draw->setGravity(Imagick::GRAVITY_SOUTHEAST);

// 在图像上绘制文本
$image->annotateImage($draw, 10, 12, 0, $text);

// 稍微偏移位置,使用不同的颜色再次绘制文本
$draw->setFillColor('white');
$image->annotateImage($draw, 11, 11, 0, $text);

// 设置输出图像格式
$image->setImageFormat('png');

// 输出新图像
header('Content-type: image/png');
echo $image;
?>
登入後複製
登入後複製
登入後複製

效果圖:

PHP Master | Adding Text Watermarks with Imagick

注意,這裡使用setFillOpacity()設置透明度,而不是使用圖像蒙版。

總結

對於我來說,PHP中的圖像處理已經成為該語言最令人愉快的方面之一,我希望Imagick能夠在未來的版本中捆綁在一起。如果您正在尋找貢獻方式,我鼓勵您將其他命令行示例轉換為PHP,然後將您的結果發佈到官方PHP手冊上,以便其他人學習和享受。

(圖片來自Fotolia)

(以下為FAQ,已根據原文調整格式及內容,並進行偽原創)

關於使用Imagick在PHP中添加文本水印的常見問題 (FAQ)

問:如何使用PHP中的Imagick向圖像添加文本水印?

答:使用PHP中的Imagick向圖像添加文本水印,首先需要創建一個Imagick類的實例,並將圖像讀取到其中。然後,創建一個ImagickDraw實例並設置字體屬性。之後,可以使用annotateImage()方法將文本添加到圖像中。最後,使用writeImage()方法將圖像寫入文件系統。以下是一個基本示例:

convert -size 300x50 xc:grey30 -font Arial -pointsize 20 \
    -gravity center -draw "fill grey70  text 0,0  'Copyright'" \
    fgnd.png
convert -size 300x50 xc:black -font Arial -pointsize 20 -gravity center \
    -draw "fill white  text  1,1  'Copyright' \
        text  0,0  'Copyright' \
        fill black  text -1,-1 'Copyright'" \
    +matte mask.png
composite -compose CopyOpacity  mask.png  fgnd.png  stamp.png 
    mogrify -trim +repage stamp.png
composite -gravity south -geometry +0+10 stamp.png  image.png \
    result.png
登入後複製
登入後複製
登入後複製

問:如何更改Imagick中水印文本的字體顏色?

答:可以使用ImagickDraw類的setFillColor()方法更改Imagick中水印文本的字體顏色。此方法接受表示顏色的字符串。例如,要將字體顏色設置為紅色,可以執行以下操作:

<?php
// 创建对象
$image = new Imagick('image.png');
$watermark = new Imagick();
$mask = new Imagick();
$draw = new ImagickDraw();

// 定义尺寸
$width = $image->getImageWidth();
$height = $image->getImageHeight();

// 创建调色板
$watermark->newImage($width, $height, new ImagickPixel('grey30'));
$mask->newImage($width, $height, new ImagickPixel('black'));

// 水印文本
$text = 'Copyright';

// 设置字体属性
$draw->setFont('Arial');
$draw->setFontSize(20);
$draw->setFillColor('grey70');

// 将文本定位在图像的右下角
$draw->setGravity(Imagick::GRAVITY_SOUTHEAST);

// 在水印调色板上绘制文本
$watermark->annotateImage($draw, 10, 12, 0, $text);

// 在蒙版调色板上绘制文本
$draw->setFillColor('white');
$mask->annotateImage($draw, 11, 13, 0, $text);
$mask->annotateImage($draw, 10, 12, 0, $text);
$draw->setFillColor('black');
$mask->annotateImage($draw, 9, 11, 0, $text);

// 这是蒙版生效的必要条件
$mask->setImageMatte(false);

// 将蒙版应用于水印
$watermark->compositeImage($mask, Imagick::COMPOSITE_COPYOPACITY, 0, 0);

// 将水印叠加到图像上
$image->compositeImage($watermark, Imagick::COMPOSITE_DISSOLVE, 0, 0);

// 设置输出图像格式
$image->setImageFormat('png');

// 输出新图像
header('Content-type: image/png');
echo $image;
?>
登入後複製
登入後複製
登入後複製

問:如何更改Imagick中水印文本的字體大小?

答:可以使用ImagickDraw類的setFontSize()方法更改Imagick中水印文本的字體大小。此方法接受表示字體大小的整數。例如,要將字體大小設置為30,可以執行以下操作:

convert image.png  -font Arial -pointsize 20 \
    -draw "gravity south \
        fill black  text 0,12 'Copyright' \
        fill white  text 1,11 'Copyright'" \
    result.png
登入後複製
登入後複製
登入後複製

問:如何更改Imagick中水印文本的字體?

答:可以使用ImagickDraw類的setFont()方法更改Imagick中水印文本的字體。此方法接受表示字體名稱的字符串。例如,要將字體設置為“Arial”,可以執行以下操作:

<?php 
// 创建对象
$image = new Imagick('image.png');

// 水印文本
$text = 'Copyright';

// 创建新的绘图面板
$draw = new ImagickDraw();

// 设置字体属性
$draw->setFont('Arial');
$draw->setFontSize(20);
$draw->setFillColor('black');

// 将文本定位在图像的右下角
$draw->setGravity(Imagick::GRAVITY_SOUTHEAST);

// 在图像上绘制文本
$image->annotateImage($draw, 10, 12, 0, $text);

// 稍微偏移位置,使用不同的颜色再次绘制文本
$draw->setFillColor('white');
$image->annotateImage($draw, 11, 11, 0, $text);

// 设置输出图像格式
$image->setImageFormat('png');

// 输出新图像
header('Content-type: image/png');
echo $image;
?>
登入後複製
登入後複製
登入後複製

問:如何定位Imagick中的水印文本?

答:可以使用Imagick類的annotateImage()方法設置Imagick中水印文本的位置。此方法接受四個參數:ImagickDraw實例、文本的x和y坐標、文本的旋轉角度和文本字符串。例如,要將文本定位在坐標(10, 45),可以執行以下操作:

convert -size 300x50 xc:grey30 -font Arial -pointsize 20 \
    -gravity center -draw "fill grey70  text 0,0  'Copyright'" \
    fgnd.png
convert -size 300x50 xc:black -font Arial -pointsize 20 -gravity center \
    -draw "fill white  text  1,1  'Copyright' \
        text  0,0  'Copyright' \
        fill black  text -1,-1 'Copyright'" \
    +matte mask.png
composite -compose CopyOpacity  mask.png  fgnd.png  stamp.png 
    mogrify -trim +repage stamp.png
composite -gravity south -geometry +0+10 stamp.png  image.png \
    result.png
登入後複製
登入後複製
登入後複製

問:如何旋轉Imagick中的水印文本?

答:可以使用Imagick類的annotateImage()方法設置Imagick中水印文本的旋轉角度。此方法的第四個參數是文本的旋轉角度。例如,要將文本旋轉45度,可以執行以下操作:

<?php
// 创建对象
$image = new Imagick('image.png');
$watermark = new Imagick();
$mask = new Imagick();
$draw = new ImagickDraw();

// 定义尺寸
$width = $image->getImageWidth();
$height = $image->getImageHeight();

// 创建调色板
$watermark->newImage($width, $height, new ImagickPixel('grey30'));
$mask->newImage($width, $height, new ImagickPixel('black'));

// 水印文本
$text = 'Copyright';

// 设置字体属性
$draw->setFont('Arial');
$draw->setFontSize(20);
$draw->setFillColor('grey70');

// 将文本定位在图像的右下角
$draw->setGravity(Imagick::GRAVITY_SOUTHEAST);

// 在水印调色板上绘制文本
$watermark->annotateImage($draw, 10, 12, 0, $text);

// 在蒙版调色板上绘制文本
$draw->setFillColor('white');
$mask->annotateImage($draw, 11, 13, 0, $text);
$mask->annotateImage($draw, 10, 12, 0, $text);
$draw->setFillColor('black');
$mask->annotateImage($draw, 9, 11, 0, $text);

// 这是蒙版生效的必要条件
$mask->setImageMatte(false);

// 将蒙版应用于水印
$watermark->compositeImage($mask, Imagick::COMPOSITE_COPYOPACITY, 0, 0);

// 将水印叠加到图像上
$image->compositeImage($watermark, Imagick::COMPOSITE_DISSOLVE, 0, 0);

// 设置输出图像格式
$image->setImageFormat('png');

// 输出新图像
header('Content-type: image/png');
echo $image;
?>
登入後複製
登入後複製
登入後複製

問:如何保存Imagick中的帶水印圖像?

答:可以使用Imagick類的writeImage()方法保存帶水印的圖像。此方法接受表示文件路徑的字符串。例如,要將圖像保存為“watermarked_image.png”,可以執行以下操作:

convert -size 140x80 xc:none -fill grey \
    -gravity NorthWest -draw "text 10,10 'Copyright'" \
    -gravity SouthEast -draw "text 5,15 'Copyright'" \
    miff:- | \
composite -tile - image.png  result.png
登入後複製

問:如何添加透明水印文本到Imagick?

答:可以使用ImagickDraw類的setFillOpacity()方法添加透明水印文本到Imagick。此方法接受表示不透明度級別的浮點數。例如,要將不透明度設置為0.5,可以執行以下操作:

<?php
// 创建对象
$image = new Imagick('image.png');
$watermark = new Imagick();

// 水印文本
$text = 'Copyright';

// 创建新的绘图面板
$draw = new ImagickDraw();
$watermark->newImage(140, 80, new ImagickPixel('none'));

// 设置字体属性
$draw->setFont('Arial');
$draw->setFillColor('grey');
$draw->setFillOpacity(.5);

// 将文本定位在水印的左上角
$draw->setGravity(Imagick::GRAVITY_NORTHWEST);

// 在水印上绘制文本
$watermark->annotateImage($draw, 10, 10, 0, $text);

// 将文本定位在水印的右下角
$draw->setGravity(Imagick::GRAVITY_SOUTHEAST);

// 在水印上绘制文本
$watermark->annotateImage($draw, 5, 15, 0, $text);

// 重复将水印叠加到图像上
for ($w = 0; $w < $image->getImageWidth(); $w += 140) {
    for ($h = 0; $h < $image->getImageHeight(); $h += 80) {
        $image->compositeImage($watermark, Imagick::COMPOSITE_OVER, $w, $h);
    }
}

// 设置输出图像格式
$image->setImageFormat('png');

// 输出新图像
header('Content-type: image/png');
echo $image;
?>
登入後複製

問:如何在Imagick中為水印文本添加陰影?

答:可以通過繪製兩次文本(一次用於陰影,一次用於文本本身)來在Imagick中為水印文本添加陰影。可以通過將填充顏色設置為黑色並偏移文本位置來創建陰影。例如:

$imagick = new \Imagick(realpath('image.png'));
$draw = new \ImagickDraw();
$draw->setFillColor('white');
$draw->setFont('Arial');
$draw->setFontSize(50);
$imagick->annotateImage($draw, 10, 45, 0, 'Watermark Text');
$imagick->writeImage('watermarked_image.png');
登入後複製

問:如何在Imagick中向多個圖像添加水印文本?

答:要向Imagick中的多個圖像添加水印文本,可以循環遍歷圖像並將水印應用於每個圖像。以下是一個基本示例:

$draw->setFillColor('red');
登入後複製

以上是PHP主|用Imagick添加文字水印的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板