发新话题
打印

[方法技巧] PHP给图片加水印的代码分享

PHP给图片加水印的代码分享

收集的两个PHP增加图片水印的类,Michael还没进行过充分测试,有什么问题请反馈给我。
5 r- J+ `* A3 [5 S; s$ O9 {另外故人居也使用了一个Michael自己开发的增加图片水印函数,有机会一起整理出来给大家。
& C" ?6 |; v) D( G& x# M) `3 A9 [: C' p( L/ o' o
一、PHP给图片增加水印的类
/ f" N  V+ x4 Z" K1 h1 |; R2 l& O/ L# V, x. F7 I- H$ D
# m* y+ g* G. k
<?php
: F# l6 y6 x1 I$ xClass Gimage{( Y" F3 Y) A1 S/ T2 o7 Z+ A
    var $src_image_name = "";       //输入图片的文件名(必须包含路径名)
* @( E6 _* q! Z/ \; A/ c' ~    var $jpeg_quality = 90;         //jpeg图片质量
( R3 B3 j& D! O  v2 Y; g4 Y# w    var $save_image_file = '';      //输出文件名4 r$ t1 J2 [2 U( ?
    var $wm_image_name = "";        //水印图片的文件名(必须包含路径名)
( ~0 L% S6 u6 |    var $wm_image_pos = 1;          //水印图片放置的位置
0 o! V0 l" n7 T' @    // 0 = middle+ V7 Q- _, T! P+ {0 D7 y
    // 1 = top left8 n( ^9 N* a. W, D1 l) G
    // 2 = top right+ ?- w) W. t2 B6 q
    // 3 = bottom right* ]1 M! }; R5 d* o* ^& a  y
    // 4 = bottom left& H2 |; J$ r! s4 \
    // 5 = top middle! ?, v2 t3 T1 ?3 z) A
    // 6 = middle right
) d) O; h6 l  v$ |  ~0 J4 [4 |# [    // 7 = bottom middle
9 k' H+ t, O# `# k7 K    // 8 = middle left
# x4 V) I0 _( ?3 ?. Z! Q    //other = 3! B' {) a! w# T5 q* I' S7 n0 p
    var $wm_image_transition = 20;  //水印图片与原图片的融合度 (1=100)
; J5 l+ Y6 t) I+ `& p9 j; |    ) M, `% T( @* |
    var $wm_text = "";              //水印文字(支持中英文以及带有
. m, T$ X2 W' U  o  B的跨行文字)
9 a/ y" |  t( O* v    var $wm_text_size = 20;         //水印文字大小- P& r0 t; s! v6 C% _) K5 ^5 G
    var $wm_text_angle = 4;         //水印文字角度,这个值尽量不要更改- G" G6 C1 u" W
    var $wm_text_pos = 3;           //水印文字放置位置
# s, ?/ g1 n3 Z3 x6 _    var $wm_text_font = "";         //水印文字的字体
5 f8 v' k  k9 ]3 i    var $wm_text_color = "#cccccc"; //水印字体的颜色值
! l+ m% |0 G3 @# q, H    7 @2 _& a% A" X2 `* K5 J
    function create($filename="")* C; M- z6 T- K. m; ~3 {  X
    {
) y, a# G2 M5 ~, S, l# I! M        if ($filename) $this->src_image_name = strtolower(trim($filename));
8 ?4 }+ M; z' Y& Q- B0 y        ! L' U2 `& ~& T7 }+ }) d0 K# O
        $src_image_type = $this->get_type($this->src_image_name);, _- `! j/ i3 b9 d
        $src_image = $this->createImage($src_image_type,$this->src_image_name);1 H7 ?% U0 U5 H8 l& p5 g. o4 G
        if (!$src_image) return;
1 t; T! E' D, b. b8 K9 L$ j9 u/ j        $src_image_w=ImageSX($src_image);; J- I' r$ S/ d# L" b7 S
        $src_image_h=ImageSY($src_image);
! p; I, ^% Z- o3 y( ^; `7 Y        
. d/ L7 `  C4 p$ P    + J) F7 F6 D* Y( _
        if ($this->wm_image_name){8 z  z. d/ i, t2 S
            $this->wm_image_name = strtolower(trim($this->wm_image_name));
* j0 F  e* \7 h, u1 X: P7 U+ h            $wm_image_type = $this->get_type($this->wm_image_name);3 O/ L6 W3 {3 E" Q* ?0 X
            $wm_image = $this->createImage($wm_image_type,$this->wm_image_name);3 |! j) c! W/ C% q+ u. }% U$ x+ L0 F
            $wm_image_w=ImageSX($wm_image);
& O; [+ {+ y5 Q; F9 R, p1 n- w2 Q; k            $wm_image_h=ImageSY($wm_image);
; w( J/ L4 s7 v1 l: }: ~            $temp_wm_image = $this->getPos($src_image_w,$src_image_h,$this->wm_image_pos,$wm_image);
3 `* x4 T' z- Q2 _) k7 `            $wm_image_x = $temp_wm_image["dest_x"];
, o8 D1 `: n4 h6 ?* p5 V5 K            $wm_image_y = $temp_wm_image["dest_y"];6 @' k8 u9 H1 ?( q
            imageCopyMerge($src_image, $wm_image,$wm_image_x,$wm_image_y,0,0,$wm_image_w,$wm_image_h,$this->wm_image_transition);
6 O, b- W0 ^5 `6 G        }
/ o0 U" }# [# H   
2 j- C+ s  N/ U+ l        if ($this->wm_text){' X7 B* C* S4 R) _9 W0 ~
            $this->wm_text = $this->gb2utf8($this->wm_text);+ m4 X; f8 l& C( B" ~' U$ A7 S3 k
            $temp_wm_text = $this->getPos($src_image_w,$src_image_h,$this->wm_text_pos);
- C2 T( F" D$ o! E, ]3 _  y7 l! _            $wm_text_x = $temp_wm_text["dest_x"];  m" o5 n4 x2 ~$ ^' u
            $wm_text_y = $temp_wm_text["dest_y"];
- T/ I7 X  c- O- `            if(preg_match("/([a-f0-9][a-f0-9])([a-f0-9][a-f0-9])([a-f0-9][a-f0-9])/i", $this->wm_text_color, $color))- i8 a2 j% u9 a0 b9 K# O/ J5 I
            {
2 b* m9 R& y' [- o7 N2 w% y: G9 @; z                $red = hexdec($color[1]);
+ H, q; C  M2 p; x                $green = hexdec($color[2]);
' g* |& U$ R* V# @0 x+ Q+ R0 S7 p                $blue = hexdec($color[3]);
6 b% j1 N1 j, K                $wm_text_color = imagecolorallocate($src_image, $red,$green,$blue);: I7 D) s& j, W' K& W
            }else{, k8 @/ c6 z2 D9 U# T3 Y2 Z- R  i( L
                $wm_text_color = imagecolorallocate($src_image, 255,255,255);
  w; j5 t% F# s5 F2 e            }4 z2 J7 e; S  K& s1 G
            $ v, g& h& i( |) D1 v
            imagettftext($src_image, $this->wm_text_size, $this->wm_angle, $wm_text_x, $wm_text_y, $wm_text_color,$this->wm_text_font,  $this->wm_text);+ x' x4 ~2 n% ^
        }" i5 R5 B' H% d  D0 a
    , z8 Y8 J/ }6 C7 m$ V7 I
        if ($this->save_file) {! P( {. k7 J# Q( |, A
            switch ($this->output_type){* `& c( {. @3 d5 h
                case 'gif':$src_img=ImagePNG($src_image, $this->save_file); break;, u/ e, @7 M2 t( R
                case 'jpeg':$src_img=ImageJPEG($src_image, $this->save_file, $this->jpeg_quality); break;
. @2 T7 y' o& T, y4 H8 P& A) J                case 'png':$src_img=ImagePNG($src_image, $this->save_file); break;
8 b, A3 z4 W4 x4 ]/ c( Y+ m                default:$src_img=ImageJPEG($src_image, $this->save_file, $this->jpeg_quality); break;
! o/ @0 R5 ~% V2 P) t' U            }: [" k% U6 ]6 K0 A9 B$ S( a
        } else {
/ g' k$ n$ K* z9 N/ M5 ]            if ($src_image_type = "jpg") $src_image_type="jpeg";. R* x  m( p& l& Y* ^1 }6 U2 S
                header("Content-type: image/{$src_image_type}");
5 v" e* B! L; K) a, k                switch ($src_image_type){
+ t3 ^$ }# @4 Y4 J) L                    case 'gif':$src_img=ImagePNG($src_image); break;
: {6 U6 h3 L! }7 }+ K, f' v7 l                    case 'jpg':$src_img=ImageJPEG($src_image, "", $this->jpeg_quality);break;7 C: I1 G/ f4 n$ c" H2 `
                    case 'png':$src_img=ImagePNG($src_image);break;
3 m6 D5 f) U/ O: r$ h) z                    default:$src_img=ImageJPEG($src_image, "", $this->jpeg_quality);break;0 H7 I6 ?9 }' ]* a, P( k/ h
                }# ?- a9 m' G# S) F0 J) D, G% J$ Z
            }0 j. X9 C: Y$ G8 p$ D) {
        imagedestroy($src_image);
/ o& B% @' B" E+ K; a8 m! P, l    }
+ f" F: P4 T6 ]    - y, }, ~( \; }5 R% \
    # N+ [* n5 j/ c$ j
    /**
9 d$ r4 w8 V# r; _3 M2 I8 ^- u     * 根据文件名和类型创建图片
# t" `: F) i: h  u, `! `+ }9 ]     * 5 \1 o1 K' x. d$ P* i
     * @access private% W% J$ {3 W4 l; T
     * @param string $type 图片的类型,包括gif,jpg,png
' t% P4 \; U( Y  G+ W( w$ {+ }     * @param string $img_name 图片文件名,包括路径名,如"./mouse.jpg"5 F/ x% z. A1 m" R) C4 a! @/ J
     * @return mixed $tmp_img 返回一图像标识符
  p: G" y- l' a4 R6 w' |     */
- V! [/ p' k6 u; a& @# U7 [    function createImage($type,$img_name){
. F5 }/ j  A4 y! }  {& A/ M! ]* n             if (!$type){
) e8 w" s7 Y  \3 x3 q7 C                  $type = $this->get_type($img_name);0 [6 C4 B! X& {. L
             }
3 _9 C0 \7 K) A6 \   
' A' F( G# {2 r  \3 Z: j8 I& }              switch ($type){
5 e1 ?0 I/ ^) F& D6 i                      case 'gif':- }0 M3 R) D: u+ @& S
                            if (function_exists('imagecreatefromgif'))$ I) |7 n3 N' H2 }
                                   $tmp_img=@ImageCreateFromGIF($img_name);
