PHP 添加字符串水印或图片水印


 

/**
 * @desc    xmsb_watermark         PHP图片加水印 jpg,png,gif
 * @param   string   $imgPath      原图片路径
 * @param   string   $outPath      带水印图片输出路径
 * @param   string   $watermark    图片水印路径,若文件不存在则视为字符串水印
 * @param   int      $position     水印位置:1左上 2右上 3左下 4右下
 * @param   int      $padding      水印与图片边缘距离
 * @param   int      $waterWidth   仅限图片水印(字符串水印无效):图片水印宽度
 * @param   array    $textColor    仅限字符串水印(图片水印无效):[r, g, b, a(0-100)]
 * @return  string   错误信息,无错误时原样返回$outPath
 */
function xmsb_watermark($imgPath, $outPath, $watermark, $position = 4, $padding = 10, $waterWidth = 100, $textColor = [0, 0, 0, 1])
{
    // 获取原始图像
    $img = imagecreatefromstring(file_get_contents($imgPath));
    $imgInfo = getimagesize($imgPath);
    
    $x = 0;
    $y = 0;
    switch($position)
    {
        case 1:
            $x = $padding;
            $y = $padding;
        break;
        
        case 2:
            $x = $imgInfo[0] - $padding;
            $y = $padding;
        break;
        
        case 3:
            $x = $padding;
            $y = $imgInfo[1] - $padding;
        break;
        
        case 4:
            $x = $imgInfo[0] - $padding;
            $y = $imgInfo[1] - $padding;
        break;
        
        default:
            $x = $imgInfo[0] - $padding;
            $y = $imgInfo[1] - $padding;
        break;
    }
    
    
    // 判断是图片水印还是文字水印
    if(file_exists($watermark) && in_array(substr($watermark, strrpos($watermark, '.') + 1), ['jpg', 'png', 'gif']))
    {
        // 创建图片的实例
        $water = imagecreatefromstring(file_get_contents($watermark));
        
        // 获取水印图片的宽高
        list($water_w, $water_h) = getimagesize($watermark);
        
        // 重设水印宽高
        if($water_w >= $waterWidth)
        {
            $new_water_w = $waterWidth;
            $new_water_h = $water_h / ($water_w / $waterWidth);
        }
        
        // 重新校对x,y轴位置
        if($x != $padding) $x -= $new_water_w;
        if($y != $padding) $y -= $new_water_h;
        
        //创建一个新的图像源(目标图像)
        $new_water = imagecreatetruecolor($new_water_w, $new_water_h);
        //执行等比缩放
        imagecopyresized($new_water, $img, 0, 0, 0, 0, $new_water_w, $new_water_h, $water_w, $water_h);
        
        // 将水印图片复制到目标图片上
        imagecopy($img, $new_water, $x, $y, 0, 0, $new_water_w, $new_water_h);
    }
    else
    {
        // 请自行准备字体文件
        $font = './msyh.ttf';
        
        // 重新校对x,y轴位置
        $check = imagettfbbox(20, 0, $font, $watermark);
        if($x != $padding) $x -= $check[2];
        if($y != $padding) 
        {
            $y -= ($check[5] + 30);
        }
        else
        {
            $y -= $check[5];
        }
        
        // 字体颜色 r g b a
        $color = imagecolorallocatealpha($img, $textColor[0], $textColor[1], $textColor[2], $textColor[3]);
        
        // 画布资源 字体大小 旋转角度 x轴 y轴 字体颜色 字体文件 需要渲染的字符串
        imagettftext($img, 20, 0, $x, $y, $color, $font, $watermark);
    }
    
    $outExt = substr($outPath, strrpos($outPath, '.') + 1);
    switch($outExt)
    {
        case 'jpg':
            imagejpeg($img, $outPath);
        break;
        
        case 'png':
            imagepng($img, $outPath);
        break;
        
        case 'gif':
            imagegif($img, $outPath);
        break;
        
        default:
            return '输出文件名有误';
        break;
    }
    
    imagedestroy($img);
    return $outPath;
}

 


 

测试结果:

xmsb_watermark('img-png.png', '1.png', 'img1-png.png', 4, 0, 100, [0, 0, 0, 1]);

PHP 添加字符串水印或图片水印

 

 

xmsb_watermark('img-png.png', '1.png', 'img-png.png', 1, 10, 100, [0, 0, 0, 1])

PHP 添加字符串水印或图片水印

 

上一篇:jj前端项目1th总结


下一篇:javaScript设计模式——装饰器模式(四)