PHP 如何封装水印函数

封装水印函数

<?php
/*
    验证码
    宽 高 字母 数字 字母数字混合 干扰线 干扰点 背景色(要比字体颜色浅) 字体的颜色
*/
/**
  * @param $source:资源(大图)
  * @param $water:小图
  * @param $position:位置(默认9个位置)
  * @param $alpha:透明度
  * @param $type:输出图片的类型 
  * @param $path:存放路径
  * @param $isRandName:是否随机命名 
*/
warterMark('big.jpg');
function warterMark($source, $water = 'icon.png', $position = 8,$alpha = 100, $type = 'jpeg', $path = 'test', $isRandName = false){
    // 1.打开图片
    $sourceRes = open($source);
    // var_dump($sourceRes);
    $waterRes = open($water);
    // 2.获取图片大小,算出位置
    $sourceInfo = getimagesize($source);
    $waterInfo = getimagesize($water);
    // 如果图片小于水印图片,不生成图片
    if ($sourceInfo[0] < $waterInfo[0] || $sourceInfo[1] < $waterInfo[1]){
        exit('水印图片过大');
    }
    // 3.算出位置
    switch ($position) {
        case 1:
            $x = 0;
            $y = 0;
            break;
        case 2:
            $x = ($sourceInfo[0] - $waterInfo[0]) / 2;
            $y = 0;
            break;
        case 3:
            $x = $sourceInfo[0] - $waterInfo[0];
            $y = 0;
            break;
        case 4:
            $x = 0;
            $y = ($sourceInfo[1] - $waterInfo[1]) / 2;
            break;
        case 5:
            $x = ($sourceInfo[0] - $waterInfo[0]) / 2;
            $y = ($sourceInfo[1] - $waterInfo[1]) / 2;
            break;
        case 6:
            $x = $sourceInfo[0] - $waterInfo[0];
            $y = ($sourceInfo[1] - $waterInfo[1]) / 2;
            break;
        case 7:
            $x = 0;
            $y = $sourceInfo[1] - $waterInfo[1];
            break;
        case 8:
            $x = ($sourceInfo[0] - $waterInfo[0]) / 2;
            $y = $sourceInfo[1] - $waterInfo[1];
            break;
        case 9:
            $x = $sourceInfo[0] - $waterInfo[0];
            $y = $sourceInfo[1] - $waterInfo[1];
            break;
        default: 
            $x = mt_rand(0, $sourceInfo[0] - $waterInfo[0]);
            $y = mt_rand(0, $sourceInfo[1] - $waterInfo[1]);
            break;
    }
    // 4.把x y求出来的值供两张图片合并的时候使用
    imagecopymerge($sourceRes, $waterRes, $x, $y, 0, 0,$waterInfo[0], $waterInfo[1], $alpha); // 拷贝并合并图像的一部分

    $func = 'image'.$type;
    /*
        imagepng();
        imagejpeg();
        imagewbmp();
    */
    // 5.处理path路径,是否启用随机文件名
    if($isRandName){
        $name = uniqid() . '.' . $type; //echo uniqid();随机串
    }else{
        $pathinfo = pathinfo($source);
        // var_dump($pathinfo);
        $name = $pathinfo['filename'] . '.' . $type;
    }
    $path = rtrim($path, '/') . '/' . $name;
    $func($sourceRes, $path);
    
    imagedestroy($sourceRes);
    imagedestroy($waterRes);
}
// 打开图片的函数
function open($path){
    // 判断是否存在
    if(!file_exists($path)){
        exit('文件不存在');
    }
    $info = getimagesize($path);
    // var_dump($info); 
    // 根据图片原信息,生成新的图片
    switch($info['mime']){
        case 'image/jpeg':
        case 'image/jpg':
        case 'image/pjpeg':
            $res = imagecreatefromjpeg($path); // 由文件或URL创建一个新图像,返回一个新的资源
            break;
        case 'image/png':
            $res = imagecreatefrompng($path);
            break;
        case 'image/gif':
            $res = imagecreatefromgif($path);
            break;
        case 'image/wbmp':
        case 'image/bmp':
            $res = imagecreatefromwbmp($path);
            break;
    }
    return $res;
}

目录结构

生成图片的问题:png半透明的图片不能生成透明图,可以绘制字体水印效果更好。

原文地址:https://www.cnblogs.com/lisaShare/p/12513807.html