+ @" P# c2 f$ x) o5 |                            break;2 r. ]4 x+ ~" `+ d' v
                      case 'jpg':
: j$ m6 N( P* E( a                            $tmp_img=ImageCreateFromJPEG($img_name);
4 b' _- g* Q2 T: m  Z9 [% e                            break;
- @" A+ X3 H5 d: T                      case 'png':
: s" m3 O9 W! [. a/ @5 B( k. D" T                            $tmp_img=ImageCreateFromPNG($img_name);
$ m  {2 Z* }. K1 Y2 r, e( |" h2 D                            break;
, s' y2 Y( M1 N                      default:: y' z. \  p; f7 O/ N6 ^$ U3 b% b+ _
                            $tmp_img=ImageCreateFromString($img_name);; Q, S/ A5 [+ n! I* I
                            break;
" @/ G3 W* f  v( k' G8 t; X2 J              }  ~/ H: c6 u6 B, `
              return $tmp_img;
1 F3 i2 R& |+ u5 O    }4 z$ y. n0 {, l) X" m4 P- c
   
0 p  x3 v" C! O   
% j$ S8 M! ]1 o; [7 ?, r    /**  ~2 M. l& Q; h
     * 根据源图像的长、宽,位置代码,水印图片id来生成把水印放置到源图像中的位置) ^" l0 G7 ^  H( `
     *+ Q' C& Z8 g& w# s& z  Y
     * @access pravate7 L+ k6 @, N1 A
     * @param int $sourcefile_width 源图像的宽( |* \; H, H' z! j* n( |, ?
     * @param int $sourcefile_height 原图像的高9 A, G7 @& a5 u* M5 D2 s& u9 S
     * @param int $pos  位置代码" D8 V8 n- x: j' E. O' y
     *  0 = middle% E  I# A7 r$ d& |, s
     *  1 = top left- F7 l: A% G7 `1 g4 x
     *  2 = top right8 @  b& {/ n  I/ R5 A2 k2 K# d
     *  3 = bottom right
) ?, O8 {7 C4 L; ~* Y3 Z     *  4 = bottom left
. ]+ k- E2 j/ l0 R# {8 J     *  5 = top middle; {. C0 V) W1 \
     *  6 = middle right
9 [: M# M. G, |) u/ k- p, u     *  7 = bottom middle
$ T7 x+ m# k( ?: G9 W! e5 i' v+ k     *  8 = middle left! W7 Q0 z; B) ~) [: [2 @
     * @param int $wm_image 水印图片ID
, H  f; s2 v8 O3 t* ]) {% Z     * @return array 返回位置参数数组
- c1 q/ _8 i% R; F. _  _4 B     */
' h/ N) y' a0 w! i: Y7 `6 k8 q    function getPos($sourcefile_width,$sourcefile_height,$pos,$wm_image=""){
& i* i/ c  F3 o9 V         if  ($wm_image){
! ^9 p4 U4 ]2 S7 @1 f! j% P$ ]+ X              $insertfile_width = ImageSx($wm_image);5 `. ~' Y1 N& l. y- s
              $insertfile_height = ImageSy($wm_image);- l& X; d. o7 f2 ~) K0 `; V
         }else {5 }- k* V  V7 z+ O+ ]* A% A
              $lineCount = explode(". N1 u% a' Z$ a
",$this->wm_text);: p2 K  K, P8 j$ m- Q) S, J. f: K
              $fontSize = imagettfbbox($this->wm_text_size,$this->wm_text_angle,$this->wm_text_font,$this->wm_text);
! Q; I4 I+ l- D8 r7 H              $insertfile_width = $fontSize[2] - $fontSize[0];/ L/ N8 T0 J( ~1 D6 h/ ~( S0 q
              $insertfile_height = count($lineCount)*($fontSize[1] - $fontSize[3]);, G( @% r4 r) Z) M2 [! M
         }
* E; B5 ^# H* k( w8 y* B    $ |: }! {) Q; r. l  L7 _: ]7 B
         switch ($pos){
9 x  G( v' ?- b& w- O. l            case 0:
1 T) |( A- V! o+ C               $dest_x = ( $sourcefile_width / 2 ) - ( $insertfile_width / 2 );
5 y- I. t* w! e+ E* [% [               $dest_y = ( $sourcefile_height / 2 ) - ( $insertfile_height / 2 );
3 k8 D6 n* e) Q7 O, `- C) {6 p               break;
3 }' w4 e7 S5 T9 ]   
& n2 e4 _, N4 Q9 C' q            case 1:2 ]$ d9 J$ n6 K( W1 `
               $dest_x = 0;( X0 `  e- t" B0 D- A# x1 V/ _
               if ($this->wm_text){& l9 ~  q7 X' w' s+ J% V, c
                   $dest_y = $insertfile_height;
8 S# o. d4 g1 |$ ]+ K* H/ b               }else{
& y. s4 C3 a& W. R( y                   $dest_y = 0;
6 h: z& e; B' n( U3 D" E               }
$ u# {" ^4 S6 p               break;/ }6 O: q( P8 N, i8 R! k1 `' o1 g
   
8 W4 g; B+ p, I: Y            case 2:
( S- U- q! k# O1 V0 K. g. o                $dest_x = $sourcefile_width - $insertfile_width;9 u- I( J  Q* M( y2 {) b& F7 Q
                if ($this->wm_text){
+ o8 o5 Q" j# ]2 p( C                    $dest_y = $insertfile_height;8 C: P- S0 W: P5 L- [6 \  k0 A
                }else{% h3 N) @) ?! K' O2 G
                    $dest_y = 0;
/ j6 g% \; |! S; _/ ]! e                }
0 e0 P( u' t) T                break;( ?. F. E& Y$ l( j, |
    / ^4 w8 e) O7 j
            case 3:
