Maison > développement back-end > tutoriel php > PHP Master | Ajouter des filigranes de texte avec Imagick

PHP Master | Ajouter des filigranes de texte avec Imagick

Christopher Nolan
Libérer: 2025-02-25 16:13:09
original
123 Les gens l'ont consulté

Explication détaillée de la bibliothèque d'extension PHP Imagrick: Ajouter un filigrane de texte aux images

Cet article présentera comment ajouter des filigranes de texte à des images à l'aide de la bibliothèque d'extension Imagick de PHP. Nous explorerons une variété de méthodes, y compris une superposition de texte simple, la création de filigranes de texte transparents à l'aide de masques de police et des techniques de carrelage de texte plus avancées.

Points clés:

  • Imagick est une puissante bibliothèque d'extensions PHP qui peut être utilisée pour traiter les images, notamment en ajoutant des filigranes de texte.
  • Le filigran de texte peut être réalisé en créant une instance de classe Imagick, en lisant une image, en définissant les propriétés de police à l'aide de l'instance ImagrickDraw, puis en ajoutant du texte à l'image à l'aide de la méthode annotateImage().
  • Il existe plusieurs façons d'ajouter des filigranes de texte, y compris des chaînes de texte superposées directement sur l'image, créant des filigranes de texte transparents avec des masques de police et du texte carrelé sur toute l'image pour rendre difficile l'élimination du filigrane.
  • La classe ImagrickDraw fournit plusieurs façons de personnaliser le texte de filigrane, tel que setFillColor() Modifier la couleur de la police, setFontSize() Changer la taille de la police, setFont() Changer la police, setFillOpacity() Ajouter la transparence et annotateImage() Position et rotation du texte.

Dans les articles précédents, Timothy Boronczyk a décrit comment créer des filigranes à l'aide d'images Imagrick et de superposition. Cet article montrera comment réaliser des effets similaires en utilisant du texte brut. Actuellement, la documentation de l'API Imagick de PHP est très rare, mais il existe de nombreux exemples de ligne de commande sur le site Web ImageMagick, avec lequel nous allons commencer. La conversion du code de ligne de commande en code PHP est juste une question de trouver la méthode correspondante pour effectuer la même fonction. L'exemple suivant utilisera une image de gars au hasard.

PHP Master | Adding Text Watermarks with Imagick

Dessinez du texte sur l'image

Le filigrane du texte le plus simple consiste à recouvrir les chaînes directement sur l'image. L'exemple de ligne de commande est le suivant:

convert image.png  -font Arial -pointsize 20 \
    -draw "gravity south \
        fill black  text 0,12 'Copyright' \
        fill white  text 1,11 'Copyright'" \
    result.png
Copier après la connexion
Copier après la connexion
Copier après la connexion

Code PHP réactif:

<?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;
?>
Copier après la connexion
Copier après la connexion
Copier après la connexion

image de reproduction:

PHP Master | Adding Text Watermarks with Imagick

Cet exemple est très simple et les commentaires du code sont très clairs. Bien que efficace, le contraste entre le texte et l'image est trop fort et l'effet n'est pas assez doux.

Créez du texte transparent à l'aide du masque de police

Pour rendre le texte de filigrane plus doux, vous pouvez utiliser un masque de police pour créer du texte transparent. Exemple de ligne de commande:

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
Copier après la connexion
Copier après la connexion
Copier après la connexion

Code 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;
?>
Copier après la connexion
Copier après la connexion
Copier après la connexion

image de reproduction:

PHP Master | Adding Text Watermarks with Imagick

Cet exemple crée plusieurs images. La première image $watermark est une image en niveaux de gris, la deuxième image $mask utilise du noir pur pour représenter la pièce comme transparente et blanche pour représenter la pièce à conserver. Lors de l'application de masques à travers une image combinée, toutes les ombres grises trouvées dans $mask en raison des effets anti-aliasing seront translucides, entraînant des bords plus lisses. Dans le code de version de la ligne de commande, les bords extérieurs de l'image transparente sont recadrés avant de recouvrir le filigrane, mais il semble y avoir un bug qui empêche la méthode compositeImage() de conserver l'emplacement défini par le setGravity(). Cela signifie que si le bord est recadré, le filigrane perdra sa position inférieure droite et se repositionnera dans le coin supérieur gauche. Pour résoudre ce problème, la palette de couleurs créée a la même taille que l'image source, donc aucune culture ne se produit.

Tiling texte

Le dernier exemple carrele le texte sur toute l'image, ce qui rend la suppression du filigrane encore plus difficile. Ligne de commande:

convert image.png  -font Arial -pointsize 20 \
    -draw "gravity south \
        fill black  text 0,12 'Copyright' \
        fill white  text 1,11 'Copyright'" \
    result.png
Copier après la connexion
Copier après la connexion
Copier après la connexion

Code 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;
?>
Copier après la connexion
Copier après la connexion
Copier après la connexion

image de reproduction:

PHP Master | Adding Text Watermarks with Imagick

Notez que la transparence est définie en utilisant setFillOpacity() ici, au lieu d'utiliser un masque d'image.

Résumé

