Maison  >  Article  >  développement back-end  >  php 图片操作类,支持生成缩略图,添加水印,上传缩略图

php 图片操作类,支持生成缩略图,添加水印,上传缩略图

WBOY
WBOYoriginal
2016-06-23 09:15:11728parcourir

class  Image {

     //类开始

     public  $originimage  =  "" ;  //源图片文件地址

     public  $imageext  =  "" ;  //源图片格式

     public  $thumbimage  =  "" ;  //缩略图文件存放地址

     public  $thumb_maxwidth  = 1440;  //缩略图最大宽度

     public  $thumb_maxheight  = 900;  //缩略图最大高度

     public  $watermark_text  =  "" ;  //水印文字内容

     public  $watermark_minwidth  = 300;  //源图片最小宽度:大于此值时加水印

     public  $watermark_minheight  = 200;  //源图片最小高度:大于此值时加水印

     public  $watermark_fontfile  =  "" ;  //字体文件

     public  $watermark_fontsize  = 14;  //字体大小

     public  $watermark_logo  =  "config/water.png" ;  //水印LOGO地址

     public  $watermark_transparent  = 20;  //水印LOGO不透明度

     private  $origin_width  = 0;  //源图片宽度

     private  $origin_height  = 0;  //源图片高度

     private  $imageQuilty  = 90;  //图片质量

     private  $tmp_originimage  =  "" ;  //临时图片(源图片)

     private  $tmp_thumbimage  =  "" ;  //临时图片(缩略图)

     private  $tmp_waterimage  =  "" ;  //临时图片(水印LOGO)

     private  $_waterPosition  = 2;  //1正中间 2右下角

     //生成缩略图

     public  function  gen_thumbimage() {

         if  ( $this ->originimage ==  ""  ||  $this ->thumbimage ==  "" ) {

             return  0;

         }

         $this ->get_oriwidthheight ();

         if  ( $this ->origin_width thumb_maxwidth &&  $this ->origin_height thumb_maxheight) {

             $this ->thumb_maxwidth =  $this ->origin_width;

             $this ->thumb_maxheight =  $this ->origin_height;

         }  else  {

             if  ( $this ->origin_width origin_height) {

                 $this ->thumb_maxwidth = ( $this ->thumb_maxheight /  $this ->origin_height) *  $this ->origin_width;

             }  else  {

                 $this ->thumb_maxheight = ( $this ->thumb_maxwidth /  $this ->origin_width) *  $this ->origin_height;

             }

         }

         $this ->get_imagetype ();

         $this ->gen_tmpimage_origin ();

         $this ->gen_tmpimage_thumb ();

         if  ( $this ->tmp_originimage ==  ""  ||  $this ->tmp_thumbimage ==  "" ) {

             return  - 1;

         }

         imagecopyresampled (  $this ->tmp_thumbimage,  $this ->tmp_originimage, 0, 0, 0, 0,  $this ->thumb_maxwidth, $this ->thumb_maxheight,  $this ->origin_width,  $this ->origin_height );

         switch  ( $this ->imageext) {

             case  "gif"  :

                 imagegif (  $this ->tmp_thumbimage,  $this ->thumbimage );

                 return  1;

                 break ;

             case  "jpg"  :

                 imagejpeg (  $this ->tmp_thumbimage,  $this ->thumbimage,  $this ->imageQuilty );

                 return  2;

                 break ;

             case  "png"  :

                 imagepng (  $this ->tmp_thumbimage,  $this ->thumbimage );

                 return  3;

                 break ;

             default  :

                 return  - 2;

                 break ;

         }

     }

     //添加文字水印

