1. PHP图像处理基础

在开始添加水印之前,我们需要了解一些PHP图像处理的基础知识。

1.1 GD库

PHP内置了GD库,这是一个功能强大的图像处理库,支持多种图像格式,如JPG、PNG、GIF等。要使用GD库,确保在php.ini文件中启用了extension=php_gd2.dll(Windows)或extension=gd2(Unix/Linux)。

1.2 常用函数

以下是一些在PHP中处理图像时常用的函数:

  • imagecreatefromjpeg():从JPEG文件创建图像。
  • imagecreatefrompng():从PNG文件创建图像。
  • imagecreatefromgif():从GIF文件创建图像。
  • getimagesize():获取图像的大小。
  • imagecopymerge():将一个图像合并到另一个图像上。
  • imagejpeg():输出JPEG图像。

2. 添加水印的基本步骤

添加水印的基本步骤如下:

  1. 打开源图像和水印图像。
  2. 获取图像的大小。
  3. 计算水印的位置。
  4. 使用imagecopymerge()函数将水印图像复制到源图像上。
  5. 保存或输出处理后的图像。

3. 坐标定位技巧

水印的坐标定位是添加水印的关键步骤。以下是一些坐标定位的技巧:

3.1 定位策略

  • 顶部居左x = 0; y = 0;
  • 顶部居中x = (image_width - logo_width) / 2; y = 0;
  • 顶部居右x = image_width - logo_width; y = 0;
  • 左边居中x = 0; y = (image_height - logo_height) / 2;
  • 图片中心x = (image_width - logo_width) / 2; y = (image_height - logo_height) / 2;
  • 右边居中x = image_width - logo_width; y = (image_height - logo_height) / 2;
  • 底部居左x = 0; y = image_height - logo_height;
  • 底部居中x = (image_width - logo_width) / 2; y = image_height - logo_height;
  • 底部居右x = image_width - logo_width; y = image_height - logo_height;

3.2 动态定位

如果需要动态定位水印,可以使用以下代码:

$position = rand(1, 9); // 随机选择水印位置
switch ($position) {
    case 1:
        $x = 0;
        $y = 0;
        break;
    case 2:
        $x = (image_width - logo_width) / 2;
        $y = 0;
        break;
    // ... 其他位置
    case 9:
        $x = image_width - logo_width;
        $y = image_height - logo_height;
        break;
}

4. 实例代码

以下是一个简单的PHP代码示例,展示了如何添加水印:

<?php
// 打开源图像和水印图像
$sourceImage = imagecreatefromjpeg("source.jpg");
$watermarkImage = imagecreatefrompng("watermark.png");

// 获取图像的大小
$sourceWidth = imagesx($sourceImage);
$sourceHeight = imagesy($sourceImage);
$watermarkWidth = imagesx($watermarkImage);
$watermarkHeight = imagesy($watermarkImage);

// 计算水印的位置(以顶部居中为例)
$x = ($sourceWidth - $watermarkWidth) / 2;
$y = 0;

// 将水印图像复制到源图像上
imagecopymerge($sourceImage, $watermarkImage, $x, $y, 0, 0, $watermarkWidth, $watermarkHeight, 100);

// 保存或输出处理后的图像
imagejpeg($sourceImage, "output.jpg");
imagedestroy($sourceImage);
imagedestroy($watermarkImage);
?>

5. 总结