UEditor编辑器实现上传图片自动加水印功能PHP源码-综合编程教学论坛-语言编程-源码交易网

UEditor编辑器实现上传图片自动加水印功能PHP源码

UEditor编辑器是百度旗下的免费开源富文本编辑器,使用很方便,但是也有缺点,比如,上传图片不能自动添加水印,下边我们就来说说如何在UEditor编辑器中自动实现上传图片添加水印功能,操作很简单。

c38bcaf1e920241123153308

 

首先找到UEditor/PHP目录下的Uploader.class.php的文件,打开该文件,找到以下代码,大概在122行,不同版本可能稍微有所偏差,不会差太多,或者直接搜索即可。

1
$this->stateInfo = $this->stateMap[0];

找到后,在该以上代码下方添加如下代码:

1
$this->imageWaterMark($this->filePath,9,'logo.png');

其中,imageWaterMark就是添加水印的函数,filepath是图片名称,9代表上传的水印位置,logo.png为水印图片,水印需要放在PHP目录下,如果放在其他目录下的话,需要添加图片的绝对路径。

然后再,Uploader类中添加以下函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/*
    * 功能:PHP图片水印 (水印支持图片或文字)
    * 参数:
     
    *$groundImage 背景图片,即需要加水印的图片,暂只支持GIF,JPG,PNG格式;
     
    *$waterPos水印位置,有10种状态,0为随机位置;
     
    *1为顶端居左,2为顶端居中,3为顶端居右;
    *4为中部居左,5为中部居中,6为中部居右;
    *7为底端居左,8为底端居中,9为底端居右;
     
    *$waterImage图片水印,即作为水印的图片,暂只支持GIF,JPG,PNG格式;
    *$waterText文字水印,即把文字作为为水印,支持ASCII码,不支持中文;
    *$textFont文字大小,值为1、2、3、4或5,默认为5;
    *$textColor文字颜色,值为十六进制颜色值,默认为#FF0000(红色);
     
    * 注意:Support GD 2.0,Support FreeType、GIF Read、GIF Create、JPG 、PNG
    *$waterImage 和 $waterText 最好不要同时使用,选其中之一即可,优先使用 $waterImage。
    *当$waterImage有效时,参数$waterString、$stringFont、$stringColor均不生效。
    *加水印后的图片的文件名和 $groundImage 一样。
    */
    private function imageWaterMark($groundImage,$waterPos=0,$waterImage="",$waterText="",$textFont=5,$textColor="#FF0000")
    {
        $isWaterImage = FALSE;
        $formatMsg "暂不支持该文件格式,请用图片处理软件将图片转换为GIF、JPG、PNG格式。";
        //读取水印文件
        if(!empty($waterImage) && file_exists($waterImage))
        {
            $isWaterImage = TRUE;
            $water_info getimagesize($waterImage);
            $water_w $water_info[0];//取得水印图片的宽
            $water_h $water_info[1];//取得水印图片的高 
            switch($water_info[2])//取得水印图片的格式
            {
                case 1:$water_im = imagecreatefromgif($waterImage);break;
                case 2:$water_im = imagecreatefromjpeg($waterImage);break;
                case 3:$water_im = imagecreatefrompng($waterImage);break;
                default:die($formatMsg);
            }
        }
        //读取背景图片
        if(!empty($groundImage) && file_exists($groundImage))
        {
            $ground_info getimagesize($groundImage);
            $ground_w $ground_info[0];//取得背景图片的宽
            $ground_h $ground_info[1];//取得背景图片的高
            switch($ground_info[2])//取得背景图片的格式
            {
                case 1:$ground_im = imagecreatefromgif($groundImage);break;
                case 2:$ground_im = imagecreatefromjpeg($groundImage);break;
                case 3:$ground_im = imagecreatefrompng($groundImage);break;
                default:die($formatMsg);
            }
        }
        else
        {
            die("需要加水印的图片不存在!");
        }
        //水印位置
        if($isWaterImage)//图片水印
        {
            $w $water_w;
            $h $water_h;
            $label "图片的";
        }
        else//文字水印
        {
            $temp = imagettfbbox(ceil($textFont*5),0,"./cour.ttf",$waterText);//取得使用 TrueType 字体的文本的范围
            $w $temp[2] - $temp[6];
            $h $temp[3] - $temp[7];
            unset($temp);
            $label "文字区域";
        }
        if( ($ground_w<$w) || ($ground_h<$h) )
        {
            echo "需要加水印的图片的长度或宽度比水印".$label."还小,无法生成水印!";
            return;
        }
        switch($waterPos)
        {
            case 0://随机
                $posX = rand(0,($ground_w $w));
                $posY = rand(0,($ground_h $h));
                break;
            case 1://1为顶端居左
                $posX = 0;
                $posY = 0;
                break;
            case 2://2为顶端居中
                $posX = ($ground_w $w) / 2;
                $posY = 0;
                break;
            case 3://3为顶端居右
                $posX $ground_w $w;
                $posY = 0;
                break;
            case 4://4为中部居左
                $posX = 0;
                $posY = ($ground_h $h) / 2;
                break;
            case 5://5为中部居中
                $posX = ($ground_w $w) / 2;
                $posY = ($ground_h $h) / 2;
                break;
            case 6://6为中部居右
                $posX $ground_w $w;
                $posY = ($ground_h $h) / 2;
                break;
            case 7://7为底端居左
                $posX = 0;
                $posY $ground_h $h;
                break;
            case 8://8为底端居中
                $posX = ($ground_w $w) / 2;
                $posY $ground_h $h;
                break;
            case 9://9为底端居右
                $posX $ground_w $w - 10;   // -10 是距离右侧10px 可以自己调节
                $posY $ground_h $h - 10;   // -10 是距离底部10px 可以自己调节
                break;
            default://随机
                $posX = rand(0,($ground_w $w));
                $posY = rand(0,($ground_h $h));
                break;
        }
        //设定图像的混色模式
        imagealphablending($ground_im, true);
        if($isWaterImage)//图片水印
        {
            imagecopy($ground_im$water_im$posX$posY, 0, 0, $water_w,$water_h);//拷贝水印到目标文件 
        }
        else//文字水印
        {
            if( !emptyempty($textColor) && (strlen($textColor)==7) )
            {
                $R = hexdec(substr($textColor,1,2));
                $G = hexdec(substr($textColor,3,2));
                $B = hexdec(substr($textColor,5));
            }
            else
            {
                die("水印文字颜色格式不正确!");
            }
            imagestring ( $ground_im$textFont$posX$posY$waterText, imagecolorallocate($ground_im$R$G$B)); 
        }
        //生成水印后的图片
        @unlink($groundImage);
        switch($ground_info[2])//取得背景图片的格式
        {
            case 1:imagegif($ground_im,$groundImage);break;
            case 2:imagejpeg($ground_im,$groundImage);break;
            case 3:imagepng($ground_im,$groundImage);break;
            default:die($errorMsg);
        }
        //释放内存
        if(isset($water_info)) unset($water_info);
        if(isset($water_im)) imagedestroy($water_im);
        unset($ground_info);
        imagedestroy($ground_im);
    }

添加完以上代码基本上就可以正常添加水印了,但是需要注意的是,水印功能需要用到GD库模块,如果水印添加失败的话,需要检查GD库模块是否完整。