PHP實(shí)現(xiàn)的給圖片添加水印功能,可添加文字水印或圖片水印,使用文字水印時(shí)需要提供字體文件,使用圖片水印時(shí)需要提供水印圖片,水印圖片不能比要添加水印的圖片大,請(qǐng)使用背景透明的水印圖片。
該水印類(lèi)支持自定義水印位置、自定義水印大小和水印的透明度,字體水印可自定義顏色等,功能已相應(yīng)完善。
完整源代碼如下(注解中已給出使用示例):
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 /** * 圖片加水印類(lèi),支持文字水印、透明度設(shè)置、自定義水印位置等。 * 使用示例: * $obj = new WaterMask($imgFileName); //實(shí)例化對(duì)象 * $obj->$waterType = 1; //類(lèi)型:0為文字水印、1為圖片水印 * $obj->$transparent = 45; //水印透明度 * $obj->$waterStr = 'www.jfrwli.cn'; //水印文字 * $obj->$fontSize = 18; //文字字體大小 * $obj->$fontColor = array(255,255,255); //水印文字顏色(RGB) * $obj->$fontFile = 'AHGBold.ttf'; //字體文件 * …… * $obj->output(); //輸出水印圖片文件覆蓋到輸入的圖片文件 */ class WaterMask{ public $waterType = 0; //水印類(lèi)型:0為文字水印、1為圖片水印 public $pos = 0; //水印位置 public $transparent = 45; //水印透明度 public $waterStr = 'www.jfrwli.cn' ; //水印文字 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坐標(biāo) private $y = '' ; //水印y坐標(biāo) function __construct( $img ) { //析構(gòu)函數(shù) $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. ')格式不對(duì),只支持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. ')格式不對(duì),只支持PNG、JPEG、GIF。' ); } } private function waterpos() { //水印位置算法 switch ( $this ->pos) { case 0: //隨機(jī)位置 $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); } } ?> |
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)服務(wù)器之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
原文鏈接:http://www.codetc.com/article-95-1.html