Rumah > pembangunan bahagian belakang > tutorial php > PHP Master | Menambah tanda air teks dengan imagick

PHP Master | Menambah tanda air teks dengan imagick

Christopher Nolan
Lepaskan: 2025-02-25 16:13:09
asal
123 orang telah melayarinya

Penjelasan terperinci mengenai Perpustakaan Tambahan PHP Imagin: Tambahkan Teks Watermark ke Imej

Artikel ini akan memperkenalkan cara menambah tanda air teks kepada imej menggunakan perpustakaan Imagner Extension PHP. Kami akan meneroka pelbagai kaedah, termasuk lapisan teks mudah, mewujudkan tanda air teks telus menggunakan topeng fon, dan teknik jubin teks yang lebih maju.

Mata utama:

  • Imagick adalah perpustakaan lanjutan PHP yang kuat yang boleh digunakan untuk memproses imej, termasuk menambah tanda air teks.
  • Teks watermarking boleh dicapai dengan membuat contoh kelas Imagick, membaca imej, menetapkan sifat font menggunakan contoh ImagickDraw, dan kemudian menambah teks ke imej menggunakan kaedah annotateImage().
  • Terdapat beberapa cara untuk menambah tanda air teks, termasuk rentetan teks overlay secara langsung pada imej, mewujudkan tanda air teks telus dengan topeng fon, dan teks jubin di seluruh imej untuk membuat penyingkiran watermark sukar.
  • Kelas ImagickDraw menyediakan pelbagai cara untuk menyesuaikan teks watermark, seperti setFillColor() menukar warna fon, setFontSize() menukar saiz fon, setFont() font perubahan, setFillOpacity() Tambah ketelusan, dan annotateImage() kedudukan dan putar teks.

Dalam artikel sebelumnya, Timothy Boronczyk menggambarkan cara membuat tanda air menggunakan imej imagick dan overlay. Artikel ini akan menunjukkan bagaimana untuk mencapai kesan yang sama menggunakan teks biasa. Pada masa ini, dokumentasi API Imaget PHP sangat terhad, tetapi terdapat banyak contoh baris arahan di laman web ImageMagick, yang akan kita mulakan. Menukar kod baris perintah ke kod PHP hanya satu perkara untuk mencari kaedah yang sama untuk melaksanakan fungsi yang sama. Contoh berikut akan menggunakan gambar lelaki kacak rawak.

PHP Master | Adding Text Watermarks with Imagick

Lukis teks pada imej

Teks Watermark yang paling mudah adalah untuk melayari rentetan secara langsung pada imej. Contoh baris arahan adalah seperti berikut:

convert image.png  -font Arial -pointsize 20 \
    -draw "gravity south \
        fill black  text 0,12 'Copyright' \
        fill white  text 1,11 'Copyright'" \
    result.png
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
kod php responsif:

<?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;
?>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Gambar pembiakan:

PHP Master | Adding Text Watermarks with Imagick Contoh ini sangat mudah dan komen kod sangat jelas. Walaupun berkesan, perbezaan antara teks dan imej terlalu kuat dan kesannya tidak cukup lembut.

Buat teks telus menggunakan topeng font

Untuk membuat teks watermark lebih lembut, anda boleh menggunakan topeng font untuk membuat teks telus. Contoh baris arahan:

PHP CODE:
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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Gambar pembiakan:
<?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;
?>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Contoh ini mencipta pelbagai imej. Imej pertama $watermark adalah imej skala kelabu, imej kedua $mask menggunakan hitam tulen untuk mewakili bahagian untuk menjadi telus dan putih untuk mewakili bahagian yang akan dikekalkan. Apabila memohon topeng melalui imej gabungan, mana-mana bayang-bayang kelabu yang terdapat dalam $mask kerana kesan anti-aliasing akan ditransfer, mengakibatkan tepi yang lebih lancar. Dalam kod versi baris arahan, tepi luar imej telus dipotong sebelum melapisi tanda air, tetapi nampaknya ada bug yang menghalang kaedah compositeImage() daripada mengekalkan lokasi yang ditakrifkan oleh setGravity(). Ini bermakna jika kelebihannya dipotong, tanda air akan kehilangan kedudukan kanannya yang lebih rendah dan meletakkan semula ke sudut kiri atas. Untuk menyelesaikan masalah ini, palet warna yang dicipta mempunyai saiz yang sama dengan imej sumber, jadi tiada tanaman berlaku.

jubin teks

Contoh terakhir jubin teks merentasi keseluruhan imej, yang membuat mengeluarkan watermark bahkan lebih sukar. Baris perintah:

convert image.png  -font Arial -pointsize 20 \
    -draw "gravity south \
        fill black  text 0,12 'Copyright' \
        fill white  text 1,11 'Copyright'" \
    result.png
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

PHP CODE:

<?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;
?>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Gambar pembiakan:

PHP Master | Adding Text Watermarks with Imagick

Perhatikan bahawa ketelusan ditetapkan menggunakan

di sini, bukannya menggunakan topeng imej. setFillOpacity()

Ringkasan

