国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

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

PHP主|用Imagick添加文字水印

Feb 25, 2025 pm 04:13 PM

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

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

關鍵要點:

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

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

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 
// 創(chuàng)建對象
$image = new Imagick('image.png');

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

// 創(chuàng)建新的繪圖面板
$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

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

使用字體蒙版創(chuàng)建透明文本

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

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
// 創(chuàng)建對象
$image = new Imagick('image.png');
$watermark = new Imagick();
$mask = new Imagick();
$draw = new ImagickDraw();

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

// 創(chuàng)建調色板
$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

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

文本平鋪

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

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 
// 創(chuàng)建對象
$image = new Imagick('image.png');

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

// 創(chuàng)建新的繪圖面板
$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,然後將您的結果發(fā)佈到官方PHP手冊上,以便其他人學習和享受。

(圖片來自Fotolia)

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

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

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

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

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中水印文本的字體顏色。此方法接受表示顏色的字符串。例如,要將字體顏色設置為紅色,可以執(zhí)行以下操作:

<?php
// 創(chuàng)建對象
$image = new Imagick('image.png');
$watermark = new Imagick();
$mask = new Imagick();
$draw = new ImagickDraw();

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

// 創(chuàng)建調色板
$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中水印文本的字體大小。此方法接受表示字體大小的整數(shù)。例如,要將字體大小設置為30,可以執(zhí)行以下操作:

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”,可以執(zhí)行以下操作:

<?php 
// 創(chuàng)建對象
$image = new Imagick('image.png');

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

// 創(chuàng)建新的繪圖面板
$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中水印文本的位置。此方法接受四個參數(shù):ImagickDraw實例、文本的x和y坐標、文本的旋轉角度和文本字符串。例如,要將文本定位在坐標(10, 45),可以執(zhí)行以下操作:

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中水印文本的旋轉角度。此方法的第四個參數(shù)是文本的旋轉角度。例如,要將文本旋轉45度,可以執(zhí)行以下操作:

<?php
// 創(chuàng)建對象
$image = new Imagick('image.png');
$watermark = new Imagick();
$mask = new Imagick();
$draw = new ImagickDraw();

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

// 創(chuàng)建調色板
$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”,可以執(zhí)行以下操作:

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。此方法接受表示不透明度級別的浮點數(shù)。例如,要將不透明度設置為0.5,可以執(zhí)行以下操作:

<?php
// 創(chuàng)建對象
$image = new Imagick('image.png');
$watermark = new Imagick();

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

// 創(chuàng)建新的繪圖面板
$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中為水印文本添加陰影??梢酝ㄟ^將填充顏色設置為黑色並偏移文本位置來創(chuàng)建陰影。例如:

$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中的多個圖像添加水印文本,可以循環(huán)遍歷圖像並將水印應用於每個圖像。以下是一個基本示例:

$draw->setFillColor('red');

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

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權的內容,請聯(lián)絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何在PHP中實施身份驗證和授權? 如何在PHP中實施身份驗證和授權? Jun 20, 2025 am 01:03 AM

tosecurelyhandleauthenticationandationallizationInphp,lofterTheSesteps:1.AlwaysHashPasswordSwithPassword_hash()andverifyusingspasspassword_verify(),usepreparedStatatementStopreventsqlineptions,andStoreSeruserDatain usseruserDatain $ _sessiveferterlogin.2.implementrole-2.imaccessccsccccccccccccccccccccccccc.

如何在PHP中安全地處理文件上傳? 如何在PHP中安全地處理文件上傳? Jun 19, 2025 am 01:05 AM

要安全處理PHP中的文件上傳,核心在於驗證文件類型、重命名文件並限制權限。 1.使用finfo_file()檢查真實MIME類型,僅允許特定類型如image/jpeg;2.用uniqid()生成隨機文件名,存儲至非Web根目錄;3.通過php.ini和HTML表單限製文件大小,設置目錄權限為0755;4.使用ClamAV掃描惡意軟件,增強安全性。這些步驟有效防止安全漏洞,確保文件上傳過程安全可靠。

PHP中==(鬆散比較)和===(嚴格的比較)之間有什麼區(qū)別? PHP中==(鬆散比較)和===(嚴格的比較)之間有什麼區(qū)別? Jun 19, 2025 am 01:07 AM

在PHP中,==與===的主要區(qū)別在於類型檢查的嚴格程度。 ==在比較前會進行類型轉換,例如5=="5"返回true,而===要求值和類型都相同才會返回true,例如5==="5"返回false。使用場景上,===更安全應優(yōu)先使用,==僅在需要類型轉換時使用。

如何在PHP( - , *, /,%)中執(zhí)行算術操作? 如何在PHP( - , *, /,%)中執(zhí)行算術操作? Jun 19, 2025 pm 05:13 PM

PHP中使用基本數(shù)學運算的方法如下:1.加法用 號,支持整數(shù)和浮點數(shù),也可用於變量,字符串數(shù)字會自動轉換但不推薦依賴;2.減法用-號,變量同理,類型轉換同樣適用;3.乘法用*號,適用於數(shù)字及類似字符串;4.除法用/號,需避免除以零,並註意結果可能是浮點數(shù);5.取模用%號,可用於判斷奇偶數(shù),處理負數(shù)時餘數(shù)符號與被除數(shù)一致。正確使用這些運算符的關鍵在於確保數(shù)據(jù)類型清晰並處理好邊界情況。

如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進行交互? 如何與PHP的NOSQL數(shù)據(jù)庫(例如MongoDB,Redis)進行交互? Jun 19, 2025 am 01:07 AM

是的,PHP可以通過特定擴展或庫與MongoDB和Redis等NoSQL數(shù)據(jù)庫交互。首先,使用MongoDBPHP驅動(通過PECL或Composer安裝)創(chuàng)建客戶端實例並操作數(shù)據(jù)庫及集合,支持插入、查詢、聚合等操作;其次,使用Predis庫或phpredis擴展連接Redis,執(zhí)行鍵值設置與獲取,推薦phpredis用於高性能場景,Predis則便於快速部署;兩者均適用於生產環(huán)境且文檔完善。

我如何了解最新的PHP開發(fā)和最佳實踐? 我如何了解最新的PHP開發(fā)和最佳實踐? Jun 23, 2025 am 12:56 AM

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

什麼是PHP,為什麼它用於Web開發(fā)? 什麼是PHP,為什麼它用於Web開發(fā)? Jun 23, 2025 am 12:55 AM

PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

如何設置PHP時區(qū)? 如何設置PHP時區(qū)? Jun 25, 2025 am 01:00 AM

tosetTherightTimeZoneInphp,restate_default_timezone_set()functionAtthestArtofyourscriptWithavalIdidentIdentifiersuchas'america/new_york'.1.usedate_default_default_timezone_set_set()

See all articles