php can add a watermark effect to a picture
<?php /** * 功能:给一张图片加上水印效果 * $i 要加水印效果的图片 * $t 水印文字 * $size 文字大小 * $pos 水印的位置 * $color 文字的颜色 * $flag 是布尔值,主要用来区分是不是原图上加水印 * $type 如果$flag等于false 则新图上加上水印 新文件名为 原名_txt.jpg */ function txt($i,$t='版权所有',$size=25,$pos=5,$color='rand',$flag=true,$type='_txt'){ $img = imagecreatefromjpeg($i); $w = imagesx($img); $h = imagesy($img); $font = dirname(__FILE__).'/font/ls.ttf'; $ps = imagettfbbox($size,0,$font,$t); $tw = $ps[4]; $th = abs($ps[5]); switch($pos){ case 1:break; case 2:break; case 3:break; case 4:break; case 5:$x=($w-$tw)/2;$y=($h-$th)/2+$th;break; case 6:break; case 7:break; case 8:break; case 9:break; default:break; } $c = getcolor($img,$color); imagettftext($img,$size,0,$x,$y,$c,$font,$t); if($flag){ imagejpeg($img,$i); }else{ $ext = ext($i); $ppp = rtrim($i,'.'.$ext); $ppp = $ppp.$type.'.'.$ext; imagejpeg($img,$ppp); } } function getcolor($i,$c='rand',$a=50){ $cc = ''; switch($c){ case 'white':$cc=imagecolorallocatealpha($i,255,255,255,$a);break; case 'black':$cc=imagecolorallocatealpha($i,0,0,0,$a);break; case 'red':$cc=imagecolorallocatealpha($i,255,0,0,$a);break; case 'green':$cc=imagecolorallocatealpha($i,0,255,0,$a);break; case 'blue':$cc=imagecolorallocatealpha($i,0,0,255,$a);break; case 'orange':$cc=imagecolorallocatealpha($i,0xff,0x66,0x33,$a);break; case 'yellow':$cc=imagecolorallocatealpha($i,255,255,0,$a);break; case 'rand':$cc=imagecolorallocatealpha($i,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255),$a);break; default: $cs = substr($c,1); $ok = str_split($cs,2); $cc = imagecolorallocatealpha($i,hexdec($ok[0]),hexdec($ok[1]),hexdec($ok[2]),$a); break; } return $cc; } /** * 功能是:返回扩展名 */ function ext($f){ $exts = explode('.',$f); return end($exts); } /** * 功能是:返回文件名,不含扩展名 */ function name($f){ $s = explode('/',$f); $fn = end($s); return rtrim($fn,'.'.ext($f)); }
Let’s look at another one that supports adding watermarks to pictures in two ways: pictures and text. Pictures support three formats: GIF, PNG, and JPG. Watermark pictures support PNG and GIF
function setWater($imgSrc,$markImg,$markText,$TextColor,$markPos,$fontType,$markType) { $srcInfo = @getimagesize($imgSrc); $srcImg_w = $srcInfo[0]; $srcImg_h = $srcInfo[1]; switch ($srcInfo[2]) { case 1: $srcim =imagecreatefromgif($imgSrc); break; case 2: $srcim =imagecreatefromjpeg($imgSrc); break; case 3: $srcim =imagecreatefrompng($imgSrc); break; default: die("不支持的图片文件类型"); exit; } if(!strcmp($markType,"img")) { if(!file_exists($markImg) || empty($markImg)) { return; } $markImgInfo = @getimagesize($markImg); $markImg_w = $markImgInfo[0]; $markImg_h = $markImgInfo[1]; if($srcImg_w < $markImg_w || $srcImg_h < $markImg_h) { return; } switch ($markImgInfo[2]) { case 1: $markim =imagecreatefromgif($markImg); break; case 2: $markim =imagecreatefromjpeg($markImg); break; case 3: $markim =imagecreatefrompng($markImg); break; default: die("不支持的水印图片文件类型"); exit; } $logow = $markImg_w; $logoh = $markImg_h; } if(!strcmp($markType,"text")) { $fontSize = 16; if(!empty($markText)) { if(!file_exists($fontType)) { return; } } else { return; } $box = @imagettfbbox($fontSize, 0, $fontType,$markText); $logow = max($box[2], $box[4]) - min($box[0], $box[6]); $logoh = max($box[1], $box[3]) - min($box[5], $box[7]); } if($markPos == 0) { $markPos = rand(1, 9); } switch($markPos) { case 1: $x = +5; $y = +5; break; case 2: $x = ($srcImg_w - $logow) / 2; $y = +5; break; case 3: $x = $srcImg_w - $logow - 5; $y = +15; break; case 4: $x = +5; $y = ($srcImg_h - $logoh) / 2; break; case 5: $x = ($srcImg_w - $logow) / 2; $y = ($srcImg_h - $logoh) / 2; break; case 6: $x = $srcImg_w - $logow - 5; $y = ($srcImg_h - $logoh) / 2; break; case 7: $x = +5; $y = $srcImg_h - $logoh - 5; break; case 8: $x = ($srcImg_w - $logow) / 2; $y = $srcImg_h - $logoh - 5; break; case 9: $x = $srcImg_w - $logow - 5; $y = $srcImg_h - $logoh -5; break; default: die("此位置不支持"); exit; } $dst_img = @imagecreatetruecolor($srcImg_w, $srcImg_h); imagecopy ( $dst_img, $srcim, 0, 0, 0, 0, $srcImg_w, $srcImg_h); if(!strcmp($markType,"img")) { imagecopy($dst_img, $markim, $x, $y, 0, 0, $logow, $logoh); imagedestroy($markim); } if(!strcmp($markType,"text")) { $rgb = explode(',', $TextColor); $color = imagecolorallocate($dst_img, $rgb[0], $rgb[1], $rgb[2]); imagettftext($dst_img, $fontSize, 0, $x, $y, $color, $fontType,$markText); } switch ($srcInfo[2]) { case 1: imagegif($dst_img, $imgSrc); break; case 2: imagejpeg($dst_img, $imgSrc); break; case 3: imagepng($dst_img, $imgSrc); break; default: die("不支持的水印图片文件类型"); exit; } imagedestroy($dst_img); imagedestroy($srcim); }
Parameter description:
$imgSrc: target image, can have relative directory address,
$markImg: watermark image, which can have a relative directory address and supports both PNG and GIF formats. For example, if the watermark image is in the mark directory of the executable file, it can be written as: mark/mark.gif
$markText: watermark text added to the image
$TextColor: font color of watermark text
$markPos: The position where the image watermark is added, value range: 0~9
0: Random position, randomly select a position between 1~8
1: Top left 2: Top center 3: Top right 4: Left center
5: Center of the picture 6: Center on the right 7: Center on the bottom 8: Center on the bottom 9: Center on the bottom
$fontType: specific font library, can have relative directory address
$markType: The way to add watermarks to pictures, img means to add watermarks as pictures, text means to add watermarks as text
Code comments:
Line 4~6: Get the width and height of the target image
Lines 8~22: Call different functions according to the image type to obtain the operation image identifier
GetImageSize function knowledge point: GetImageSize can be used without installing GD, and its return value array has four elements. Index value 0 is the image height. Index value 1 is the width of the image. Index value 2 is the file format of the image, with value 1 being GIF format, 2 being JPEG/JPG format, and 3 being PNG format. Index value 3 is the height and width string of the image, height=xxx width=yyy. The width and height units of the returned image are pixels
Lines 24~58: When selecting the image method to add a watermark to the target image, obtain the width and height of the watermark image, which is usually the logo of the website. If the target image is smaller in width or height than the watermark image or the watermark image does not exist, jump out of this function.
Return statement knowledge point: direct return means returning nothing and ending the function directly. It can also be understood as returning NULL.
Lines 60~77: When selecting the text method to add a watermark to the target image, first set the size of the watermark text. By default, I set it to 16px. You can adjust the font size as needed. If the font file does not exist, jump out of the function, and finally obtain the virtual length and width of the text in this format through the imagettfbbox function.
Imagettfbbox function knowledge point: This function returns an array containing 8 cells to represent the four corners of the text frame. The meaning of the index value: 0 represents the X position of the lower left corner, 1 represents the Y position of the sitting corner, and 2 represents the X position of the lower right corner. Position, 3 represents the Y position of the lower right corner, 4 represents the X position of the upper right corner, 5 represents the Y position of the upper right corner, 6 represents the X position of the upper left corner, and 7 represents the Y position of the upper left corner. This function requires the support of both GD library and FreeType library
The max function returns the largest value among the parameters.
Line 79~125: Calculate the specific coordinate value based on the set image watermark position. You can refine the watermark position according to the effect.
Lines 127~129: Create a new image with the same size as the target image.
Note: Since the scope of the imagecreatetruecolor function is a black image, if your target image is transparent, the new image generated will not be transparent.
Lines 131~162: Based on the image or text, the image with the watermark is finally generated.
Calling instructions:
You can call it by function call. Of course, you can also encapsulate it in a class, or you can further subdivide this function into modules as needed. Of course, there is no problem if you use it this way now. I have tested it, so please feel free to use it.
Other instructions:
Since the imagettftext and imagettfbbox functions require the support of the GD library and the FreeType library, if your operating environment does not support the GD library and the FreeType library, the text mode cannot be implemented. You can use the imagestring function to add text watermarks to images, and set Just set the $logow and $logoh values in text mode.
The imagejpeg function can also set the quality of the synthesized image.