当前位置:首页 > PHP

php后台实现水印

2026-02-16 13:30:04PHP

添加水印的基本方法

在PHP中实现图片水印功能主要通过GD库或Imagick扩展完成。以下是两种常见实现方式:

GD库实现方式:

php后台实现水印

function addWatermark($sourceImagePath, $watermarkText, $outputImagePath) {
    $image = imagecreatefromjpeg($sourceImagePath);
    $font = 'arial.ttf';
    $color = imagecolorallocatealpha($image, 255, 255, 255, 70);
    $fontSize = 20;
    $angle = 0;
    $margin = 30;

    $imageWidth = imagesx($image);
    $imageHeight = imagesy($image);
    $textBox = imagettfbbox($fontSize, $angle, $font, $watermarkText);
    $textWidth = $textBox[2] - $textBox[0];
    $textHeight = $textBox[7] - $textBox[1];

    $x = ($imageWidth - $textWidth) / 2;
    $y = ($imageHeight - $textHeight) / 2;

    imagettftext($image, $fontSize, $angle, $x, $y, $color, $font, $watermarkText);
    imagejpeg($image, $outputImagePath);
    imagedestroy($image);
}

使用图片作为水印

如果需要使用图片作为水印而非文字:

function addImageWatermark($sourceImagePath, $watermarkImagePath, $outputImagePath) {
    $sourceImage = imagecreatefromjpeg($sourceImagePath);
    $watermark = imagecreatefrompng($watermarkImagePath);

    $sourceWidth = imagesx($sourceImage);
    $sourceHeight = imagesy($sourceImage);
    $watermarkWidth = imagesx($watermark);
    $watermarkHeight = imagesy($watermark);

    $positionX = ($sourceWidth - $watermarkWidth) / 2;
    $positionY = ($sourceHeight - $watermarkHeight) / 2;

    imagecopy($sourceImage, $watermark, $positionX, $positionY, 0, 0, $watermarkWidth, $watermarkHeight);
    imagejpeg($sourceImage, $outputImagePath);

    imagedestroy($sourceImage);
    imagedestroy($watermark);
}

水印透明度控制

调整水印透明度可以使效果更自然:

php后台实现水印

function addTransparentWatermark($sourceImagePath, $watermarkImagePath, $outputImagePath) {
    $sourceImage = imagecreatefromjpeg($sourceImagePath);
    $watermark = imagecreatefrompng($watermarkImagePath);

    $sourceWidth = imagesx($sourceImage);
    $sourceHeight = imagesy($sourceImage);
    $watermarkWidth = imagesx($watermark);
    $watermarkHeight = imagesy($watermark);

    $positionX = $sourceWidth - $watermarkWidth - 10;
    $positionY = $sourceHeight - $watermarkHeight - 10;

    imagealphablending($watermark, true);
    imagesavealpha($watermark, true);

    imagecopymerge($sourceImage, $watermark, $positionX, $positionY, 0, 0, $watermarkWidth, $watermarkHeight, 50);
    imagejpeg($sourceImage, $outputImagePath);

    imagedestroy($sourceImage);
    imagedestroy($watermark);
}

批量添加水印

处理目录下所有图片的批量水印添加:

function batchAddWatermark($directory, $watermarkText) {
    $files = scandir($directory);
    foreach ($files as $file) {
        $ext = strtolower(pathinfo($file, PATHINFO_EXTENSION));
        if (in_array($ext, ['jpg', 'jpeg', 'png'])) {
            $sourcePath = $directory . '/' . $file;
            $outputPath = $directory . '/watermarked_' . $file;
            addWatermark($sourcePath, $watermarkText, $outputPath);
        }
    }
}

水印位置调整

通过参数控制水印位置:

function addWatermarkWithPosition($sourceImagePath, $watermarkText, $outputImagePath, $position = 'center') {
    $image = imagecreatefromjpeg($sourceImagePath);
    $font = 'arial.ttf';
    $color = imagecolorallocatealpha($image, 255, 255, 255, 70);
    $fontSize = 20;
    $angle = 0;
    $margin = 30;

    $imageWidth = imagesx($image);
    $imageHeight = imagesy($image);
    $textBox = imagettfbbox($fontSize, $angle, $font, $watermarkText);
    $textWidth = $textBox[2] - $textBox[0];
    $textHeight = $textBox[7] - $textBox[1];

    switch ($position) {
        case 'top-left':
            $x = $margin;
            $y = $margin + $textHeight;
            break;
        case 'top-right':
            $x = $imageWidth - $textWidth - $margin;
            $y = $margin + $textHeight;
            break;
        case 'bottom-left':
            $x = $margin;
            $y = $imageHeight - $margin;
            break;
        case 'bottom-right':
            $x = $imageWidth - $textWidth - $margin;
            $y = $imageHeight - $margin;
            break;
        default: // center
            $x = ($imageWidth - $textWidth) / 2;
            $y = ($imageHeight - $textHeight) / 2;
    }

    imagettftext($image, $fontSize, $angle, $x, $y, $color, $font, $watermarkText);
    imagejpeg($image, $outputImagePath);
    imagedestroy($image);
}

注意事项

确保服务器已安装GD库或Imagick扩展,可通过phpinfo()查看。处理不同格式图片时需使用对应的函数:imagecreatefromjpeg()、imagecreatefrompng()等。输出时同样需要注意图片格式匹配。水印图片建议使用PNG格式以保持透明度。

标签: 水印后台
分享给朋友:

相关文章

vue实现水印效果

vue实现水印效果

实现水印效果的几种方法 在Vue中实现水印效果可以通过多种方式,以下是几种常见的方法: 使用CSS背景图 通过CSS的background-image属性可以实现简单的水印效果。定义一个包含水印文本…

vue拖拽实现管理后台

vue拖拽实现管理后台

Vue 拖拽实现管理后台方案 使用 Vue.Draggable 库 Vue.Draggable 是基于 Sortable.js 的 Vue 组件,适合列表拖拽排序场景。安装依赖: npm inst…

vue elementui实现管理后台

vue elementui实现管理后台

Vue + ElementUI 实现管理后台 环境准备 确保已安装 Node.js(建议版本 14+)和 npm/yarn。使用 Vue CLI 创建项目: vue create admin-dem…

vue实现视频去除水印

vue实现视频去除水印

去除视频水印的常见方法 去除视频水印可以通过多种技术手段实现,以下是一些常见的方法及其在Vue中的实现思路。 使用CSS覆盖水印 通过CSS定位覆盖水印区域,适用于水印位置固定的场景。在Vue中可…

vue实现canvas照片水印

vue实现canvas照片水印

实现思路 在Vue中实现Canvas照片水印,核心是通过Canvas API绘制图片和水印文字,最终导出为新的图片。主要分为加载图片、绘制水印、导出结果三个关键步骤。 基础实现代码 以下是一个完整…

vue框架实现后台导航

vue框架实现后台导航

Vue 实现后台导航的方法 使用 Vue 实现后台导航通常涉及路由配置、动态菜单生成和权限控制。以下是具体实现方案: 路由配置 在 router/index.js 中定义路由结构,区分公开路由和权限…