- A5 d. k6 c( n- T, c: ]3 {$ _                $dest_x = $sourcefile_width - $insertfile_width;
8 v" h( s0 Z! {( Y                $dest_y = $sourcefile_height - $insertfile_height;9 n0 [$ @1 u' k6 f, @* ]. x
                break;( l# ?; ~; p5 r7 s/ `& h8 l
    $ a/ f# o( s  R
            case 4:3 f  ?/ N& I$ f4 u" }9 T: Y
                $dest_x = 0;
, @- t' o) z0 I# R4 l5 `6 D                $dest_y = $sourcefile_height - $insertfile_height;  ?  L- ~- N  Y) X) u. x
                break;7 s/ {; t9 T% |& M
    # \+ \9 a" ]) Y. M
            case 5:
+ E$ \7 _" o' w5 o8 _. o+ x+ D                $dest_x = ( ( $sourcefile_width - $insertfile_width ) / 2 );& o' {$ h* c6 V0 Z
                if ($this->wm_text){
! e2 ]* V( p( s8 @  f! ]                    $dest_y = $insertfile_height;) g8 F; l7 u) ]3 c5 c* Y% [3 A
                }else{; v4 P3 u6 i, t8 N2 s3 j
                    $dest_y = 0;
7 }5 Y1 t& I: Z3 {1 d. N                }
" K2 Q0 t9 o8 m  V, e, [- ^& g) d# W                break;
: A+ h) P& S: K$ a5 W; x    ) S- q0 J1 @6 M$ ?" D
            case 6:  {2 t7 \9 D5 t4 Q4 g: |# i9 Z
                $dest_x = $sourcefile_width - $insertfile_width;8 p% l2 R8 \- Z1 L0 H6 u
                $dest_y = ( $sourcefile_height / 2 ) - ( $insertfile_height / 2 );/ N+ [- w0 _) c. j" V
                break;
2 z! l$ E. T* P2 q2 I& }   
, n( z9 }1 }* E8 v' ?- m            case 7:0 d: R: B' N/ Z- d/ B
                $dest_x = ( ( $sourcefile_width - $insertfile_width ) / 2 );& N6 C& C# F7 O1 z- v
                $dest_y = $sourcefile_height - $insertfile_height;2 {9 G7 a) |3 k( i& L) f! e' n- Q
                break;8 U$ C) u- w2 O2 D% i; Y
   
( G6 ?& G: p) h            case 8:, n9 h0 H* {# H8 U, v, s8 P8 P
                $dest_x = 0;, U7 f. Q5 V  V/ T3 c4 Y
                $dest_y = ( $sourcefile_height / 2 ) - ( $insertfile_height / 2 );# n3 }& U/ U, b6 c
                break;/ x9 O* X$ h. d4 f% q+ f
   
4 s( p/ u0 c6 {% N# l/ V3 a            default:
, C( t8 K7 \- }* [' y6 ~! t                $dest_x = $sourcefile_width - $insertfile_width;0 ^# P6 y* f% V! E+ s
                $dest_y = $sourcefile_height - $insertfile_height;
4 n0 P7 [2 ]$ ^- e3 b4 U                break;* ]" F5 e, q+ b6 R& \
         }
- o; |% B5 X7 @2 R- P3 @# t        return array("dest_x"=>$dest_x,"dest_y"=>$dest_y);( n7 J5 l# E3 o) C9 H# X" X
    }
; R) n! x0 B* Y8 |2 |; m- D9 g2 T   
+ m7 l% C5 {# j    /**
1 G$ A! \- l1 L: f% U& ~: S) W     * 指定的文字转换为UTF-8格式,包括中英文混合
3 F: i5 c$ m6 a# ~4 k     *
* ^* G  T2 I) Z4 y( v     * @access private% c2 E9 R" V& Q
     * @param string $gb 输入gb类型的字数串
! ?  V# R4 r' h$ B& E     * @return string $utf8
2 l8 l7 Q4 c( W     */
& v2 R2 w. _; s9 L8 X2 ?    function gb2utf8($gb)
# u$ z3 K5 }" p- }8 A    {
1 ?* Z; O+ z$ E6 L7 k$ J& j1 @        if(!trim($gb))1 Z" q0 k( S9 D4 `: k9 G
            return $gb;
4 E- W0 J7 O: ^8 o" j& P; c        $filename="./gb2312.txt";
5 U/ E. d) g' E: w, Q! R0 Q        $tmp=file($filename);
( K) E) W7 P! q0 A: G7 D        $codetable=array();3 w2 L' J3 O. F+ x* h7 R( h
        while(list($key,$value)=each($tmp))
7 W* z' H( }) v/ O9 Q        $codetable[hexdec(substr($value,0,6))]=substr($value,7,6);$ S7 \( c# x! k  X' ^
        1 T2 @. L1 u+ L
        $utf8="";; K$ [9 r* J4 r" }$ D/ S2 }
        while($gb)- `$ F6 R4 u; ], I# Y' V
        {' f/ E# f: }' i' ^. A, k7 a% {
            if (ord(substr($gb,0,1))>127) {
; |- R# V0 Y: Y2 n                $tthis=substr($gb,0,2);/ b. v! o8 B, M* ]5 g: X+ @) }# M
                $gb=substr($gb,2,strlen($gb)-2);! ]5 W; x) `3 e! |. W, N6 U  w0 q
                $utf8.=$this->u2utf8(hexdec($codetable[hexdec(bin2hex($tthis))-0x8080]));
% q: T; L  i* y' H- U& X% @            } else {6 w/ t4 [: |+ T+ u7 N( q3 r
                $tthis=substr($gb,0,1);# a4 p3 O; S& B. n5 M3 n; D
                $gb=substr($gb,1,strlen($gb)-1);
/ Y2 M9 l6 {4 s7 [. K- [7 G                $utf8.=$this->u2utf8($tthis);
- ?+ A5 `  ~. d9 P            }
2 f4 X0 z. c, ?7 X& `  B! i7 _        }' }8 g; B- v# v" S. K2 w0 [* `
        return $utf8;
/ h9 P) \2 q) Y: ]& E6 w$ I    }
, \0 A" U, M, o$ M4 `    + Q2 R5 e; r+ G5 v7 K  z5 _
    function u2utf8($c)
# o; q4 R" R: [* c- D    {
9 M5 H1 {0 m. L/ J$ K! n! V" V  ]        $str="";$ a( ?0 F+ q% e; d  l
        if ($c < 0x80) {
9 L! j' U5 T2 S1 e            $str.=$c;  o4 X# ~( }0 r# j( I1 O" }
        } else if ($c < 0x800) {2 S7 {4 O, @& r1 c2 W
            $str.=chr(0xC0 | $c>>6);
2 D' A0 ~+ D2 d8 P! s* n( V! C            $str.=chr(0x80 | $c & 0x3F);$ D9 [: M' v, j+ B) N' m
        } else if ($c < 0x10000) {
7 F  K6 y+ z% X  R7 l. [! M            $str.=chr(0xE0 | $c>>12);
  h" ?" r/ U$ M  g: Z9 b            $str.=chr(0x80 | $c>>6 & 0x3F);
1 V# ^6 p" b* N5 S* V6 Y            $str.=chr(0x80 | $c & 0x3F);1 f' Y5 d$ `& p! ~
        } else if ($c < 0x200000) {
& c9 K) s  T4 [% \% E  L' ]$ s            $str.=chr(0xF0 | $c>>18);# d' S( c( w; z% s: L; m
            $str.=chr(0x80 | $c>>12 & 0x3F);
. E, H: j5 \( _7 K            $str.=chr(0x80 | $c>>6 & 0x3F);' n5 Y: p% o1 y4 R; A: m2 v# W
            $str.=chr(0x80 | $c & 0x3F);# R% R- r. P$ v
        }
. v# g6 q; y+ m) K* h        return $str;
7 u8 Z. ]  i3 N1 f8 w    }
7 ~9 {! h; m/ L# y0 B. k+ [$ F    7 S3 Q5 m7 n$ h4 N
    /**# @! a# `; T8 D0 P
     * 获得图片的格式,包括jpg,png,gif
9 ]7 N3 v! c  L0 h! l* j     *
/ ?% }; s, J+ j2 f* G; O     * @access private+ ~9 h# r' v% u$ y
     * @param string $img_name 图片文件名,可以包括路径名+ m/ e0 O  A) c" @6 {! w+ x- }
     * @return string $type4 N- y3 G8 h7 |: N
     */5 ^2 ^1 K5 o6 I5 g
    function get_type($img_name)! n  q8 L- L% Q% N
    {
" e" g% ^$ l% _) \& L( Z/ C* @        $name_array = explode(".",$img_name);
" a; k6 L: _6 U) f- [) h        if (preg_match("/.(jpg|jpeg|gif|png)$/", $img_name, $matches))' T! F+ C  N5 B/ S
            $type = strtolower($matches[1]);% q! s3 }/ o* `6 S
        else% {# u! H" g- ^
            $type = "string";/ f/ z/ l* C3 v* B# q- D
        
4 @7 I1 n' [7 b+ b+ G% v$ c        return $type;3 L5 s: {: n4 {+ B0 v
    }
/ _1 I: x* t% I. G
2 e% t) Z, B; F/ {}
- Q6 D; x" D  n6 Y( ??>, V4 i7 C) X; j6 \' Z* D: _( G
该类使用方法如下:
+ F& |, F' o# L2 M4 ^+ b# x6 g
. L& ^' U) W" Y' O( @( _8 b: S/ ~' r$img = new Gimage();
/ u2 p  r  e4 V$img->wm_text = "www.discuz.com";
9 G* q0 T9 t# s" Z$ |) J$img->wm_text_font = "./STXINWEI.TTF";- u$ i8 h' a8 L* l0 _  w) c
$img->create("./mouse.jpg");: u+ Y/ C1 I* _  r+ l
mouse.jpg 是你要在其上添加水印的图片名称,注意包含路径名
3 F/ u+ Y1 @4 pSTXINWEI.TTF 是字体文件的路径名+文件名) f1 @% a' D2 ^1 ?' R9 O( E
这就是一个简单的测试。如果要调整更复杂的显示效果,只要修改一下类中的属性就可以了,例如把字体放大就可以
7 I, `" C7 A+ r" q, j" x: N$img->wm_text_size = 20;
6 A3 L% i, L. u- ^0 l增加水印图片就可以
3 X5 }# q- J( z+ _$img->wm_image_name=”文件名”; 5 E* R4 f& R$ b) G) G, y; C- j4 P
" _0 V) m4 J4 q$ D
二、给图片增加水印的php文件,包含实际运行代码,支持图片和文字水印
4 A) d6 s- n' T2 f% D
/ G' b" b# Q) G) S( E( v<?php
  V! ?4 O7 k( m9 B: N' P( c: i" M" \6 ~/* ; i. W4 R6 a. @( S$ r! o* ]" K( @6 w
* 功能:PHP图片水印 (水印支持图片或文字)
$ _3 J8 [1 w" ~: M* ]* 参数: ' Z, t; K) C" x/ R& w7 E1 Q3 R
*      $groundImage    背景图片,即需要加水印的图片,暂只支持GIF,JPG,PNG格式;
3 |( F7 ?* u5 |* k: s- E4 t*      $waterPos       水印位置,有10种状态,0为随机位置;
, e1 \) o# k; o* }*                      1为顶端居左,2为顶端居中,3为顶端居右;
- M( P5 r6 k2 E5 V, E*                      4为中部居左,5为中部居中,6为中部居右; ' |6 C2 X6 v; R8 I
*                      7为底端居左,8为底端居中,9为底端居右;
& u6 C, Z8 Q4 o* }# h*      $waterImage     图片水印,即作为水印的图片,暂只支持GIF,JPG,PNG格式;
2 Z3 y7 F3 R) `: y) W, G*      $waterText      文字水印,即把文字作为为水印,支持ASCII码,不支持中文;
0 w* p3 H2 D  l( e, u*      $textFont       文字大小,值为1、2、3、4或5,默认为5; & J2 ?' y! }* F
*      $textColor      文字颜色,值为十六进制颜色值,默认为#FF0000(红色);
" U0 B" t  t5 o" t2 ^" T$ e*
6 B9 z8 h4 Q/ o1 _/ `) m0 R* 注意:Support GD 2.0,Support FreeType、GIF Read、GIF Create、JPG 、PNG
/ B( q5 s) M: D" y*      $waterImage 和 $waterText 最好不要同时使用,选其中之一即可,优先使用 $waterImage。
& `9 t5 d  x; _; }& V*      当$waterImage有效时,参数$waterString、$stringFont、$stringColor均不生效。
) I$ s! }$ Y+ q! a*      加水印后的图片的文件名和 $groundImage 一样。 6 W  ?* S6 ]" D
* 作者:longware @ 2004-11-3 14:15:13 ; ]6 }, q1 ?' u5 H: x. b8 ?
*/ 4 w4 Y+ q: P) W. n  H
function imageWaterMark($groundImage,$waterPos=0,$waterImage="",$waterText="", $textFont=5,$textColor="#FF0000") * [- s! [' S) ^7 K, U5 X! h) I% A
{
3 f! H. M" I1 z3 u/ m    $isWaterImage = FALSE;
3 R: L" F+ N- I% K' t" ^    $formatMsg = "暂不支持该文件格式,请用图片处理软件将图片转换为GIF、JPG、PNG格式。"; # K" ]; i) Q5 K

) m* i$ i9 ^- U& v# Q    //读取水印文件
" L' o0 y# R9 Z, @7 q    if(!empty($waterImage) && file_exists($waterImage)) { 1 S/ o" Y! i% v. C/ Z
        $isWaterImage = TRUE;
) l# Z1 _) R% i        $water_info = getimagesize($waterImage);
* k- @2 Y3 p" o5 \' W% R! [6 p( e        $water_w    = $water_info[0];//取得水印图片的宽
; r0 X* r2 \0 z$ r/ B        $water_h    = $water_info[1];//取得水印图片的高
: v' d6 M2 v. n6 ]7 h4 t   q& g: y0 C% Q; g( d
        switch($water_info[2])  {   //取得水印图片的格式  
! ^" Y* E2 R1 t0 K4 {3 h            case 1:$water_im = imagecreatefromgif($waterImage);break;
1 |2 Z/ h/ Z$ f3 [            case 2:$water_im = imagecreatefromjpeg($waterImage);break;
# H/ H/ F: R5 `+ m# p2 N            case 3:$water_im = imagecreatefrompng($waterImage);break; / J. Z/ d3 C, B' q
            default:die($formatMsg); * ~% W& }! R' u' m% N% N! {5 y
        } 9 J8 m9 v. W, m0 y" p
    }
. e6 n; ]0 ]) c' R0 L% N; N + W# ]+ \( H! U5 K, e) g
    //读取背景图片 ' Q2 W; J6 Z% B% G8 s
    if(!empty($groundImage) && file_exists($groundImage)) { & i8 g9 B% U: s7 I4 U$ b* d% w
        $ground_info = getimagesize($groundImage); ) J4 ^2 |, X: E% T, ^) M% I
        $ground_w    = $ground_info[0];//取得背景图片的宽
! U& t: c4 ^, L        $ground_h    = $ground_info[1];//取得背景图片的高
: F0 H4 V- ^& S0 Z  Z
- Q4 d7 S( Q) ]. W4 k; [4 F4 v        switch($ground_info[2]) {   //取得背景图片的格式  
' @1 W+ |% h4 s2 K5 |            case 1:$ground_im = imagecreatefromgif($groundImage);break;
- ~8 p7 ^% q4 ]% z            case 2:$ground_im = imagecreatefromjpeg($groundImage);break;
6 V+ O* \9 P4 f8 K- V1 h7 M" P# q            case 3:$ground_im = imagecreatefrompng($groundImage);break;
7 H- c  b/ b& F8 Q            default:die($formatMsg); " T" j5 [& l4 ?
        } 1 W1 g) Y3 b: m4 A8 [) [
    } else { - _* _9 u9 C" W
        die("需要加水印的图片不存在!");
, [: f1 l; |& ]3 I( h    }
" A" ]! R8 I9 H6 q- }1 T3 N: q 3 @. w+ n* v$ Y% Z
    //水印位置
6 i) i4 \% d" N3 J! ~    if($isWaterImage) { //图片水印  1 z/ C3 g% x$ i  \7 |$ n( k7 H
        $w = $water_w; ( a8 v/ G; M* f, @2 k. w9 x
        $h = $water_h;
# Q9 j& R/ w, l3 i* s6 ]5 B' d        $label = "图片的";
, V  P! U' m* I7 h    } else {  //文字水印 " _2 V7 N4 ?' p' s- @4 U
        $temp = imagettfbbox(ceil($textFont*2.5),0,"./cour.ttf",$waterText);//取得使用 TrueType 字体的文本的范围
) T* v" Q8 A% v% K' L        $w = $temp[2] - $temp[6]; 9 k" ~+ b; Q! b( z
        $h = $temp[3] - $temp[7];
" V  }9 Z- t5 I- J) a1 U5 F5 @        unset($temp); 0 R% d+ u8 T+ p! t
        $label = "文字区域";
8 L  f2 L! O2 d7 ]8 q- D+ |6 I    } ; @1 X7 o# Z) u! j6 C% Q- P
    if( ($ground_w<$w) || ($ground_h<$h) ) {
6 Z% L' O6 `  x0 H; M% F) T' O        echo "需要加水印的图片的长度或宽度比水印".$label."还小,无法生成水印!"; / ~+ k, D0 o: a% U- {3 k+ ~
        return;
7 h  }- ~% y* ^2 w    } 8 y9 n: ]7 E3 d7 R; Z
    switch($waterPos) {
  p8 s+ R8 U8 M. X        case 0://随机
  C8 B9 A7 B6 ~7 o( o7 R1 D            $posX = rand(0,($ground_w - $w));
! ^# A* A: d. j- Q- N! z            $posY = rand(0,($ground_h - $h));
% x3 X; h2 P9 {$ o  W! E6 m& l            break; . H; B% x" d0 N# |0 K0 f
        case 1://1为顶端居左
0 j: m7 M+ E- o2 w) k, {            $posX = 0;
0 r  f  b. u" f9 r8 h: y            $posY = 0; " d' j2 V' P/ U) ~
            break;
8 E9 M( c! y$ d) T- `        case 2://2为顶端居中
8 I& d! R0 j' `( }            $posX = ($ground_w - $w) / 2; ( |/ Z/ @8 M/ A' w9 E
            $posY = 0; 1 ^& f+ n/ k( {: }5 t3 z" C! r2 E
            break;
5 h+ f: }% M, y1 M, C        case 3://3为顶端居右
" F! n! [6 H( s7 U, Q' `            $posX = $ground_w - $w;
- O- \: m: O' n- e$ S+ b# H* n5 D            $posY = 0;
+ ?# b" s% r% Y' e3 ?! U. z            break;
: B9 {3 Y) Q: N        case 4://4为中部居左   e5 r) r! c1 o4 I
            $posX = 0; 5 O9 b& O& L( n# x3 J
            $posY = ($ground_h - $h) / 2;
( A+ \5 h- D  B: G/ h6 N            break;
9 _9 X$ q  |5 ~: x+ l& f( M        case 5://5为中部居中 4 Y  \+ S, L; N7 w7 x7 @) e$ t$ q
            $posX = ($ground_w - $w) / 2;
! H6 R8 t1 S/ v$ w9 Y            $posY = ($ground_h - $h) / 2;
/ z) j3 _- I" x1 ?1 @  q            break;
5 K- m5 f+ k) z$ y( g7 z        case 6://6为中部居右
; x! U7 w7 Z( x% u2 W1 R            $posX = $ground_w - $w;
2 H+ D' t; W* d            $posY = ($ground_h - $h) / 2;
' j( S- q9 J) l+ w            break;
1 p+ s5 y& p0 ]1 X5 F' l, Z        case 7://7为底端居左
8 t3 o% y2 C4 L            $posX = 0;
, f& i& D0 d6 m            $posY = $ground_h - $h; , T, ~% q9 j% _0 B& l1 L
            break; 4 S7 A, E9 b4 z. i0 w
        case 8://8为底端居中
7 i- N( Q% M+ u6 k            $posX = ($ground_w - $w) / 2; % t# l! n6 u% \6 |3 `
            $posY = $ground_h - $h;
5 ?* o1 B4 r+ P            break; 8 K& @* m: j1 J$ q/ E. q
        case 9://9为底端居右 3 X- h; t% R' h# f
            $posX = $ground_w - $w; $ U$ S" F' Z% y; ^/ T( d, e
            $posY = $ground_h - $h;
1 x8 C4 p6 v$ _& }            break;
* h9 e+ M* }) E$ n        default://随机
: ~8 `2 A& w* ^& \            $posX = rand(0,($ground_w - $w)); " W% m8 R% {5 X5 E* a
            $posY = rand(0,($ground_h - $h));
- C- e2 f9 Z& v' s/ ^% X            break;     
  t, z- t5 H2 |6 }3 C) b    } ' y: u7 a5 s* l! y2 A, v6 L

" \9 }% k( {) i0 M6 b    //设定图像的混色模式
6 n* ]/ W$ _0 N+ L9 K1 S% o: D    imagealphablending($ground_im, true); + A! X* A. U  K) x& A% s  \
  n2 _) v. k% @4 l
    if($isWaterImage) { //图片水印
* @+ ^, g: P' N/ ]1 e        imagecopy($ground_im, $water_im, $posX, $posY, 0, 0, $water_w,$water_h);//拷贝水印到目标文件         
( B9 d( G$ ]$ ]( c# F" Y; U$ \2 S    } else {//文字水印% v% W7 m! B; U
        if( !empty($textColor) && (strlen($textColor)==7) ) {
( i0 a9 [' E: Z& i1 }7 d! o7 k% _            $R = hexdec(substr($textColor,1,2));
" C7 }0 C+ Q/ o: N3 Q: L  H            $G = hexdec(substr($textColor,3,2)); 6 ?: K+ i5 f# p( ?' J5 _- A2 g1 V( @! u; H
            $B = hexdec(substr($textColor,5)); 5 ?0 ~( y' x; m' _: W: o
        } else {
! I/ F0 }6 `8 _# m' c1 _+ @            die("水印文字颜色格式不正确!");
* m. X) D- Q3 S, z        }
7 M) U2 q% V' Z' |# U1 v        imagestring ( $ground_im, $textFont, $posX, $posY, $waterText, imagecolorallocate($ground_im, $R, $G, $B));         . H# `6 Y! N; E
    } - C8 t3 N5 f2 Q8 v+ [

) l% ]# V: x5 @' u% o    //生成水印后的图片 5 ?! H/ V1 H  o& k
    @unlink($groundImage);
