zoukankan      html  css  js  c++  java
  • 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半透明的图片不能生成透明图,可以绘制字体水印效果更好。

  • 相关阅读:
    SQLyog使用中的点滴总结
    Maven的GroupID和ArtifactID的含义
    Android View 深度分析requestLayout、invalidate与postInvalidate
    15 个 Android 通用流行框架大全
    Android Studio中获取查看签名SHA1证书指纹数据或MD5的方法
    android:descendantFocusability用法简析
    Android应用层View绘制流程与源码分析
    android.graphic.Path
    Android Scroller简单用法
    Android 2D Graphics学习 Region和Canvas裁剪
  • 原文地址:https://www.cnblogs.com/lisaShare/p/12513807.html
Copyright © 2011-2022 走看看