天天看點

php給圖檔添加文字水印方法彙總

在php中要給圖檔加水印我們需要給php安裝GD庫了,這裡我們不介紹GD庫安裝,隻介紹怎麼利用php給圖檔添加文字水印的4種方法的彙總。有需要的小夥伴可以參考下。

1: 面向過程的編寫方法

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

//指定圖檔路徑

$src

=

'001.png'

;

//擷取圖檔資訊

$info

=

getimagesize

(

$src

);

//擷取圖檔擴充名

$type

= image_type_to_extension(

$info

[2],false);

//動态的把圖檔導入記憶體中

$fun

=

"imagecreatefrom{$type}"

;

$image

=

$fun

(

'001.png'

);

//指定字型顔色

$col

= imagecolorallocatealpha(

$image

,255,255,255,50);

//指定字型内容

$content

=

'helloworld'

;

//給圖檔添加文字

imagestring(

$image

,5,20,30,

$content

,

$col

);

//指定輸入類型

header(

'Content-type:'

.

$info

[

'mime'

]);

//動态的輸出圖檔到浏覽器中

$func

=

"image{$type}"

;

$func

(

$image

);

//銷毀圖檔

imagedestroy(

$image

);

2:面向對象的實作方法

?

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

class

Image_class {

private

$image

;

private

$info

;

/**

* @param $src:圖檔路徑

* 加載圖檔到記憶體中

*/

function

__construct(

$src

){

$info

=

getimagesize

(

$src

);

$type

= image_type_to_extension(

$info

[2],false);

$this

-> info =

$info

;

$this

->info[

'type'

] =

$type

;

$fun

=

"imagecreatefrom"

.

$type

;

$this

-> image =

$fun

(

$src

);

}

/**

* @param $fontsize: 字型大小

* @param $x: 字型在圖檔中的x位置

* @param $y: 字型在圖檔中的y位置

* @param $color: 字型的顔色是一個包含rgba的數組

* @param $text: 想要添加的内容

* 操作記憶體中的圖檔,給圖檔添加文字水印

*/

public

function

fontMark(

$fontsize

,

$x

,

$y

,

$color

,

$text

){

$col

= imagecolorallocatealpha(

$this

->image,

$color

[0],

$color

[1],

$color

[2],

$color

[3]);

imagestring(

$this

->image,

$fontsize

,

$x

,

$y

,

$text

,

$col

);

}

/*

* 輸出圖檔到浏覽器中

*/

public

function

show(){

header(

'content-type:'

.

$this

-> info[

'mime'

]);

$fun

=

'image'

.

$this

->info[

'type'

];

$fun

(

$this

->image);

}

/**

* 銷毀圖檔

*/

function

__destruct(){

imagedestroy(

$this

->image);

}

}

//對類的調用

$obj

=

new

Image_class(

'001.png'

);

$obj

->fontMark(20,20,30,

array

(255,255,255,60),

'hello'

);

$obj

->show();

3.支援以圖檔和文字兩種方式給圖檔添加水印。圖檔支援GIF,PNG,JPG三種格式,水印圖檔支援PNG和GIF

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

function

setWater(

$imgSrc

,

$markImg

,

$markText

,

$TextColor

,

$markPos

,

$fontType

,

$markType

)