     public  function  add_watermark1() {

         if  ( $this ->originimage ==  ""  ||  $this ->watermark_text ==  ""  ||  $this ->watermark_fontfile ==  "" ) {

             return  0;

         }

         $this ->get_oriwidthheight ();

         if  ( $this ->origin_width watermark_minwidth ||  $this ->origin_height watermark_minheight) {

             return  0;

         }

         $this ->get_imagetype ();

         $this ->gen_tmpimage_origin ();

         if  ( $this ->tmp_originimage ==  "" ) {

             return  - 1;

         }

         $textcolor  = imagecolorallocate (  $this ->tmp_originimage, 255, 0, 0 );

         $angle  = 0;

         $px  =  $this ->origin_width / 2 - 200;

         $py  =  $this ->origin_height / 2 - 10;

         imagettftext (  $this ->tmp_originimage,  $this ->watermark_fontsize,  $angle ,  $px ,  $py ,  $textcolor ,  $this ->watermark_fontfile,  $this ->watermark_text );

         switch  ( $this ->imageext) {

             case  "gif"  :

                 imagegif (  $this ->tmp_originimage,  $this ->originimage );

                 return  1;

                 break ;

             case  "jpg"  :

                 imagejpeg (  $this ->tmp_originimage,  $this ->originimage,  $this ->imageQuilty );

                 return  2;

                 break ;

             case  "png"  :

                 imagepng (  $this ->tmp_originimage,  $this ->originimage );

                 return  3;

                 break ;

             default  :

                 return  - 2;

                 break ;

         }

     }

     //添加LOGO水印

     public  function  add_watermark2() {

         if  ( $this ->originimage ==  ""  ||  $this ->watermark_logo ==  "" ) {

             return  0;

         }

         $this ->get_oriwidthheight ();

         if  ( $this ->origin_width watermark_minwidth ||  $this ->origin_height watermark_minheight) {

             return  0;

         }

         $this ->get_imagetype ();

         $this ->gen_tmpimage_origin ();

         $this ->gen_tmpimage_waterlogo ();

         if  ( $this ->tmp_originimage ==  ""  ||  $this ->tmp_waterimage ==  "" ) {

             return  - 1;

         }

         list (  $logo_width ,  $logo_height  ) =  getimagesize  (  $this ->watermark_logo );

         //正中间

         $waterZb  =  $this ->waterPosition (  $logo_width ,  $logo_height  );

         $px  =  $waterZb  [ 'x' ];

         $py  =  $waterZb  [ 'y' ];

         imagecopymerge (  $this ->tmp_originimage,  $this ->tmp_waterimage,  $px ,  $py , 0, 0,  $logo_width , $logo_height ,  $this ->watermark_transparent );

         switch  ( $this ->imageext) {

             case  "gif"  :

                 imagegif (  $this ->tmp_originimage,  $this ->originimage );

                 return  1;

                 break ;

             case  "jpg"  :

                 imagejpeg (  $this ->tmp_originimage,  $this ->originimage,  $this ->imageQuilty );

                 return  2;

                 break ;

             case  "png"  :

                 imagepng (  $this ->tmp_originimage,  $this ->originimage );

                 return  3;

                 break ;

             default  :

                 return  - 2;

                 break ;

         }

     }

      

     /**

      * 上传缩略图

      * 注意上传文件大小限制

      *@param String $files $_FILES['upload'] 类型

      *@param String  $path  存储的目录 默认在/static/attached/

      *@param boolean $isWater 是否添加水印

      * @return string $filePath 网页url图片路径

      */

     public  function  upload( $files ,  $path ,  $isWater ) {

         if  ( is_uploaded_file  (  $files  [ 'tmp_name' ] )) {

             $upfile  =  $files ;

             $name  =  $upfile  [name];

             $type  =  $upfile  [type];

             $size  =  $upfile  [size];

             $tmp_name  =  $upfile  [tmp_name];

             $error  =  $upfile  [error];

              

             if  ( $size  > 1048576) {

                 return  array  ( 'status'  => false,  'message'  =>  "$name图片太大超过1MB"  );

             }

              

             $rs  =  $this -> getImageSize  (  $tmp_name  );

             if  (!  $rs  [ 'status' ]) {

                 $rs  [ 'message' ] =  $name  .  $rs  [ 'message' ];

                 return  $rs ;

             }

              

             // 创建文件夹

             $save_path  =  getcwd  () .  "/static/attached/"  .  $path  .  "/" ;

             $save_url  =  "./static/attached/"  .  $path  .  "/" ;

             $ym  =  date  (  "Ym"  );

             $save_path  .=  $ym  .  "/" ;

             $save_url  .=  $ym  .  "/" ;

             if  (!  file_exists  (  $save_path  )) {

                 mkdir  (  $save_path  );

             }

              

             if  ( $error  ==  '0' ) {

                 $fileType  =  substr  (  $name ,  strpos  (  $name ,  "."  ) + 1 );

                 $prefix  =  $this ->getRandPrefix ();

                 $newName  =  date  (  "YmdHi"  ) .  $prefix  .  "."  .  $fileType ;

                 $filepath  =  $save_path  .  $newName ;

                 move_uploaded_file (  $tmp_name ,  $filepath  );

              

             }

              

             if  ( $isWater ) {

                 $this ->water (  $filepath  );

             }

              

             return  array  ( 'status'  => true,  'message'  =>  $save_url  .  $newName  );

         }

     }

      

