• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

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

    发布者: 福建二哥 | 发布时间: 2025-6-14 13:16| 查看数: 64| 评论数: 0|帖子模式

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

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

    15.     // 定义允许的图片 MIME 类型
    16.     $allow = array(
    17.         'image/jpeg' => 'jpeg',
    18.         'image/gif' => 'gif',
    19.         'image/jpg' => 'jpg',
    20.         'image/png' => 'png',
    21.         'image/pjpeg' => 'jpeg'
    22.     );

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

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

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

    39.     // 根据比例计算水印的新尺寸
    40.     $scale_factor = 0.15; // 水印的相对大小比例
    41.     $new_water_width = $src_info[0] * $scale_factor;
    42.     $new_water_height = ($water_info[1] / $water_info[0]) * $new_water_width;

    43.     // 创建缩放后的水印图
    44.     $resized_water = imagecreatetruecolor($new_water_width, $new_water_height);
    45.     imagealphablending($resized_water, false);
    46.     imagesavealpha($resized_water, true);
    47.     imagecopyresampled($resized_water, $water, 0, 0, 0, 0, $new_water_width, $new_water_height, $water_info[0], $water_info[1]);

    48.     // 释放原始水印资源,使用缩放后的水印
    49.     imagedestroy($water);
    50.     $water = $resized_water;
    51.     $water_info[0] = $new_water_width;
    52.     $water_info[1] = $new_water_height;

    53.     if ($angle) {
    54.         // 旋转水印图片
    55.         $water = imagerotate($water, $angle, imageColorAllocateAlpha($water, 0, 0, 0, 127));
    56.         // 获取旋转后的水印尺寸
    57.         $sourceInfo[0] = imagesx($water);
    58.         $sourceInfo[1] = imagesy($water);
    59.         // 设置水印平铺的间距
    60.         $ww = $src_info[0] * 0.1;  // 水平方向间距
    61.         $hh = $src_info[1] * 0.1;  // 垂直方向间距
    62.     }

    63.     if ($position == 10) {
    64.         $offset_x = $water_info[0] / 2;
    65.     }

    66.     // 计算水印在源图中的位置
    67.     $start_x = $start_y = 0;
    68.     switch ($position) {
    69.         case 1:
    70.             break;
    71.         case 2:
    72.             $start_x = floor(($src_info[0] - $water_info[0]) / 2);
    73.             break;
    74.         case 3:
    75.             $start_x = $src_info[0] - $water_info[0];
    76.             break;
    77.         case 4:
    78.             $start_y = floor(($src_info[1] - $water_info[1]) / 2);
    79.             break;
    80.         case 5:
    81.             $start_x = floor(($src_info[0] - $water_info[0]) / 2);
    82.             $start_y = floor(($src_info[1] - $water_info[1]) / 2);
    83.             break;
    84.         case 6:
    85.             $start_x = $src_info[0] - $water_info[0];
    86.             $start_y = floor(($src_info[1] - $water_info[1]) / 2);
    87.             break;
    88.         case 7:
    89.             $start_y = $src_info[1] - $water_info[1];
    90.             break;
    91.         case 8:
    92.             $start_x = floor(($src_info[0] - $water_info[0]) / 2);
    93.             $start_y = $src_info[1] - $water_info[1];
    94.             break;
    95.         case 9:
    96.             $start_x = $src_info[0] - $water_info[0];
    97.             $start_y = $src_info[1] - $water_info[1];
    98.             break;
    99.         case 10:
    100.             // 创建用于平铺的图像资源
    101.             $fun = 'imagecreatefrom' . image_type_to_extension($src_info[2], false);
    102.             $thumb = $fun($src_image);
    103.             // 定义总长度
    104.             $start_x = $src_info[0] - 0;
    105.             $start_y = $src_info[1] - 0;
    106.             $index = 0;
    107.             $ccasd = 0;
    108.             $ccasdy = 0;
    109.             // 循环平铺水印
    110.             for ($x = 0; $x < $start_x; $x) {
    111.                 for ($y = 0; $y < $start_y; $y) {
    112.                     if ($x == 0 && $y == 0) {
    113.                         $x = round($ww / 2);
    114.                     }
    115.                     $index++;
    116.                     imagecopy($src, $thumb, 0, 0, $x + $ccasd - $offset_x, $y + $ccasdy, $sourceInfo[0], $sourceInfo[1]);
    117.                     imagecopy($src, $water, 0, 0, 0, 0, $sourceInfo[0], $sourceInfo[1]);
    118.                     imagecopymerge($thumb, $src, $x + $ccasd - $offset_x, $y + $ccasdy, 0, 0, $sourceInfo[0], $sourceInfo[1], $pct);
    119.                     $y += $sourceInfo[1] + $hh;
    120.                 }
    121.                 $x += $sourceInfo[0] + $ww;
    122.                 $index = 0;
    123.             }
    124.             $src_save($thumb, $path_image);
    125.             imagedestroy($src);
    126.             imagedestroy($water);
    127.             return $imagename;
    128.             break;
    129.     }

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

    来源:https://www.jb51.net/program/330414hjj.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表