乡村购物商业集团 发表于 2024-11-26 12:24:12

PHP实现添加图片水印的示例代码

以下是 `_imgWatermark` 函数的中文注释和解析。该函数用于在图像上添加水印:
function _imgWatermark($src_image, $water_image, $path_image = '', $position = 10, $pct = 30, $angle = 15)
{
    // 检查源图和水印图文件是否存在
    if (!is_file($src_image)) {
      $error = '源图不存在';
      return false;
    }
    if (!is_file($water_image)) {
      $error = '水印图不存在';
      return false;
    }

    // 获取图片信息
    $src_info = getimagesize($src_image);
    $water_info = getimagesize($water_image);

    // 定义允许的图片 MIME 类型
    $allow = array(
      'image/jpeg' => 'jpeg',
      'image/gif' => 'gif',
      'image/jpg' => 'jpg',
      'image/png' => 'png',
      'image/pjpeg' => 'jpeg'
    );

    // 检查图像类型是否被允许
    if (!array_key_exists($src_info['mime'], $allow)) {
      $error = "源图类型不支持添加水印";
      return false;
    }
    if (!array_key_exists($water_info['mime'], $allow)) {
      $error = "水印图类型不支持";
      return false;
    }

    // 根据 MIME 类型创建打开和保存图片的函数
    $src_open = 'imagecreatefrom' . $allow[$src_info['mime']];
    $water_open = 'imagecreatefrom' . $allow[$water_info['mime']];
    $src_save = 'image' . $allow[$src_info['mime']];

    // 打开图像资源
    $src = $src_open($src_image);
    $water = $water_open($water_image);

    // 根据比例计算水印的新尺寸
    $scale_factor = 0.15; // 水印的相对大小比例
    $new_water_width = $src_info * $scale_factor;
    $new_water_height = ($water_info / $water_info) * $new_water_width;

    // 创建缩放后的水印图
    $resized_water = imagecreatetruecolor($new_water_width, $new_water_height);
    imagealphablending($resized_water, false);
    imagesavealpha($resized_water, true);
    imagecopyresampled($resized_water, $water, 0, 0, 0, 0, $new_water_width, $new_water_height, $water_info, $water_info);

    // 释放原始水印资源,使用缩放后的水印
    imagedestroy($water);
    $water = $resized_water;
    $water_info = $new_water_width;
    $water_info = $new_water_height;

    if ($angle) {
      // 旋转水印图片
      $water = imagerotate($water, $angle, imageColorAllocateAlpha($water, 0, 0, 0, 127));
      // 获取旋转后的水印尺寸
      $sourceInfo = imagesx($water);
      $sourceInfo = imagesy($water);
      // 设置水印平铺的间距
      $ww = $src_info * 0.1;// 水平方向间距
      $hh = $src_info * 0.1;// 垂直方向间距
    }

    if ($position == 10) {
      $offset_x = $water_info / 2;
    }

    // 计算水印在源图中的位置
    $start_x = $start_y = 0;
    switch ($position) {
      case 1:
            break;
      case 2:
            $start_x = floor(($src_info - $water_info) / 2);
            break;
      case 3:
            $start_x = $src_info - $water_info;
            break;
      case 4:
            $start_y = floor(($src_info - $water_info) / 2);
            break;
      case 5:
            $start_x = floor(($src_info - $water_info) / 2);
            $start_y = floor(($src_info - $water_info) / 2);
            break;
      case 6:
            $start_x = $src_info - $water_info;
            $start_y = floor(($src_info - $water_info) / 2);
            break;
      case 7:
            $start_y = $src_info - $water_info;
            break;
      case 8:
            $start_x = floor(($src_info - $water_info) / 2);
            $start_y = $src_info - $water_info;
            break;
      case 9:
            $start_x = $src_info - $water_info;
            $start_y = $src_info - $water_info;
            break;
      case 10:
            // 创建用于平铺的图像资源
            $fun = 'imagecreatefrom' . image_type_to_extension($src_info, false);
            $thumb = $fun($src_image);
            // 定义总长度
            $start_x = $src_info - 0;
            $start_y = $src_info - 0;
            $index = 0;
            $ccasd = 0;
            $ccasdy = 0;
            // 循环平铺水印
            for ($x = 0; $x < $start_x; $x) {
                for ($y = 0; $y < $start_y; $y) {
                  if ($x == 0 && $y == 0) {
                        $x = round($ww / 2);
                  }
                  $index++;
                  imagecopy($src, $thumb, 0, 0, $x + $ccasd - $offset_x, $y + $ccasdy, $sourceInfo, $sourceInfo);
                  imagecopy($src, $water, 0, 0, 0, 0, $sourceInfo, $sourceInfo);
                  imagecopymerge($thumb, $src, $x + $ccasd - $offset_x, $y + $ccasdy, 0, 0, $sourceInfo, $sourceInfo, $pct);
                  $y += $sourceInfo + $hh;
                }
                $x += $sourceInfo + $ww;
                $index = 0;
            }
            $src_save($thumb, $path_image);
            imagedestroy($src);
            imagedestroy($water);
            return $imagename;
            break;
    }

    // 合并水印到源图
    if (imagecopymerge($src, $water, $start_x, $start_y, 0, 0, $water_info, $water_info, $pct) && $position != 10) {
      $src_save($src, $path_image);
      imagedestroy($src);
      imagedestroy($water);
      return $imagename;
    } else {
      $error = "水印制作失败";
      return false;
    }
}关键点:
- **文件存在性检查:** 确保源图和水印图文件存在。
- **支持的图像类型:** 验证图像是否属于支持的类型(JPEG、GIF、PNG)。
- **图像缩放:** 根据比例缩放水印图,使其相对于源图的尺寸更小。
- **水印位置:** 水印可以根据 `position` 参数被放置在源图的不同位置。
- **水印平铺:** 如果 `position` 设置为 10,水印将在整个图像上平铺。
- **透明度和旋转:** 水印可以通过 `angle` 和 `pct` 参数进行旋转和调整透明度。
- **资源管理:** 函数确保所有图像资源在使用后被销毁以释放内存。
该函数为图像添加水印提供了灵活的方式,允许用户自定义水印的位置、透明度和平铺方式。
到此这篇关于PHP实现添加图片水印的示例代码的文章就介绍到这了,更多相关PHP添加图片水印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/program/330414hjj.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: PHP实现添加图片水印的示例代码