{

$srcInfo

= @

getimagesize

(

$imgSrc

);

$srcImg_w

=

$srcInfo

[0];

$srcImg_h

=

$srcInfo

[1];

switch

(

$srcInfo

[2])

{

case

1:

$srcim

=imagecreatefromgif(

$imgSrc

);

break

;

case

2:

$srcim

=imagecreatefromjpeg(

$imgSrc

);

break

;

case

3:

$srcim

=imagecreatefrompng(

$imgSrc

);

break

;

default

:

die

(

"不支援的圖檔檔案類型"

);

exit

;

}

if

(!

strcmp

(

$markType

,

"img"

))

{

if

(!

file_exists

(

$markImg

) ||

empty

(

$markImg

))

{

return

;

}

$markImgInfo

= @

getimagesize

(

$markImg

);

$markImg_w

=

$markImgInfo

[0];

$markImg_h

=

$markImgInfo

[1];

if

(

$srcImg_w

<

$markImg_w

||

$srcImg_h

<

$markImg_h

)

{

return

;

}

switch

(

$markImgInfo

[2])

{

case

1:

$markim

=imagecreatefromgif(

$markImg

);

break

;

case

2:

$markim

=imagecreatefromjpeg(

$markImg

);

break

;

case

3:

$markim

=imagecreatefrompng(

$markImg

);

break

;

default

:

die

(

"不支援的水印圖檔檔案類型"

);

exit

;

}

$logow

=

$markImg_w

;

$logoh

=

$markImg_h

;

}

if

(!

strcmp

(

$markType

,

"text"

))

{

$fontSize

= 16;

if

(!

empty

(

$markText

))

{

if

(!

file_exists

(

$fontType

))

{

return

;

}

}

else

{

return

;

}

$box

= @imagettfbbox(

$fontSize

, 0,

$fontType

,

$markText

);

$logow

= max(

$box

[2],

$box

[4]) - min(

$box

[0],

$box

[6]);

$logoh

= max(

$box

[1],

$box

[3]) - min(

$box

[5],

$box

[7]);

}

if

(

$markPos

== 0)

{

$markPos

= rand(1, 9);

}

switch

(

$markPos

)

{

case

1:

$x

= +5;

$y

= +5;

break

;

case

2:

$x

= (

$srcImg_w

-

$logow

) / 2;

$y

= +5;

break

;

case

3:

$x

=

$srcImg_w

-

$logow

- 5;

$y

= +15;

break

;

case

4:

$x

= +5;

$y

= (

$srcImg_h

-

$logoh

) / 2;

break

;

case

5:

$x

= (

$srcImg_w

-

$logow

) / 2;

$y

= (

$srcImg_h

-

$logoh

) / 2;

break

;

case

6:

$x

=

$srcImg_w

-

$logow

- 5;

$y

= (

$srcImg_h

-

$logoh

) / 2;

break

;

case

7:

$x

= +5;

$y

=

$srcImg_h

-

$logoh

- 5;

break

;

case

8:

$x

= (

$srcImg_w

-

$logow

) / 2;

$y

=

$srcImg_h

-

$logoh

- 5;

break

;

case

9:

$x

=

$srcImg_w

-

$logow

- 5;

$y

=

$srcImg_h

-

$logoh

-5;

break

;

default

:

die

(

"此位置不支援"

);

exit

;

}

$dst_img

= @imagecreatetruecolor(

$srcImg_w

,

$srcImg_h

);

imagecopy (

$dst_img

,

$srcim

, 0, 0, 0, 0,

$srcImg_w

,

$srcImg_h

);

if

(!

strcmp

(

$markType

,

"img"

))

{

imagecopy(

$dst_img

,

$markim

,

$x

,

$y

, 0, 0,

$logow

,

$logoh

);

imagedestroy(

$markim

);

}

if

(!

strcmp

(

$markType

,

"text"

))

{

$rgb

=

explode

(

','

,

$TextColor

);

$color

= imagecolorallocate(

$dst_img

,

$rgb

[0],

$rgb

[1],

$rgb

[2]);

imagettftext(

$dst_img

,

$fontSize

, 0,

$x

,

$y

,

$color

,

$fontType

,

$markText

);

}

switch

(

$srcInfo

[2])

{

case

1:

imagegif(

$dst_img

,

$imgSrc

);

break

;

case

2:

imagejpeg(

$dst_img

,

$imgSrc

);

break

;

case

3:

imagepng(

$dst_img

,

$imgSrc

);

break

;

default

:

die

(

"不支援的水印圖檔檔案類型"

);

exit

;

}

imagedestroy(

$dst_img

);

imagedestroy(

$srcim

);

}

參數說明:

$imgSrc:目标圖檔,可帶相對目錄位址,

$markImg:水印圖檔,可帶相對目錄位址,支援PNG和GIF兩種格式,如水印圖檔在執行檔案mark目錄下,可寫成:mark/mark.gif

$markText:給圖檔添加的水印文字

$TextColor:水印文字的字型顔色

$markPos:圖檔水印添加的位置,取值範圍:0~9

0:随機位置,在1~8之間随機選取一個位置

1:頂部居左 2:頂部居中 3:頂部居右 4:左邊居中

5:圖檔中心 6:右邊居中 7:底部居左 8:底部居中 9:底部居右

$fontType:具體的字型庫,可帶相對目錄位址

$markType:圖檔添加水印的方式,img代表以圖檔方式,text代表以文字方式添加水印

4.給圖檔加文字水印的方法

<?php

/*給圖檔加文字水印的方法*/

$dst_path

=

'http://f4.topitme.com/4/15/11/1166351597fe111154l.jpg'

;

$dst

= imagecreatefromstring(

file_get_contents

(

$dst_path

));

/*imagecreatefromstring()--從字元串中的圖像流建立一個圖像,傳回一個圖像标示符,其表達了從給定字元串得來的圖像

圖像格式将自動監測,隻要php支援jpeg,png,gif,wbmp,gd2.*/

$font

=

'./t1.ttf'

;

$black

= imagecolorallocate(

$dst

, 0, 0, 0);

imagefttext(

$dst

, 20, 0, 10, 30,

$black

,

$font

,

'Hello world!'

);

/*imagefttext($img,$size,$angle,$x,$y,$color,$fontfile,$text)

$img由圖像建立函數傳回的圖像資源

size要使用的水印的字型大小

angle(角度)文字的傾斜角度,如果是0度代表文字從左往右,如果是90度代表從上往下

x,y水印文字的第一個文字的起始位置

color是水印文字的顔色

fontfile,你希望使用truetype字型的路徑*/

list(

$dst_w

,

$dst_h

,

$dst_type

) =

getimagesize

(

$dst_path

);

/*list(mixed $varname[,mixed $......])--把數組中的值賦給一些變量

像array()一樣,這不是真正的函數,而是語言結構,List()用一步操作給一組變量進行指派*/

/*getimagesize()能擷取到什麼資訊?

getimagesize函數會傳回圖像的所有資訊,包括大小,類型等等*/

switch

(

$dst_type

){

case

1:

//GIF

header(

"content-type:image/gif"

);

imagegif(

$dst

);

break

;

case

2:

//JPG

header(

"content-type:image/jpeg"

);

imagejpeg(

$dst

);

break

;

case

3:

//PNG

header(

"content-type:image/png"

);

imagepng(

$dst

);

break

;

default

:

break

;

/*imagepng--以PNG格式将圖像輸出到浏覽器或檔案

imagepng()将GD圖像流(image)以png格式輸出到标注輸出(通常為浏覽器),或者如果用filename給出了檔案名則将其輸出到檔案*/

}

imagedestroy(

$dst

);

?>