PHP 添加字符串水印或图片水印
/** * @desc xmsb_watermark PHP图片加水印 jpg,png,gif * @param string $imgPath 原图片路径 * @param string $outPath 带水印图片输出路径 * @param string $watermark 图片水印路径,若文件不存在则视为字符串水印 * @param int $position 水印位置:1左上 2右上 3左下 4右下 * @param int $padding 水印与图片边缘距离 * @param int $waterWidth 仅限图片水印(字符串水印无效):图片水印宽度 * @param array $textColor 仅限字符串水印(图片水印无效):[r, g, b, a(0-100)] * @return string 错误信息,无错误时原样返回$outPath */ function xmsb_watermark($imgPath, $outPath, $watermark, $position = 4, $padding = 10, $waterWidth = 100, $textColor = [0, 0, 0, 1]) { // 获取原始图像 $img = imagecreatefromstring(file_get_contents($imgPath)); $imgInfo = getimagesize($imgPath); $x = 0; $y = 0; switch($position) { case 1: $x = $padding; $y = $padding; break; case 2: $x = $imgInfo[0] - $padding; $y = $padding; break; case 3: $x = $padding; $y = $imgInfo[1] - $padding; break; case 4: $x = $imgInfo[0] - $padding; $y = $imgInfo[1] - $padding; break; default: $x = $imgInfo[0] - $padding; $y = $imgInfo[1] - $padding; break; } // 判断是图片水印还是文字水印 if(file_exists($watermark) && in_array(strtolower(substr($watermark, strrpos($watermark, '.') + 1)), ['jpg', 'png', 'gif'])) { // 创建图片的实例 $water = imagecreatefromstring(file_get_contents($watermark)); // 获取水印图片的宽高 list($water_w, $water_h) = getimagesize($watermark); // 重设水印宽高 if($water_w >= $waterWidth) { $new_water_w = $waterWidth; $new_water_h = $water_h / ($water_w / $waterWidth); } else { $new_water_w = $water_w; $new_water_h = $water_h; } // 重新校对x,y轴位置 if($x != $padding) $x -= $new_water_w; if($y != $padding) $y -= $new_water_h; // 创建一个新的图像源(目标图像) $new_water = imagecreatetruecolor($new_water_w, $new_water_h); // 解决png图透明背景变黑色问题 由博友caisex提供 $waterext = pathinfo($watermark, PATHINFO_EXTENSION); if(strtolower($waterext) == 'png' || strtolower($waterext) == 'gif') { $color = imagecolorallocate($new_water,255,255,255); imagecolortransparent($new_water,$color); imagefill($new_water,0,0,$color); } // 执行等比缩放 imagecopyresized($new_water, $water, 0, 0, 0, 0, $new_water_w, $new_water_h, $water_w, $water_h); // 将水印图片复制到目标图片上 imagecopy($img, $new_water, $x, $y, 0, 0, $new_water_w, $new_water_h); } else { // 请自行准备字体文件 $font = './msyh.ttf'; // 重新校对x,y轴位置 $check = imagettfbbox(20, 0, $font, $watermark); if($x != $padding) $x -= $check[2]; if($y != $padding) { $y -= ($check[5] + 30); } else { $y -= $check[5]; } // 字体颜色 r g b a $color = imagecolorallocatealpha($img, $textColor[0], $textColor[1], $textColor[2], $textColor[3]); // 画布资源 字体大小 旋转角度 x轴 y轴 字体颜色 字体文件 需要渲染的字符串 imagettftext($img, 20, 0, $x, $y, $color, $font, $watermark); } $outExt = substr($outPath, strrpos($outPath, '.') + 1); switch($outExt) { case 'jpg': imagejpeg($img, $outPath); break; case 'png': imagepng($img, $outPath); break; case 'gif': imagegif($img, $outPath); break; default: return '输出文件名有误'; break; } imagedestroy($img); return $outPath; }
欢迎转载,转载时请注明来源。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异