     /**

      * 图片增加水印处理

      * @param unknown_type $image

      */

     public  function  water( $image ) {

         $this ->watermark_logo = ROOT .  $this ->watermark_logo;

         $this ->originimage =  $image ;

         //LOGO水印

         $this ->add_watermark2 ();

     }

      

     /**

      *

      * 获取随机前缀

      */

     private  function  getRandPrefix() {

         $string  =  "abcdefghijklmnopqrstuvwxyz0123456789" ;

         $prefix  =  '' ;

         for ( $i  = 0;  $i 

             $rand  = rand ( 0, 33 );

             $prefix  .=  $string  { $rand };

         }

         return  $prefix ;

     }

      

     //检测图片大小

     private  function  getImageSize ( $image ) {

         list (  $width ,  $height ,  $type ,  $attr  ) =  getimagesize  (  $image  );

          

         if  ( $type  != 2 &&  $type  != 3) {

             return  array  ( 'status'  => false,  'message'  =>  "图片格式不正确,请上传JPG或者PNG图片"  .  $type  );

         }

         //检测图片大小

         if  ( $width  > 1440) {

             return  array  ( 'status'  => false,  'message'  =>  "图片宽度请小于1440px,当前为"  .  $width  .  "px"  );

         }

          

         if  ( $height  > 900) {

             return  array  ( 'status'  => false,  'message'  =>  "图片高度请小于900px,当前为"  .  $height  .  "px"  );

          

         }

         return  array  ( 'status'  => true );

     }

      

     /**

      * 生成缩略图

      *

      * @param String $imagefile 原始文件

      * @param String $thumbWidth  缩略图宽度

      * @param String $thumbHeight 缩略图高度

      * @return String 缩略图url        

      */

     public  function  reduceImage( $imagefile ,  $thumbWidth ,  $thumbHeight ,  $path  =  "thumb" ) {

          

         // 生成缩略图

         $dir  =  date  (  "Ym" , time () );

         $imagefile  = ROOT .  $imagefile ;

         $imagefile_s  = ROOT .  "static/attached/"  .  $path  .  "/"  .  $dir  .  "/s_"  .  basename  (  $imagefile  );

         $imagetrans  =  new  Image ();

         $imagetrans ->originimage =  $imagefile ;

         $imagetrans ->thumbimage =  $imagefile_s ;

         $imagetrans ->thumb_maxwidth =  $thumbWidth ;

         $imagetrans ->thumb_maxheight =  $thumbHeight ;

         $isokid  =  $imagetrans ->gen_thumbimage ();

          

         return  "./static/attached/"  .  $path  .  "/"  .  $dir  .  "/s_"  .  basename  (  $imagefile  );

      

     }

     /**

      * 水印位置

      * @param int $logo_width

      * @param int $logo_height

      * @return 水印坐标

      */

     private  function  waterPosition( $logo_width ,  $logo_height ) {

         switch  ( $this ->_waterPosition) {

             case  1 :

                 $px  =  $this ->origin_width / 2 -  $logo_width  / 2;

                 $py  =  $this ->origin_height / 2 -  $logo_height  / 2;

                 break ;

             case  2 :

                 $px  =  $this ->origin_width -  $logo_width  - 10;

                 $py  =  $this ->origin_height -  $logo_height  - 10;

                 break ;

             default  :

                 $px  =  $this ->origin_width / 2 -  $logo_width  / 2;

                 $py  =  $this ->origin_height / 2 -  $logo_height  / 2;

                 break ;

         }

          

         return  array  ( 'x'  =>  $px ,  'y'  =>  $py  );

     }

     //获取图片尺寸

     private  function  get_oriwidthheight() {

         list (  $this ->origin_width,  $this ->origin_height ) =  getimagesize  (  $this ->originimage );

         return  1;

     }

     /*

      * 检测图片格式

      * 原方法需要开启exif 扩展

      */