Bagi saya, pemprosesan imej di PHP telah menjadi salah satu aspek yang paling menyeronokkan dalam bahasa dan saya berharap Imagick akan dibundel bersama dalam versi masa depan. Jika anda mencari cara untuk menyumbang, saya menggalakkan anda untuk menukar contoh baris arahan lain ke PHP dan kemudian menyiarkan hasil anda kepada manual PHP rasmi untuk orang lain belajar dan menikmati.

(gambar dari fotolia)

(berikut adalah FAQ, format dan kandungan telah diselaraskan mengikut teks asal, dan ciptaan pseudo-asal telah dibuat)

Soalan -soalan yang sering ditanya mengenai penambahan air teks dalam PHP menggunakan Imagick (FAQ)

Q: Bagaimana Menambah Teks Watermark ke Imej Menggunakan Imagik dalam PHP?

A: Menggunakan Imagick dalam PHP untuk menambah tanda air teks ke imej, anda perlu membuat contoh kelas Imagik dan membaca imej ke dalamnya. Kemudian, buat contoh ImagickDraw dan tetapkan sifat fon. Selepas itu, anda boleh menggunakan kaedah AnnotateImage () untuk menambah teks ke imej. Akhirnya, gunakan kaedah WriteImage () untuk menulis imej ke sistem fail. Berikut adalah contoh asas:

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Q: Bagaimana menukar warna fon teks watermark dalam Imagick?

A: Anda boleh menggunakan kaedah setfillColor () kelas imagickdraw untuk menukar warna fon teks watermark dalam Imagick. Kaedah ini menerima rentetan yang mewakili warna. Sebagai contoh, untuk menetapkan warna fon menjadi merah, anda boleh melakukan perkara berikut:

<?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;
?>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Q: Bagaimana menukar saiz fon teks watermark dalam Imagick?

A: Anda boleh menggunakan kaedah setFontsize () kelas ImagickDraw untuk menukar saiz fon teks watermark dalam Imagick. Kaedah ini menerima bilangan bulat yang mewakili saiz fon. Sebagai contoh, untuk menetapkan saiz fon hingga 30, anda boleh melakukan perkara berikut:

convert image.png  -font Arial -pointsize 20 \
    -draw "gravity south \
        fill black  text 0,12 'Copyright' \
        fill white  text 1,11 'Copyright'" \
    result.png
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Q: Bagaimana menukar fon teks watermark dalam Imagick?

A: Anda boleh menggunakan kaedah setFont () kelas ImagickDraw untuk menukar fon teks watermark dalam Imagick. Kaedah ini menerima rentetan yang mewakili nama font. Sebagai contoh, untuk menetapkan fon kepada "arial", anda boleh melakukan perkara berikut:

<?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;
?>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Q: Bagaimana untuk mencari teks watermark dalam Imagick?

A: Anda boleh menggunakan kaedah AnnotateImage () kelas Imaget untuk menetapkan kedudukan teks watermark dalam Imagick. Kaedah ini menerima empat parameter: contoh ImagickDraw, koordinat x dan y teks, sudut putaran teks, dan rentetan teks. Sebagai contoh, untuk meletakkan teks pada koordinat (10, 45), anda boleh melakukan perkara berikut:

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
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Q: Bagaimana cara memutar teks watermark dalam Imagick?

A: Anda boleh menggunakan kaedah AnnotateImage () kelas Imagik untuk menetapkan sudut putaran teks watermark dalam Imagick. Parameter keempat kaedah ini adalah sudut putaran teks. Sebagai contoh, untuk memutar teks dengan 45 darjah, anda boleh melakukan perkara berikut:

<?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;
?>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Q: Bagaimana untuk menyelamatkan imej air di Imagick?

A: Anda boleh menggunakan kaedah WriteImage () kelas Imaget untuk menyelamatkan imej watermark. Kaedah ini menerima rentetan yang mewakili laluan fail. Sebagai contoh, untuk menyimpan imej sebagai "watermarked_image.png", anda boleh melakukan perkara berikut:

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
Salin selepas log masuk

Q: Bagaimana untuk menambah teks watermark telus ke Imagyck?

A: Anda boleh menggunakan kaedah setfillopacity () kelas imagickdraw untuk menambah teks watermark telus ke Imagick. Kaedah ini menerima nombor titik terapung yang mewakili tahap kelegapan. Sebagai contoh, untuk menetapkan kelegapan kepada 0.5, anda boleh melakukan perkara berikut:

<?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;
?>
Salin selepas log masuk

Q: Bagaimana untuk menambah bayang -bayang ke teks watermark dalam Imagick?

A: Anda boleh menambah bayang -bayang ke teks watermark dalam Imagick dengan melukis teks dua kali (sekali untuk bayang -bayang, sekali untuk teks itu sendiri). Bayang -bayang boleh dibuat dengan menetapkan warna mengisi ke hitam dan mengimbangi kedudukan teks. Contohnya:

$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');
Salin selepas log masuk

Q: Bagaimana untuk menambah teks watermark ke pelbagai imej dalam Imagick?

A: Untuk menambah teks watermark ke pelbagai imej dalam Imagick, anda boleh melengkung melalui imej dan memohon tanda air untuk setiap imej. Berikut adalah contoh asas:

Atas ialah kandungan terperinci PHP Master | Menambah tanda air teks dengan imagick. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan