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:
annotateImage()
. 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.
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
<?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; ?>
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
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; ?>
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
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; ?>
Gambar pembiakan:
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
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; ?>
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
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; ?>
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
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; ?>
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
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; ?>
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');
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!