PHP 图片加水印原理与实现:文字与图片水印代码示例
在 PHP Web 开发中,为上传的图片自动添加版权标识或Logo是常见需求。利用 PHP 内置的 GD 扩展,可以通过简单的几行代码实现文字水印和图片水印的绘制。本文将拆解其背后的原理,并提供基础的代码实现。
文字水印的实现原理
文字水印的核心在于创建一个独立的画布,将文字渲染到该画布上,或者直接在目标图像上绘制文字。以下代码演示了如何创建一个包含背景色和文字的小尺寸图像资源:
$w = 80;
$h = 20;
$im = imagecreatetruecolor($w,$h);
$textcolor = imagecolorallocate($im, 123, 12, 255);
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 399, 29, $grey); //画一矩形并填充
// 把字符串写在图像左上角
imagestring($im, 3, 2, 3, "Hello world!", $textcolor);
// 输出图像
header("Content-type: image/jpeg");
imagejpeg($im);
imagedestroy($im); // 销毁资源以节省内存
- 创建画布:
imagecreatetruecolor用于初始化一个真彩色图像资源,参数指定宽高。 - 颜色分配:
imagecolorallocate为图像定义多种颜色(如文本色、背景灰、黑、白)。 - 绘制背景:
imagefilledrectangle填充一个矩形区域作为水印底色。 - 写入文本:
imagestring使用内部字体将字符串绘制到图像指定坐标位置。 - 输出与清理:设置 Header 声明图片类型,
imagejpeg输出 JPEG 格式,最后必须调用imagedestroy释放内存。
图片水印的叠加原理
图片水印是将一个透明或有背景的 Logo/图片覆盖在原始图片的特定位置上。关键在于获取两张图片的尺寸信息,并根据原始图片的文件类型选择对应的创建函数。
$groundImg = "DSC05940.jpeg";
$groundInfo = getimagesize($groundImg);
$ground_w = $groundInfo[0];
$ground_h = $groundInfo[1];
switch($groundInfo[2]){
case 1:
$ground_im = imagecreatefromgif($groundImg);
break;
case 2:
$ground_im = imagecreatefromjpeg($groundImg);
break;
case 3:
$ground_im = imagecreatefrompng($groundImg);
break;
}
$waterImg = "DSC05949.jpeg";
$imgInfo = getimagesize($waterImg);
$water_w = $imgInfo[0];
$water_h = $imgInfo[1]; // 修正原稿中的变量命名错误
switch($imgInfo[2]){
case 1:
$water_im = imagecreatefromgif($waterImg);
break;
case 2:
$water_im = imagecreatefromjpeg($waterImg);
break;
case 3:
$water_im = imagecreatefrompng($waterImg);
break;
}
// 执行合并操作
imagecopy($ground_im,$water_im,100,100,0,0,500,500);
header("Content-type: image/jpeg");
imagejpeg($ground_im);
// 注意:实际使用中应销毁所有创建的图像资源
- 获取元数据:
getimagesize返回数组,其中索引[0]为宽度,[1]为高度,[2]为图像类型(1=GIF, 2=JPG, 3=PNG)。 - 根据类型加载:使用
switch-case结构根据类型码调用imagecreatefromgif/jpg/png加载图像资源。 - 像素复制:
imagecopy是最核心的函数。参数依次为:目标图像、源图像、目标 X 偏移、目标 Y 偏移、源 X 偏移、源 Y 偏移、源宽度、源高度。
此外,PHP 还提供 imagecopymerge(支持透明度合并)和 imagecopyresized(缩放后合并)等函数,可根据具体设计需求调整。
总结
PHP 处理图片水印依赖于 GD 库提供的图像资源管理功能。文字水印侧重文本绘制,图片水印侧重像素块的重叠合并。理解 getimagesize 的类型判断和 imagecopy 的参数映射是掌握这一技能的关键。以上就是 PHP 图片加水印原理的详细内容,更多关于 PHP 图像处理的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













