PHP实现添加图片水印的示例代码

张开发
2026/4/16 8:42:49 15 分钟阅读

分享文章

PHP实现添加图片水印的示例代码
以下是 _imgWatermark 函数的中文注释和解析。该函数用于在图像上添加水印123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152function_imgWatermark($src_image,$water_image,$path_image,$position 10,$pct 30,$angle 15){// 检查源图和水印图文件是否存在if(!is_file($src_image)) {$error源图不存在;returnfalse;}if(!is_file($water_image)) {$error水印图不存在;returnfalse;}// 获取图片信息$src_infogetimagesize($src_image);$water_infogetimagesize($water_image);// 定义允许的图片 MIME 类型$allowarray(image/jpegjpeg,image/gifgif,image/jpgjpg,image/pngpng,image/pjpegjpeg);// 检查图像类型是否被允许if(!array_key_exists($src_info[mime],$allow)) {$error源图类型不支持添加水印;returnfalse;}if(!array_key_exists($water_info[mime],$allow)) {$error水印图类型不支持;returnfalse;}// 根据 MIME 类型创建打开和保存图片的函数$src_openimagecreatefrom.$allow[$src_info[mime]];$water_openimagecreatefrom.$allow[$water_info[mime]];$src_saveimage.$allow[$src_info[mime]];// 打开图像资源$src$src_open($src_image);$water$water_open($water_image);// 根据比例计算水印的新尺寸$scale_factor 0.15;// 水印的相对大小比例$new_water_width$src_info[0] *$scale_factor;$new_water_height ($water_info[1] /$water_info[0]) *$new_water_width;// 创建缩放后的水印图$resized_water imagecreatetruecolor($new_water_width,$new_water_height);imagealphablending($resized_water, false);imagesavealpha($resized_water, true);imagecopyresampled($resized_water,$water, 0, 0, 0, 0,$new_water_width,$new_water_height,$water_info[0],$water_info[1]);// 释放原始水印资源使用缩放后的水印imagedestroy($water);$water$resized_water;$water_info[0] $new_water_width;$water_info[1] $new_water_height;if($angle) {// 旋转水印图片$water imagerotate($water,$angle, imageColorAllocateAlpha($water, 0, 0, 0, 127));// 获取旋转后的水印尺寸$sourceInfo[0] imagesx($water);$sourceInfo[1] imagesy($water);// 设置水印平铺的间距$ww$src_info[0] * 0.1;// 水平方向间距$hh$src_info[1] * 0.1;// 垂直方向间距}if($position 10) {$offset_x$water_info[0] / 2;}// 计算水印在源图中的位置$start_x$start_y 0;switch($position) {case1:break;case2:$start_xfloor(($src_info[0] -$water_info[0]) / 2);break;case3:$start_x$src_info[0] -$water_info[0];break;case4:$start_yfloor(($src_info[1] -$water_info[1]) / 2);break;case5:$start_xfloor(($src_info[0] -$water_info[0]) / 2);$start_yfloor(($src_info[1] -$water_info[1]) / 2);break;case6:$start_x$src_info[0] -$water_info[0];$start_yfloor(($src_info[1] -$water_info[1]) / 2);break;case7:$start_y$src_info[1] -$water_info[1];break;case8:$start_xfloor(($src_info[0] -$water_info[0]) / 2);$start_y$src_info[1] -$water_info[1];break;case9:$start_x$src_info[0] -$water_info[0];$start_y$src_info[1] -$water_info[1];break;case10:// 创建用于平铺的图像资源$funimagecreatefrom. image_type_to_extension($src_info[2], false);$thumb$fun($src_image);// 定义总长度$start_x$src_info[0] - 0;$start_y$src_info[1] - 0;$index 0;$ccasd 0;$ccasdy 0;// 循环平铺水印for($x 0;$x$start_x;$x) {for($y 0;$y$start_y;$y) {if($x 0 $y 0) {$xround($ww/ 2);}$index;imagecopy($src,$thumb, 0, 0,$x$ccasd-$offset_x,$y$ccasdy,$sourceInfo[0],$sourceInfo[1]);imagecopy($src,$water, 0, 0, 0, 0,$sourceInfo[0],$sourceInfo[1]);imagecopymerge($thumb,$src,$x$ccasd-$offset_x,$y$ccasdy, 0, 0,$sourceInfo[0],$sourceInfo[1],$pct);$y$sourceInfo[1] $hh;}$x$sourceInfo[0] $ww;$index 0;}$src_save($thumb,$path_image);imagedestroy($src);imagedestroy($water);return$imagename;break;}// 合并水印到源图if(imagecopymerge($src,$water,$start_x,$start_y, 0, 0,$water_info[0],$water_info[1],$pct) $position! 10) {$src_save($src,$path_image);imagedestroy($src);imagedestroy($water);return$imagename;}else{$error水印制作失败;returnfalse;}}关键点- **文件存在性检查** 确保源图和水印图文件存在。- **支持的图像类型** 验证图像是否属于支持的类型JPEG、GIF、PNG。- **图像缩放** 根据比例缩放水印图使其相对于源图的尺寸更小。- **水印位置** 水印可以根据 position 参数被放置在源图的不同位置。- **水印平铺** 如果 position 设置为 10水印将在整个图像上平铺。- **透明度和旋转** 水印可以通过 angle 和 pct 参数进行旋转和调整透明度。- **资源管理** 函数确保所有图像资源在使用后被销毁以释放内存。该函数为图像添加水印提供了灵活的方式允许用户自定义水印的位置、透明度和平铺方式。my.oschina.net/u/3397981/blog/19513733my.oschina.net/u/3397981/blog/19513723my.oschina.net/u/3397981/blog/19513711my.oschina.net/u/3397981/blog/19513697my.oschina.net/u/3397981/blog/19513686my.oschina.net/u/3397981/blog/19513674my.oschina.net/u/3397981/blog/19513663my.oschina.net/u/3397981/blog/19513652my.oschina.net/u/3397981/blog/19513641my.oschina.net/u/3397981/blog/19513632my.oschina.net/u/3397981/blog/19513617my.oschina.net/u/3397981/blog/19513603my.oschina.net/u/3397981/blog/19513590my.oschina.net/u/3397981/blog/19513582my.oschina.net/u/3397981/blog/19513570my.oschina.net/u/3397981/blog/19513558my.oschina.net/u/3397981/blog/19513547my.oschina.net/u/3397981/blog/19513537my.oschina.net/u/3397981/blog/19513525my.oschina.net/u/3397981/blog/19513515my.oschina.net/u/3397981/blog/19513503my.oschina.net/u/3397981/blog/19513491my.oschina.net/u/3397981/blog/19513478my.oschina.net/u/3397981/blog/19513468my.oschina.net/u/3397981/blog/19513452my.oschina.net/u/3397981/blog/19513444my.oschina.net/u/3397981/blog/19513434my.oschina.net/u/3397981/blog/19513420my.oschina.net/u/3397981/blog/19513410my.oschina.net/u/3397981/blog/19513399my.oschina.net/u/3397981/blog/19513388my.oschina.net/u/3397981/blog/19513376my.oschina.net/u/3397981/blog/19513365

更多文章