Pour moi, le traitement d'image en PHP est devenu l'un des aspects les plus agréables de la langue et j'espère que Imagick sera regroupé dans les futures versions. Si vous cherchez des moyens de contribuer, je vous encourage à convertir d'autres exemples de ligne de commande en PHP, puis à publier vos résultats au manuel PHP officiel pour que d'autres puissent apprendre et apprécier.

(image de Fotolia)

(Ce qui suit est la FAQ, le format et le contenu ont été ajustés en fonction du texte d'origine, et des créations pseudo-originales ont été faites)

Des questions fréquemment posées sur l'ajout de filigranes de texte en PHP à l'aide d'Imagrick (FAQ)

Q: Comment ajouter un filigrane de texte à une image en utilisant Imagrick en PHP?

A: Utilisation d'Imagrick en PHP pour ajouter des filigranes de texte à une image, vous devez d'abord créer une instance de la classe Imagick et y lire l'image. Ensuite, créez une instance ImagrickDraw et définissez les propriétés de la police. Après cela, vous pouvez utiliser la méthode AnnotateImage () pour ajouter du texte à l'image. Enfin, utilisez la méthode writeImage () pour écrire l'image dans le système de fichiers. Voici un exemple de base:

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
Copier après la connexion
Copier après la connexion
Copier après la connexion

Q: Comment changer la couleur de la police du texte du filigrane dans Imagick?

A: Vous pouvez utiliser la méthode SetFillColor () de la classe ImagrickDraw pour modifier la couleur de la police du texte de filigrane dans Imagick. Cette méthode accepte les chaînes représentant des couleurs. Par exemple, pour définir la couleur de la police en rouge, vous pouvez effectuer ce qui suit:

<?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;
?>
Copier après la connexion
Copier après la connexion
Copier après la connexion

Q: Comment changer la taille de la police du texte du filigrane dans Imagick?

A: Vous pouvez utiliser la méthode setFontsize () de la classe ImagrickDraw pour modifier la taille de la police du texte de filigrane dans Imagick. Cette méthode accepte les entiers représentant la taille de la police. Par exemple, pour régler la taille de la police sur 30, vous pouvez effectuer ce qui suit:

convert image.png  -font Arial -pointsize 20 \
    -draw "gravity south \
        fill black  text 0,12 'Copyright' \
        fill white  text 1,11 'Copyright'" \
    result.png
Copier après la connexion
Copier après la connexion
Copier après la connexion

Q: Comment changer la police du texte du filigrane dans Imagick?

A: Vous pouvez utiliser la méthode SetFont () de la classe ImagrickDraw pour modifier la police du texte de filigrane dans Imagick. Cette méthode accepte les chaînes représentant le nom de police. Par exemple, pour définir la police sur "Arial", vous pouvez effectuer ce qui suit:

<?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;
?>
Copier après la connexion
Copier après la connexion
Copier après la connexion

Q: Comment localiser le texte de filigrane dans Imagick?

A: Vous pouvez utiliser la méthode AnnotateImage () de la classe Imagrick pour définir la position du texte de filigrane dans Imagick. Cette méthode accepte quatre paramètres: instance ImagrickDraw, coordonnées x et y du texte, angle de rotation du texte et chaîne de texte. Par exemple, pour positionner le texte aux coordonnées (10, 45), vous pouvez effectuer ce qui suit:

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
Copier après la connexion
Copier après la connexion
Copier après la connexion

Q: Comment faire tourner le texte de filigrane dans Imagick?

A: Vous pouvez utiliser la méthode AnnotateImage () de la classe Imagrick pour définir l'angle de rotation du texte de filigrane dans Imagick. Le quatrième paramètre de cette méthode est l'angle de rotation du texte. Par exemple, pour faire pivoter le texte de 45 degrés, vous pouvez effectuer ce qui suit:

<?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;
?>
Copier après la connexion
Copier après la connexion
Copier après la connexion

Q: Comment économiser des images filigranées dans Imagick?

A: Vous pouvez utiliser la méthode writeImage () de la classe Imagick pour sauver l'image de filigrane. Cette méthode accepte une chaîne représentant le chemin de fichier. Par exemple, pour sauver une image comme "watermarked_image.png", vous pouvez effectuer ce qui suit:

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
Copier après la connexion

Q: Comment ajouter un texte de filigrane transparent à Imagick?

A: Vous pouvez utiliser la méthode SetFillopacity () de la classe ImagrickDraw pour ajouter du texte de filigrane transparent à Imagick. Cette méthode accepte les nombres de points flottants représentant le niveau d'opacité. Par exemple, pour définir l'opacité à 0,5, vous pouvez effectuer ce qui suit:

<?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;
?>
Copier après la connexion

Q: Comment ajouter des ombres au texte de filigrane dans Imagick?

A: Vous pouvez ajouter des ombres au texte de filigrane dans Imagick en dessinant le texte deux fois (une fois pour les ombres, une fois pour le texte lui-même). Les ombres peuvent être créées en définissant la couleur de remplissage en noir et en compensant la position du texte. Par exemple:

$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');
Copier après la connexion

Q: Comment ajouter du texte de filigrane à plusieurs images dans Imagick?

A: Pour ajouter du texte de filigrane à plusieurs images dans Imagick, vous pouvez parcourir l'image et appliquer le filigrane à chaque image. Voici un exemple de base:

$draw->setFillColor('red');
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal