Imagick PHP擴展庫詳解:為圖片添加文本水印
本文將介紹如何使用PHP的Imagick擴展庫為圖片添加文本水印。我們將探討多種方法,包括簡單的文本疊加、使用字體蒙版創建透明文本水印,以及更高級的文字平鋪技術。
關鍵要點:
annotateImage()
方法將文本添加到圖像中,即可實現文本水印。 setFillColor()
更改字體顏色,setFontSize()
更改字體大小,setFont()
更改字體,setFillOpacity()
添加透明度,以及annotateImage()
定位和旋轉文本。 在之前的文章中,Timothy Boronczyk 介紹瞭如何使用Imagick和疊加圖像創建水印。本文將展示如何使用純文本實現類似效果。目前,PHP的Imagick API文檔非常匱乏,但ImageMagick網站上有很多命令行示例,我們將以此為起點。將命令行代碼轉換為PHP代碼只是找到執行相同功能的相應方法的問題。以下示例將使用一張隨機帥哥的圖片。
在圖像上繪製文本
最簡單的文本水印是直接在圖像上疊加字符串。命令行示例如下:
<code class="language-bash">convert image.png -font Arial -pointsize 20 \ -draw "gravity south \ fill black text 0,12 'Copyright' \ fill white text 1,11 'Copyright'" \ result.png</code>
對應的PHP代碼:
<code class="language-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; ?></code>
效果圖:
這個例子非常簡單,代碼註釋也很清晰。雖然有效,但文本與圖像對比度太強,效果不夠柔和。
使用字體蒙版創建透明文本
為了使水印文本效果更柔和,可以使用字體蒙版創建透明文本。命令行示例:
<code class="language-bash">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</code>
PHP代碼:
<code class="language-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; ?></code>
效果圖:
此示例創建了多個圖像。第一個圖像$watermark
是灰度圖像,第二個圖像$mask
使用純黑色表示要透明的部分,白色表示要保留的部分。當通過組合圖像應用蒙版時,由於抗鋸齒效果而在$mask
中找到的任何灰色陰影都將是半透明的,從而產生更平滑的邊緣。在命令行版本代碼中,在疊加水印之前會裁剪透明圖像的外部邊緣,但似乎存在一個錯誤,阻止compositeImage()
方法保留setGravity()
定義的位置。這意味著如果裁剪邊緣,水印將失去其右下角的位置,並重新定位到左上角。為了解決此問題,創建的調色板與源圖像具有相同的尺寸,因此不會發生裁剪。
文本平鋪
最後一個示例將文本平鋪在整個圖像上,這使得移除水印更加困難。命令行:
<code class="language-bash">convert image.png -font Arial -pointsize 20 \ -draw "gravity south \ fill black text 0,12 'Copyright' \ fill white text 1,11 'Copyright'" \ result.png</code>
PHP代碼:
<code class="language-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; ?></code>
效果圖:
注意,這裡使用setFillOpacity()
設置透明度,而不是使用圖像蒙版。
總結
對於我來說,PHP中的圖像處理已經成為該語言最令人愉快的方面之一,我希望Imagick能夠在未來的版本中捆綁在一起。如果您正在尋找貢獻方式,我鼓勵您將其他命令行示例轉換為PHP,然後將您的結果發佈到官方PHP手冊上,以便其他人學習和享受。
(圖片來自Fotolia)
(以下為FAQ,已根據原文調整格式及內容,並進行偽原創)
關於使用Imagick在PHP中添加文本水印的常見問題 (FAQ)
問:如何使用PHP中的Imagick向圖像添加文本水印?
答:使用PHP中的Imagick向圖像添加文本水印,首先需要創建一個Imagick類的實例,並將圖像讀取到其中。然後,創建一個ImagickDraw實例並設置字體屬性。之後,可以使用annotateImage()方法將文本添加到圖像中。最後,使用writeImage()方法將圖像寫入文件系統。以下是一個基本示例:
<code class="language-bash">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</code>
問:如何更改Imagick中水印文本的字體顏色?
答:可以使用ImagickDraw類的setFillColor()方法更改Imagick中水印文本的字體顏色。此方法接受表示顏色的字符串。例如,要將字體顏色設置為紅色,可以執行以下操作:
<code class="language-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; ?></code>
問:如何更改Imagick中水印文本的字體大小?
答:可以使用ImagickDraw類的setFontSize()方法更改Imagick中水印文本的字體大小。此方法接受表示字體大小的整數。例如,要將字體大小設置為30,可以執行以下操作:
<code class="language-bash">convert image.png -font Arial -pointsize 20 \ -draw "gravity south \ fill black text 0,12 'Copyright' \ fill white text 1,11 'Copyright'" \ result.png</code>
問:如何更改Imagick中水印文本的字體?
答:可以使用ImagickDraw類的setFont()方法更改Imagick中水印文本的字體。此方法接受表示字體名稱的字符串。例如,要將字體設置為“Arial”,可以執行以下操作:
<code class="language-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; ?></code>
問:如何定位Imagick中的水印文本?
答:可以使用Imagick類的annotateImage()方法設置Imagick中水印文本的位置。此方法接受四個參數:ImagickDraw實例、文本的x和y坐標、文本的旋轉角度和文本字符串。例如,要將文本定位在坐標(10, 45),可以執行以下操作:
<code class="language-bash">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</code>
問:如何旋轉Imagick中的水印文本?
答:可以使用Imagick類的annotateImage()方法設置Imagick中水印文本的旋轉角度。此方法的第四個參數是文本的旋轉角度。例如,要將文本旋轉45度,可以執行以下操作:
<code class="language-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; ?></code>
問:如何保存Imagick中的帶水印圖像?
答:可以使用Imagick類的writeImage()方法保存帶水印的圖像。此方法接受表示文件路徑的字符串。例如,要將圖像保存為“watermarked_image.png”,可以執行以下操作:
<code class="language-bash">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</code>
問:如何添加透明水印文本到Imagick?
答:可以使用ImagickDraw類的setFillOpacity()方法添加透明水印文本到Imagick。此方法接受表示不透明度級別的浮點數。例如,要將不透明度設置為0.5,可以執行以下操作:
<code class="language-php"><?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; ?></code>
問:如何在Imagick中為水印文本添加陰影?
答:可以通過繪製兩次文本(一次用於陰影,一次用於文本本身)來在Imagick中為水印文本添加陰影。可以通過將填充顏色設置為黑色並偏移文本位置來創建陰影。例如:
<code class="language-php">$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');</code>
問:如何在Imagick中向多個圖像添加水印文本?
答:要向Imagick中的多個圖像添加水印文本,可以循環遍歷圖像並將水印應用於每個圖像。以下是一個基本示例:
<code class="language-php">$draw->setFillColor('red');</code>
以上是PHP主|用Imagick添加文字水印的詳細內容。更多資訊請關注PHP中文網其他相關文章!