php实现常见图片格式的水印和缩略图制作(面向对象)


Posted in PHP onJune 15, 2016

本文实例为大家分享了php水印和缩略图制作代码,使用面向对象的方法来实现常见图片格式jpg,png,gif的水印和缩略图的制作,供大家参考,具体内容如下

<?php
header('Content-Type:text/html;charset=utf-8');
/* 
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
//给图片添加水印
Class Water{
 //开启水印
 private $watermark_on = '1';
  
 public $water_img;
  
 //水印位置
 public $pos = 1; 
  
 //压缩比
 public $pct = 80;
  
 //透明度
 public $quality = 80;
  
 public $text = '乐趣网zlblog.sinaapp.com';
  
 public $size = 12;
  
 public $color = '#000000';
  
 public $font = 'font.ttf';
  
 //thumb的制作
 //默认缩略图功能开启
 private $thumb_on = 1;
 //生成缩略图的方式
 public $thumb_type = 1;
 //生成缩略图的宽度
 public $thumb_width;
 //生成缩略图的高度
 public $thumb_height;
 //生成缩略图的后缀名
 public $thumb_fix = '_dq';
 
 //缩略图函数处理
 public function thumb( $img,$outfile='',$t_type='',$t_w='',$t_h='' ){
  //验证图片是否符合要求
  if(!$this->check($img) || !$this->thumb_on) return FALSE;
   
  //定义缩略图的初始值
  $t_type = $t_type ? $t_type : $this->thumb_type;
  $t_w = $t_w ? $t_w : $this->thumb_width;
  $t_h = $t_h ? $t_h : $this->thumb_height;
   
  //获取到原图的信息
  $img_info = getimagesize($img);
  $img_w = $img_info[0];
  $img_h = $img_info[1];
  //取得图像类型的文件后缀
  $img_type = image_type_to_extension($img_info[2]);
  //获取到相关尺寸
  $thumb_size = $this->thumb_size($img_w,$img_h,$t_w,$t_h,$t_type);
  //确定原始图像类型
  //利用自定义函数来实现图片类型的确定
  $func = "imagecreatefrom".substr($img_type, 1);
  $res_img = $func($img);
   
  //缩略图资源   编辑图片资源moon
  if( $img_type == '.gif' || $img_type == '.png' ){
   $res_thumb = imagecreate($thumb_size[0], $thumb_size[1]);
   $color = imagecolorallocate($res_thumb, 255, 0, 0);
  }else{
   $res_thumb = imagecreatetruecolor($thumb_size[0], $thumb_size[1]);
  }
   
  //制作缩略图
  if(function_exists( "imagecopyresampled" ) ){
   imagecopyresampled($res_thumb, $res_img, 0, 0, 0, 0, $thumb_size[0],$thumb_size[1],$thumb_size[2],$thumb_size[3]);
  }else{
   imagecopyresized($res_thumb, $res_img, 0, 0, 0, 0, $thumb_size[0],$thumb_size[1],$thumb_size[2],$thumb_size[3]);
  }
  //处理透明色
  if( $img_type =='.gif' || $img_type == '.png' ){
   imagecolortransparent($res_thumb,$color);
  }
   
  //配置输出文件名
  $outfile = $outfile ? $outfile : $outfile.substr($img,0,strripos($img,'.')).$this->thumb_fix.$img_type;
   
  //文件的保存输出
  $func = "image".substr($img_type, 1);
  $func($res_thumb,$outfile);
  if(isset($res_thumb)) imagedestroy ($res_thumb);
  if(isset($res_img)) imagedestroy ($res_img);
  return $outfile;
 } 
 
 public function watermark( $img,$pos='',$out_img='',$water_img='',$text='' ){
  if(!$this->check($img) || !$this->watermark_on) return false;
   
  $water_img = $water_img ? $water_img : $this->water_img;
  //水印的开启状态
  $waterimg_on = $this->check($water_img) ? 1 : 0;
  //判断是否在原图上操作
  $out_img = $out_img ? $out_img : $img;
  //判断水印的位置
  $pos = $pos ? $pos : $this->pos;
  //水印文字
  $text = $text ? $text : $this->text;
   
   
  $img_info = getimagesize($img);
  $img_w = $img_info[0];
  $img_h = $img_info[1];
  //判断水印图片的类型
   
   
  if( $waterimg_on ){
   $w_info = getimagesize($water_img);
   $w_w = $w_info[0];
   $w_h = $w_info[1];
   if ( $img_w < $w_w || $img_h < $w_h ) return false;
   switch ( $w_info[2] ){
    case 1:
     $w_img = imagecreatefromgif($water_img);
     break;
    case 2:
     $w_img = imagecreatefromjpeg($water_img);
     break;
    case 3:
     $w_img = imagecreatefrompng($water_img);
     break;
   }
  }else{
   if( empty($text) || strlen($this->color)!=7 ) return FALSE;
   $text_info = imagettfbbox($this->size, 0, $this->font, $text);
   $w_w = $text_info[2] - $text_info[6];
   $w_h = $text_info[3] - $text_info[7];
  }
   
  //建立原图资源
   
  switch ( $img_info[2] ){
   case 1:
    $res_img = imagecreatefromgif($img);
    break;
   case 2:
    $res_img = imagecreatefromjpeg($img);
    break;
   case 3:
    $res_img = imagecreatefrompng($img);
    break;
  }
  //确定水印的位置
  switch ( $pos ){
   case 1:
    $x = $y =25;
    break;
   case 2:
    $x = ($img_w - $w_w)/2; 
    $y = 25;
    break;
   case 3:
    $x = $img_w - $w_w;
    $y = 25;
    break;
   case 4:
    $x = 25;
    $y = ($img_h - $w_h)/2;
    break;
   case 5:
    $x = ($img_w - $w_w)/2; 
    $y = ($img_h - $w_h)/2;
    break;
   case 6:
    $x = $img_w - $w_w;
    $y = ($img_h - $w_h)/2;
    break;
   case 7:
    $x = 25;
    $y = $img_h - $w_h;
    break;
   case 8:
    $x = ($img_w - $w_w)/2;
    $y = $img_h - $w_h;
    break;
   case 9:
    $x = $img_w - $w_w;
    $y = $img_h - $w_h;
    break;
   default :
    $x = mt_rand(25, $img_w - $w_w);
    $y = mt_rand(25, $img_h - $w_h);
  }
   
  //写入图片资源
  if( $waterimg_on ){
   imagecopymerge($res_img, $w_img, $x, $y, 0, 0, $w_w, $w_h, $this->pct); 
 }else{
  $r = hexdec(substr($this->color, 1,2));
  $g = hexdec(substr($this->color, 3,2));
  $b = hexdec(substr($this->color, 5,2));
  $color = imagecolorallocate($res_img, $r, $g, $b);
  imagettftext($res_img, $this->size, 0, $x, $y, $color, $this->font, $text); 
 }
  
 //生成图片类型
 switch ( $img_info[2] ){
  case 1:
   imagecreatefromgif($res_img,$out_img);
   break;
  case 2:
   //imagecreatefromjpeg($res_img,$out_img);
   imagejpeg($res_img,$out_img);
   break;
  case 3:
   imagepng($res_img,$out_img);
   break;
 }
 if(isset($res_img)) imagedestroy ($res_img);
 if(isset($w_img)) imagedestroy($w_img);
 return TRUE;
} 
 //验证图片是否存在
  private function check($img){
   $type = array('.jpg','.jpeg','.png','.gif');
   $img_type = strtolower(strrchr($img, '.'));
   return extension_loaded('gd') && file_exists($img) && in_array($img_type, $type);
  } 
   
  //获取缩略图的相关比例
  //获取到图片的处理类型
  private function thumb_size( $img_w,$img_h,$t_w,$t_h,$t_type){
   //定义缩略图尺寸
   $w = $t_w;
   $h = $t_h;
    
   //定义图片的原始尺寸
   $cut_w = $img_w;
   $cut_h = $img_h;
    
   //当要目标图像小于缩略图的尺寸时;
   if( $img_w <= $t_w && $img_h < $t_h ){
    $w = $img_w;
    $h = $img_h;
   }else{
    if( !empty($t_type) && $t_type>0 ){
     switch ( $t_type ){
      //当宽度固定时
      case 1:
       $h = $t_w/$img_w*$img_h;
       break;
      //高度固定时
      case 2:
       $w = $t_h/$img_h*$img_w;
       break;
      //宽度固定,高度裁切
      case 3:
       $cut_h = $img_w/$t_w*$t_h;
       break;
      //高度固定,宽度裁切
      case 4:
       $cut_w = $img_h/$t_h*$t_w;
       break;
      //等比例缩放
      default :
       if( ($img_w/$t_w) > ($img_h/$t_h) ){
        $h = $t_w/$img_w*$t_h;
       }elseif( ($img_w/$t_w) < ($img_h/$t_h) ){
        $w = $t_h/$img_h*$t_w;
       }else{
        $w = $t_w;
        $h = $t_h;
       }
     }
    }
     
     
   }
   $arr[0] = $t_w;
   $arr[1] = $t_h;
   $arr[2] = $cut_w;
   $arr[3] = $cut_h;
   return $arr;
 }
}

以上就是本文的全部内容,希望对大家学习PHP程序设计有所帮助。

PHP 相关文章推荐
excellent!――ASCII Art(由目标图象生成ascii)
Feb 20 PHP
php调用mysql数据 dbclass类
May 07 PHP
phpmyadmin打开很慢的解决方法
Apr 21 PHP
让CodeIgniter的ellipsize()支持中文截断的方法
Jun 12 PHP
PHP实现货币换算的方法
Nov 29 PHP
详解PHP中的mb_detect_encoding函数使用方法
Aug 18 PHP
PHP封装的数据库保存session功能类
Jul 11 PHP
php die()与exit()的区别实例详解
Dec 03 PHP
Laravel实现表单提交
May 07 PHP
PHP基于PDO扩展操作mysql数据库示例
Dec 24 PHP
TP5框架请求响应参数实例分析
Oct 17 PHP
Laravel框架集合用法实例浅析
May 14 PHP
使用JavaScript创建新样式表和新样式规则
Jun 14 #PHP
PHP list() 将数组中的值赋给变量的简单实例
Jun 13 #PHP
PHP处理二进制数据的实现方法
Jun 13 #PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
Jun 13 #PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
Jun 13 #PHP
PHP array_key_exists检查键名或索引是否存在于数组中的实现方法
Jun 13 #PHP
PHP简单获取多个checkbox值的方法
Jun 13 #PHP
You might like
phpexcel导入excel数据使用方法实例
2013/12/24 PHP
用php守护另一个php进程的例子
2015/02/13 PHP
php similar_text()函数的定义和用法
2016/05/12 PHP
jQuery 隔行换色 支持键盘上下键,按Enter选定值
2009/08/02 Javascript
经典海量jQuery插件 大家可以收藏一下
2010/02/07 Javascript
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
基于jquery中children()与find()的区别介绍
2013/04/26 Javascript
node.js中的fs.fchownSync方法使用说明
2014/12/16 Javascript
javasript实现密码的隐藏与显示
2015/05/08 Javascript
jQuery+CSS实现简单切换菜单示例
2016/07/27 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
2016/12/07 Javascript
Vue2 使用 Echarts 创建图表实例代码
2017/05/18 Javascript
详解JavaScript 的变量
2019/03/08 Javascript
js实现微信聊天界面
2020/08/09 Javascript
python实现网站的模拟登录
2016/01/04 Python
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
Python中的单行、多行、中文注释方法
2018/07/19 Python
python3利用Socket实现通信的方法示例
2019/05/06 Python
Pytorch中accuracy和loss的计算知识点总结
2019/09/10 Python
Pytorch对Himmelblau函数的优化详解
2020/02/29 Python
python可迭代对象去重实例
2020/05/15 Python
美国高端寝具品牌:Coyuchi
2017/02/08 全球购物
美国半成品食材配送服务商:Home Chef
2018/01/25 全球购物
乌克兰第一的珠宝网上商店:Gold.ua
2019/11/29 全球购物
涉外文秘个人求职的自我评价
2013/10/07 职场文书
毕业生在校学习的自我评价分享
2013/10/08 职场文书
幼儿园校车司机的岗位职责
2014/01/30 职场文书
大学生在校学习的自我评价
2014/02/18 职场文书
安全协议书范本
2014/04/21 职场文书
新农村建设标语
2014/06/24 职场文书
幼儿教师辞职信
2015/02/27 职场文书
2016年小学优秀班主任事迹材料
2016/02/29 职场文书
幼儿园大班教师评语
2019/06/21 职场文书
导游词之湖州-太湖
2019/10/11 职场文书
Python max函数中key的用法及原理解析
2021/06/26 Python
Python Pandas解析读写 CSV 文件
2022/04/11 Python