PHP动态为图片添加文字水印的实现方法

山间有风
山间有风
发布时间:2026-10-13 | 3人浏览过
原创

在使用PHP进行Web开发时,有时需要动态地在图片上添加版权信息或宣传文字作为水印。本文将演示如何使用PHP内置的GD库扩展,编写一个脚本来接收图片路径和文字参数,自动识别图片格式并在指定位置渲染中文或英文文本。

实现原理与准备工作

该方案的核心在于PHP的图像处理函数集。主要涉及以下几个关键步骤:首先解析输入的图片文件以获取其尺寸和类型;接着创建一个新的画布并将原图复制上去;最后利用imagettftext函数在画布上绘制文字。为了确保脚本的稳定性,需要提前准备好TrueType字体文件(如.ttf格式),并确保Web服务器运行环境已启用GD扩展。

第1步:设置HTTP响应头

由于最终输出的是图像数据而非HTML,因此必须告诉浏览器当前内容的类型。header("Content-type: image/jpeg")声明了输出流为JPEG格式图片。虽然脚本处理多种格式,但统一以JPEG编码输出可以兼容大多数浏览器的展示需求。

第2步:初始化与图片读取

使用GetImageSize()函数快速获取图片的文件大小、类型等信息。根据返回的类型值(1代表GIF,2代表JPG,3代表PNG),分别调用对应的创建函数:imagecreatefromgif()、imagecreatefromjpeg()或imagecreatefrompng()。同时,获取原图的宽度和高度,用于后续创建新画布。

注意:旧版PHP中函数名为ImageCreateFromGIF等,建议在现代PHP版本中使用小写形式以保持规范,尽管PHP通常对函数名大小写不敏感。

第3步:创建画布与复制原图

使用imagecreatetruecolor($srcW, $srcH)创建一个与原图尺寸一致的真彩色新画布。随后,利用imagecopyresampled()将原图资源复制到新画布中。这一步确保了底图为原始照片,而所有文字操作都在这个新建的图层上进行,避免直接修改原文件。

第4步:配置字体与颜色

定义字体文件路径,例如$font = "2.ttf"。确保该字体文件存在于脚本运行的目录下,或者提供绝对路径。使用imagecolorallocate()分配文字颜色,默认参数为黑色(R=0, G=0, B=0)。如果需要白色或其他颜色,可在调用主函数时传入相应的RGB值。

第5步:文字自动换行与绘制

这是处理长文本的关键部分。脚本通过循环计算文本长度,将其分割成多行。算法估算每行的字符数$len和行高$lgg,然后在一个while循环中逐行截取文本并使用imagettftext()写入画布。imagettftext的参数包括字体大小、角度、X/Y坐标、颜色、字体文件和待绘制的字符串。Y坐标随行数增加而下移,从而实现垂直排列。

<?php
Header("Content-type: image/jpeg");

function makethumb($srcFile, $text, $size = 12, $R = 0, $G = 0, $B = 0) {
    // 如果未提供文本,使用默认值
    if (!$text) {
        $text = 'welcome xs.net.ru xayle';
        $size = 20;
        $R = 255;
    }

    // 获取图片信息
    $data = GetImageSize($srcFile, $info);
    
    // 根据类型创建图像资源
    switch ($data[2]) {
        case 1: // GIF
            $im = @ImageCreateFromGIF($srcFile);
            break;
        case 2: // JPG
            $im = @imagecreatefromjpeg($srcFile);
            break;
        case 3: // PNG
            $im = @ImageCreateFromPNG($srcFile);
            break;
        default:
            return false;
    }

    $srcW = ImageSX($im);
    $srcH = ImageSY($im);
    
    // 创建新画布
    $ni = imagecreatetruecolor($srcW, $srcH);
    imagecopyresampled($ni, $im, 0, 0, 0, 0, $srcW, $srcH, $srcW, $srcH);

    $font = "2.ttf";
    $textcolor = imagecolorallocate($ni, $R, $G, $B);
    
    $i = 0;
    $txt = '';
    $len = ceil((12 * 22) / $size);
    $lgg = ceil(($size * 16) / 12) - 1;
    
    // 循环绘制多行文字
    while (strlen($txt) > 0 || !$i) {
        $start = $len * $i;
        $kk = ceil($size * 13 / 12);
        $txt = substr($text, $start, $len);
        $hei = $i * $lgg + $kk;
        imagettftext($ni, $size, 0, 8, $hei, $textcolor, $font, $txt);
        $i++;
    }
    
    // 输出JPEG图片到浏览器
    ImageJpeg($ni);
}

// 执行函数,默认参数
if (!$size || $size < 1) $size = 12;
makethumb("face.jpg", $text, $size, $R, $G, $B);
?>

完成判断与注意事项

当访问该PHP脚本时,浏览器应直接显示一张带有文字的覆盖图。如果页面显示空白或报错,请检查以下事项:首先确认服务器PHP版本是否支持GD库,可通过phpinfo()查看;其次,确保2.ttf字体文件存在且可读;最后,检查图片路径face.jpg是否正确。此外,由于imagettftext对中文的支持依赖于字体文件内部的编码映射,若文字显示为方块,请尝试更换为中文字体文件或调整文本编码为UTF-8。

以上就是PHP动态给图片加文字水印的详细内容,更多关于PHP图像处理的技术资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表