PHP实现的给图片添加水印功能,可添加文字水印或图片水印,使用文字水印时需要提供字体文件,使用图片水印时需要提供水印图片,水印图片不能比要添加水印的图片大,请使用背景透明的水印图片。
该水印类支持自定义水印位置、自定义水印大小和水印的透明度,字体水印可自定义颜色等,功能已相应完善。
完整源代码如下(注解中已给出使用示例):
?
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
162
163
164
|
<?php
/**
* 图片加水印类,支持文字水印、透明度设置、自定义水印位置等。
* 使用示例:
* $obj = new WaterMask($imgFileName); //实例化对象
* $obj->$waterType = 1; //类型:0为文字水印、1为图片水印
* $obj->$transparent = 45; //水印透明度
* $obj->$waterStr = 'www.zzvips.com'; //水印文字
* $obj->$fontSize = 18; //文字字体大小
* $obj->$fontColor = array(255,255,255); //水印文字颜色(RGB)
* $obj->$fontFile = 'AHGBold.ttf'; //字体文件
* ……
* $obj->output(); //输出水印图片文件覆盖到输入的图片文件
*/
class WaterMask{
public $waterType = 0; //水印类型:0为文字水印、1为图片水印
public $pos = 0; //水印位置
public $transparent = 45; //水印透明度
public $waterStr = 'www.zzvips.com' ; //水印文字
public $fontSize = 18; //文字字体大小
public $fontColor = array (255,255,255); //水印文字颜色(RGB)
public $fontFile = 'AHGBold.ttf' ; //字体文件
public $waterImg = 'logo.png' ; //水印图片
private $srcImg = '' ; //需要添加水印的图片
private $im = '' ; //图片句柄
private $water_im = '' ; //水印图片句柄
private $srcImg_info = '' ; //图片信息
private $waterImg_info = '' ; //水印图片信息
private $str_w = '' ; //水印文字宽度
private $str_h = '' ; //水印文字高度
private $x = '' ; //水印X坐标
private $y = '' ; //水印y坐标
function __construct( $img ) { //析构函数
$this ->srcImg = file_exists ( $img ) ? $img : die ( '"' . $img . '" 源文件不存在!' );
}
private function imginfo() { //获取需要添加水印的图片的信息,并载入图片。
$this ->srcImg_info = getimagesize ( $this ->srcImg);
switch ( $this ->srcImg_info[2]) {
case 3:
$this ->im = imagecreatefrompng( $this ->srcImg);
break 1;
case 2:
$this ->im = imagecreatefromjpeg( $this ->srcImg);
break 1;
case 1:
$this ->im = imagecreatefromgif( $this ->srcImg);
break 1;
default :
die ( '原图片(' . $this ->srcImg. ')格式不对,只支持PNG、JPEG、GIF。' );
}
}
private function waterimginfo() { //获取水印图片的信息,并载入图片。
$this ->waterImg_info = getimagesize ( $this ->waterImg);
switch ( $this ->waterImg_info[2]) {
case 3:
$this ->water_im = imagecreatefrompng( $this ->waterImg);
break 1;
case 2:
$this ->water_im = imagecreatefromjpeg( $this ->waterImg);
break 1;
case 1:
$this ->water_im = imagecreatefromgif( $this ->waterImg);
break 1;
default :
die ( '水印图片(' . $this ->srcImg. ')格式不对,只支持PNG、JPEG、GIF。' );
}
}
private function waterpos() { //水印位置算法
switch ( $this ->pos) {
case 0: //随机位置
$this ->x = rand(0, $this ->srcImg_info[0]- $this ->waterImg_info[0]);
$this ->y = rand(0, $this ->srcImg_info[1]- $this ->waterImg_info[1]);
break 1;
case 1: //上左
$this ->x = 0;
$this ->y = 0;
break 1;
case 2: //上中
$this ->x = ( $this ->srcImg_info[0]- $this ->waterImg_info[0])/2;
$this ->y = 0;
break 1;
case 3: //上右
$this ->x = $this ->srcImg_info[0]- $this ->waterImg_info[0];
$this ->y = 0;
break 1;
case 4: //中左
$this ->x = 0;
$this ->y = ( $this ->srcImg_info[1]- $this ->waterImg_info[1])/2;
break 1;
case 5: //中中
$this ->x = ( $this ->srcImg_info[0]- $this ->waterImg_info[0])/2;
$this ->y = ( $this ->srcImg_info[1]- $this ->waterImg_info[1])/2;
break 1;
case 6: //中右
$this ->x = $this ->srcImg_info[0]- $this ->waterImg_info[0];
$this ->y = ( $this ->srcImg_info[1]- $this ->waterImg_info[1])/2;
break 1;
case 7: //下左
$this ->x = 0;
$this ->y = $this ->srcImg_info[1]- $this ->waterImg_info[1];
break 1;
case 8: //下中
$this ->x = ( $this ->srcImg_info[0]- $this ->waterImg_info[0])/2;
$this ->y = $this ->srcImg_info[1]- $this ->waterImg_info[1];
break 1;
default : //下右
$this ->x = $this ->srcImg_info[0]- $this ->waterImg_info[0];
$this ->y = $this ->srcImg_info[1]- $this ->waterImg_info[1];
break 1;
}
}
private function waterimg() {
if ( $this ->srcImg_info[0] <= $this ->waterImg_info[0] || $this ->srcImg_info[1] <= $this ->waterImg_info[1]){
die ( '水印比原图大!' );
}
$this ->waterpos();
$cut = imagecreatetruecolor( $this ->waterImg_info[0], $this ->waterImg_info[1]);
imagecopy( $cut , $this ->im,0,0, $this ->x, $this ->y, $this ->waterImg_info[0], $this ->waterImg_info[1]);
$pct = $this ->transparent;
imagecopy( $cut , $this ->water_im,0,0,0,0, $this ->waterImg_info[0], $this ->waterImg_info[1]);
imagecopymerge( $this ->im, $cut , $this ->x, $this ->y,0,0, $this ->waterImg_info[0], $this ->waterImg_info[1], $pct );
}
private function waterstr() {
$rect = imagettfbbox( $this ->fontSize,0, $this ->fontFile, $this ->waterStr);
$w = abs ( $rect [2]- $rect [6]);
$h = abs ( $rect [3]- $rect [7]);
$fontHeight = $this ->fontSize;
$this ->water_im = imagecreatetruecolor( $w , $h );
imagealphablending( $this ->water_im,false);
imagesavealpha( $this ->water_im,true);
$white_alpha = imagecolorallocatealpha( $this ->water_im,255,255,255,127);
imagefill( $this ->water_im,0,0, $white_alpha );
$color = imagecolorallocate( $this ->water_im, $this ->fontColor[0], $this ->fontColor[1], $this ->fontColor[2]);
imagettftext( $this ->water_im, $this ->fontSize,0,0, $this ->fontSize, $color , $this ->fontFile, $this ->waterStr);
$this ->waterImg_info = array (0=> $w ,1=> $h );
$this ->waterimg();
}
function output() {
$this ->imginfo();
if ( $this ->waterType == 0) {
$this ->waterstr();
} else {
$this ->waterimginfo();
$this ->waterimg();
}
switch ( $this ->srcImg_info[2]) {
case 3:
imagepng( $this ->im, $this ->srcImg);
break 1;
case 2:
imagejpeg( $this ->im, $this ->srcImg);
break 1;
case 1:
imagegif( $this ->im, $this ->srcImg);
break 1;
default :
die ( '添加水印失败!' );
break ;
}
imagedestroy( $this ->im);
imagedestroy( $this ->water_im);
}
}
?>
|
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对快网idc的支持。如果你想了解更多相关内容请查看下面相关链接
原文链接:http://www.codetc.com/article-95-1.html
相关文章
猜你喜欢
- 个人网站搭建:如何挑选具有弹性扩展能力的服务器? 2025-06-10
- 个人服务器网站搭建:如何选择适合自己的建站程序或框架? 2025-06-10
- 64M VPS建站:能否支持高流量网站运行? 2025-06-10
- 64M VPS建站:怎样选择合适的域名和SSL证书? 2025-06-10
- 64M VPS建站:怎样优化以提高网站加载速度? 2025-06-10
TA的动态
- 2025-07-10 怎样使用阿里云的安全工具进行服务器漏洞扫描和修复?
- 2025-07-10 怎样使用命令行工具优化Linux云服务器的Ping性能?
- 2025-07-10 怎样使用Xshell连接华为云服务器,实现高效远程管理?
- 2025-07-10 怎样利用云服务器D盘搭建稳定、高效的网站托管环境?
- 2025-07-10 怎样使用阿里云的安全组功能来增强服务器防火墙的安全性?
快网idc优惠网
QQ交流群
您的支持,是我们最大的动力!
热门文章
-
2025-05-25 43
-
2025-05-29 55
-
2025-05-27 64
-
2025-05-25 93
-
2025-06-04 24
热门评论