! k, ~1 ?+ R) L1 L& l    switch($ground_info[2]) {//取得背景图片的格式
6 T# z  S- Q" y' ~4 |        case 1:imagegif($ground_im,$groundImage);break;
; z6 D$ t/ i8 c% j0 l6 d        case 2:imagejpeg($ground_im,$groundImage);break; 4 F5 n$ b. j& x1 h& Y( M* H9 G
        case 3:imagepng($ground_im,$groundImage);break;
" }! C. |! a0 T6 m3 ?' v3 B, |        default:die($errorMsg);
1 t+ f" T9 f; |$ q* Z; M" d    } % I; J# I9 _5 H
6 H8 t. p+ V7 [! J. O4 Y5 N
    //释放内存 : \. O. H8 H4 X9 d* H3 f# G. N- h" r
    if(isset($water_info)) unset($water_info);
& O8 {0 O, Y- }9 y) x8 _9 K    if(isset($water_im)) imagedestroy($water_im);
) j1 w) }+ B- E7 b    unset($ground_info);
* O; S! r+ ?, ]    imagedestroy($ground_im);
- k- [! N3 {! Q" t} 4 |$ `- |7 I: s5 Z9 G9 e
/ X$ v) T, X% u
# P6 J3 x4 z" t

  C$ _) l% Y, Y- h, k4 Eif(isset($_FILES) && !empty($_FILES['userfile']) && $_FILES['userfile']['size']>0) { ( Z) b  O+ o) i$ B: C
    $uploadfile = "./".time()."_".$_FILES['userfile']['name']; + f6 e: _. m1 C; s1 P
    if (copy($_FILES['userfile']['tmp_name'], $uploadfile)) {
% {. Z8 j/ }1 w4 Z        echo "OK<br>";
8 U  i. M' J  I2 k' G) q# l 8 d2 N! M2 l% }  X
        //文字水印
8 `: P( w2 [9 a6 \        imageWaterMark($uploadfile,0,"","HTTP://BLOG.CSDN.NET/LONGWARE/",5,"#FF0000"); 6 C2 d) `9 M; a" Z' c
2 M: z0 V) i8 B6 L7 Y, _/ g$ c
        //图片水印 1 Y; B7 ]6 C) V
        //$waterImage="./Hanweb_shuiyin.gif";//水印图片路径
, f( t1 b3 m- z* s, l% l        //imageWaterMark($uploadfile,0,$waterImage); ; q) E* C; L  P2 V% m9 F( I
( ?  |  a& ?  F
        echo "<img src="".$uploadfile."" border="0">";
/ q( T+ z  i# x: B6 b6 V3 v    } else {
5 w6 N. D0 w# I2 X8 N7 u; R        echo "Fail<br>"; 8 S( A  c* ^' V
    } 3 B! O% Z3 w7 L3 `: f/ Y4 T  h: O
}   t/ z7 f( f. R5 {: E
?> ( K' H% L! w$ \* c7 V% J+ s# M1 M
3 X2 Q7 f* j- ~+ ~& z
<form enctype="multipart/form-data" method="POST"> 1 u9 ~  R2 y9 g
文件: <input name="userfile" type="file"> , L3 _6 N# K6 M/ ^% g6 s/ U% \- Z
<input type="submit" value="上传"> / `( S- I1 ]7 q2 v( Z
</form>
发新话题