     private  function  get_imagetype() {

         $ext  =  $this ->getImgext (  $this ->originimage );

         switch  ( $ext ) {

             case  1 :

                 $this ->imageext =  "gif" ;

                 break ;

             case  2 :

                 $this ->imageext =  "jpg" ;

                 break ;

             case  3 :

                 $this ->imageext =  "png" ;

                 break ;

             default  :

                 $this ->imageext =  "unknown" ;

                 break ;

         }

     }

     //创建临时图片(源图片)

     private  function  gen_tmpimage_origin() {

         $ext  =  $this ->getImgext (  $this ->originimage );

         switch  ( $ext ) {

             case  1 :

                 $this ->tmp_originimage = imagecreatefromgif (  $this ->originimage );

                 $bgcolor  = imagecolorallocate (  $this ->tmp_originimage, 0, 0, 0 );

                 $bgcolortrans  = imagecolortransparent (  $this ->tmp_originimage,  $bgcolor  );

                 break ;

             case  2 :

                 $this ->tmp_originimage = imagecreatefromjpeg (  $this ->originimage );

                 break ;

             case  3 :

                 $this ->tmp_originimage = imagecreatefrompng (  $this ->originimage );

                 imagesavealpha (  $this ->tmp_originimage, true );

                 break ;

             default  :

                 $this ->tmp_originimage =  "" ;

                 break ;

         }

     }

     //创建临时图片(缩略图)

     private  function  gen_tmpimage_thumb() {

         $ext  =  $this ->getImgext (  $this ->originimage );

         switch  ( $ext ) {

             case  1 :

                 $this ->tmp_thumbimage = imagecreatetruecolor (  $this ->thumb_maxwidth,  $this ->thumb_maxheight );

                 $bgcolor  = imagecolorallocate (  $this ->tmp_thumbimage, 255, 255, 255 );

                 imagefill (  $this ->tmp_thumbimage, 0, 0,  $bgcolor  );

                 break ;

             case  2 :

                 $this ->tmp_thumbimage = imagecreatetruecolor (  $this ->thumb_maxwidth,  $this ->thumb_maxheight );

                 break ;

             case  3 :

                 $this ->tmp_thumbimage = imagecreatetruecolor (  $this ->thumb_maxwidth,  $this ->thumb_maxheight );

                 $bgcolor  = imagecolorallocate (  $this ->tmp_thumbimage, 255, 255, 255 );

                 imagefill (  $this ->tmp_thumbimage, 0, 0,  $bgcolor  );

                 imagealphablending (  $this ->tmp_thumbimage, false );

                 imagesavealpha (  $this ->tmp_thumbimage, true );

                 break ;

             default  :

                 $this ->tmp_thumbimage =  "" ;

                 break ;

         }

     }

     //创建临时图片(LOGO水印)

     private  function  gen_tmpimage_waterlogo() {

         $ext  =  $this ->getImgext (  $this ->watermark_logo );

         switch  ( $ext ) {

             case  1 :

                 $this ->tmp_waterimage = imagecreatefromgif (  $this ->watermark_logo );

                 $bgcolor  = imagecolorallocate (  $this ->tmp_waterimage, 0, 0, 0 );

                 $bgcolortrans  = imagecolortransparent (  $this ->tmp_waterimage,  $bgcolor  );

                 break ;

             case  2 :

                 $this ->tmp_waterimage = imagecreatefromjpeg (  $this ->watermark_logo );

                 break ;

             case  3 :

                 $this ->tmp_waterimage = imagecreatefrompng (  $this ->watermark_logo );

                 imagesavealpha (  $this ->tmp_waterimage, true );

                 break ;

             default  :

                 $this ->tmp_waterimage =  "" ;

                 break ;

         }

     }

     /*

      * 获取后缀名

      */

     public  function  getImgext( $filename ) {

         return  exif_imagetype (  $filename  );

     }

     //释放资源

     public  function  __destruct() {

         if  ( is_object  (  $this ->tmp_originimage ) == true) {

             imagedestroy (  $this ->tmp_originimage );

         }

         if  ( is_object  (  $this ->tmp_thumbimage ) == true) {

             imagedestroy (  $this ->tmp_thumbimage );

         }

         if  ( is_object  (  $this ->tmp_waterimage ) == true) {

             imagedestroy (  $this ->tmp_waterimage );

         }

     }

}

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn