php将图片保存为不同尺寸图片的图片类实例


Posted in PHP onMarch 30, 2015

本文实例讲述了php将图片保存为不同规格的图片类。分享给大家供大家参考。具体如下:

图片处理类.imagecls.php如下:

<?php
/**
  图片处理类
 */
class imagecls
{
  /**
   * 文件信息
   */
  var $file = array();
  /**
   * 保存目录
   */
  var $dir = '';
  /**
   * 错误代码
   */
  var $error_code = 0;
  /**
   * 文件上传最大KB
   */
  var $max_size = -1;
  function es_imagecls()
  {
  }
  private function checkSize($size)
  {
    return !($size > $this->max_size) || (-1 == $this->max_size);
  }
  /**
   * 处理上传文件
   * @param array $file 上传的文件
   * @param string $dir 保存的目录
   * @return bool
   */
  function init($file, $dir = 'temp')
  {
    if(!is_array($file) || empty($file) || !$this->isUploadFile($file['tmp_name']) || trim($file['name']) == '' || $file['size'] == 0)
    {
      $this->file = array();
      $this->error_code = -1;
      return false;
    }
    else
    {
      $file['size'] = intval($file['size']);
      $file['name'] = trim($file['name']);
      $file['thumb'] = '';
      $file['ext'] = $this->fileExt($file['name']);
      $file['name'] = htmlspecialchars($file['name'], ENT_QUOTES);
      $file['is_image'] = $this->isImageExt($file['ext']);
      $file['file_dir'] = $this->getTargetDir($dir);
      $file['prefix'] = md5(microtime(true)).rand(10,99);
      $file['target'] = "./public/".$file['file_dir'].'/'.$file['prefix'].'.jpg'; //相对
      $file['local_target'] = APP_ROOT_PATH."public/".$file['file_dir'].'/'.$file['prefix'].'.jpg'; //物理
      $this->file = &$file;
      $this->error_code = 0;
      return true;
    }
  }
  /**
   * 保存文件
   * @return bool
   */
  function save()
  {
    if(empty($this->file) || empty($this->file['tmp_name']))
      $this->error_code = -101;
    elseif(!$this->checkSize($this->file['size']))
      $this->error_code = -105;
    elseif(!$this->file['is_image'])
      $this->error_code = -102;
    elseif(!$this->saveFile($this->file['tmp_name'], $this->file['local_target']))
      $this->error_code = -103;
    elseif($this->file['is_image'] && (!$this->file['image_info'] = $this->getImageInfo($this->file['local_target'], true)))
    {
      $this->error_code = -104;
      @unlink($this->file['local_target']);
    }
    else
    {
      $this->error_code = 0;
      return true;
    }
    return false;
  }
  /**
   * 获取错误代码
   * @return number
   */
  function error()
  {
    return $this->error_code;
  }
  /**
   * 获取文件扩展名
   * @return string
   */
  function fileExt($file_name)
  {
    return addslashes(strtolower(substr(strrchr($file_name, '.'), 1, 10)));
  }
  /**
   * 根据扩展名判断文件是否为图像
   * @param string $ext 扩展名
   * @return bool
   */
  function isImageExt($ext)
  {
    static $img_ext = array('jpg', 'jpeg', 'png', 'bmp','gif','giff');
    return in_array($ext, $img_ext) ? 1 : 0;
  }
  /**
   * 获取图像信息
   * @param string $target 文件路径
   * @return mixed
   */
  function getImageInfo($target)
  {
    $ext = es_imagecls::fileExt($target);
    $is_image = es_imagecls::isImageExt($ext);
    if(!$is_image)
      return false;
    elseif(!is_readable($target))
      return false;
    elseif($image_info = @getimagesize($target))
    {
      list($width, $height, $type) = !empty($image_info) ? $image_info : array('', '', '');
      $size = $width * $height;
      if($is_image && !in_array($type, array(1,2,3,6,13)))
        return false;
      $image_info['type'] = strtolower(substr(image_type_to_extension($image_info[2]),1));
      return $image_info;
    }
    else
      return false;
  }
  /**
   * 获取是否充许上传文件
   * @param string $source 文件路径
   * @return bool
   */
  function isUploadFile($source)
  {
    return $source && ($source != 'none') && (is_uploaded_file($source) || is_uploaded_file(str_replace('\\\\', '\\', $source)));
  }
  /**
   * 获取保存的路径
   * @param string $dir 指定的保存目录
   * @return string
   */
  function getTargetDir($dir)
  {    
    if (!is_dir(APP_ROOT_PATH."public/".$dir)) {
       @mkdir(APP_ROOT_PATH."public/".$dir);
       @chmod(APP_ROOT_PATH."public/".$dir, 0777);
    }
    return $dir;
  }
  /**
   * 保存文件
   * @param string $source 源文件路径
   * @param string $target 目录文件路径
   * @return bool
   */
  private function saveFile($source, $target)
  {
    if(!es_imagecls::isUploadFile($source))
      $succeed = false;
    elseif(@copy($source, $target))
      $succeed = true;
    elseif(function_exists('move_uploaded_file') && @move_uploaded_file($source, $target))
      $succeed = true;
    elseif (@is_readable($source) && (@$fp_s = fopen($source, 'rb')) && (@$fp_t = fopen($target, 'wb')))
    {
      while (!feof($fp_s))
      {
        $s = @fread($fp_s, 1024 * 512);
        @fwrite($fp_t, $s);
      }
      fclose($fp_s);
      fclose($fp_t);
      $succeed = true;
    }
    if($succeed)
    {
      $this->error_code = 0;
      @chmod($target, 0644);
      @unlink($source);
    }
    else
    {
      $this->error_code = 0;
    }
    return $succeed;
  }
  public function thumb($image,$maxWidth=200,$maxHeight=50,$gen = 0,$interlace=true,$filepath = '',$is_preview = true)
  {
    $info = es_imagecls::getImageInfo($image);
    if($info !== false)
    {
      $srcWidth = $info[0];
      $srcHeight = $info[1];
      $type = $info['type'];
      $interlace = $interlace? 1:0;
      unset($info);
      if($maxWidth > 0 && $maxHeight > 0)
        $scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight); // 计算缩放比例
      elseif($maxWidth == 0)
        $scale = $maxHeight/$srcHeight;
      elseif($maxHeight == 0)
        $scale = $maxWidth/$srcWidth;
      $paths = pathinfo($image);
      $paths['filename'] = trim(strtolower($paths['basename']),".".strtolower($paths['extension']));
      $basefilename = explode("_",$paths['filename']);
      $basefilename = $basefilename[0];
      if(empty($filepath))
      {
        if($is_preview)
        $thumbname = $paths['dirname'].'/'.$basefilename.'_'.$maxWidth.'x'.$maxHeight.'.jpg';
        else
        $thumbname = $paths['dirname'].'/'.$basefilename.'o_'.$maxWidth.'x'.$maxHeight.'.jpg';
      }
      else
        $thumbname = $filepath;
      $thumburl = str_replace(APP_ROOT_PATH,'./',$thumbname);
      if($scale >= 1)
      {
        // 超过原图大小不再缩略
        $width  = $srcWidth;
        $height = $srcHeight;    
        if(!$is_preview)
        {   
          //非预览模式写入原图
          file_put_contents($thumbname,file_get_contents($image));  //用原图写入      
          return array('url'=>$thumburl,'path'=>$thumbname);
        }
      }
      else
      {
        // 缩略图尺寸
        $width = (int)($srcWidth*$scale);
        $height = (int)($srcHeight*$scale);
      }   
      if($gen == 1)
      {
        $width = $maxWidth;
        $height = $maxHeight;
      }
      // 载入原图
      $createFun = 'imagecreatefrom'.($type=='jpg'?'jpeg':$type);
      if(!function_exists($createFun))
        $createFun = 'imagecreatefromjpeg';
      $srcImg = $createFun($image);
      //创建缩略图
      if($type!='gif' && function_exists('imagecreatetruecolor'))
        $thumbImg = imagecreatetruecolor($width, $height);
      else
        $thumbImg = imagecreate($width, $height);
      $x = 0;
      $y = 0;
      if($gen == 1 && $maxWidth > 0 && $maxHeight > 0)
      {
        $resize_ratio = $maxWidth/$maxHeight;
        $src_ratio = $srcWidth/$srcHeight;
        if($src_ratio >= $resize_ratio)
        {
          $x = ($srcWidth - ($resize_ratio * $srcHeight)) / 2;
          $width = ($height * $srcWidth) / $srcHeight;
        }
        else
        {
          $y = ($srcHeight - ( (1 / $resize_ratio) * $srcWidth)) / 2;
          $height = ($width * $srcHeight) / $srcWidth;
        }
      }
      // 复制图片
      if(function_exists("imagecopyresampled"))
        imagecopyresampled($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height, $srcWidth,$srcHeight);
      else
        imagecopyresized($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height, $srcWidth,$srcHeight);
      if('gif'==$type || 'png'==$type) {
        $background_color = imagecolorallocate($thumbImg, 0,255,0); // 指派一个绿色
        imagecolortransparent($thumbImg,$background_color); // 设置为透明色,若注释掉该行则输出绿色的图
      }
      // 对jpeg图形设置隔行扫描
      if('jpg'==$type || 'jpeg'==$type)
        imageinterlace($thumbImg,$interlace);
      // 生成图片
      imagejpeg($thumbImg,$thumbname,100);
      imagedestroy($thumbImg);
      imagedestroy($srcImg);
      return array('url'=>$thumburl,'path'=>$thumbname);
     }
     return false;
  }
  public function make_thumb($srcImg,$srcWidth,$srcHeight,$type,$maxWidth=200,$maxHeight=50,$gen = 0)
  {
      $interlace = $interlace? 1:0;
      if($maxWidth > 0 && $maxHeight > 0)
        $scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight); // 计算缩放比例
      elseif($maxWidth == 0)
        $scale = $maxHeight/$srcHeight;
      elseif($maxHeight == 0)
        $scale = $maxWidth/$srcWidth;
      if($scale >= 1)
      {
        // 超过原图大小不再缩略
        $width  = $srcWidth;
        $height = $srcHeight;
      }
      else
      {
        // 缩略图尺寸
        $width = (int)($srcWidth*$scale);
        $height = (int)($srcHeight*$scale);
      }
      if($gen == 1)
      {
        $width = $maxWidth;
        $height = $maxHeight;
      }
      //创建缩略图
      if($type!='gif' && function_exists('imagecreatetruecolor'))
        $thumbImg = imagecreatetruecolor($width, $height);
      else
        $thumbImg = imagecreatetruecolor($width, $height);
      $x = 0;
      $y = 0;
      if($gen == 1 && $maxWidth > 0 && $maxHeight > 0)
      {
        $resize_ratio = $maxWidth/$maxHeight;
        $src_ratio = $srcWidth/$srcHeight;
        if($src_ratio >= $resize_ratio)
        {
          $x = ($srcWidth - ($resize_ratio * $srcHeight)) / 2;
          $width = ($height * $srcWidth) / $srcHeight;
        }
        else
        {
          $y = ($srcHeight - ( (1 / $resize_ratio) * $srcWidth)) / 2;
          $height = ($width * $srcHeight) / $srcWidth;
        }
      }
      // 复制图片
      if(function_exists("imagecopyresampled"))
        imagecopyresampled($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height, $srcWidth,$srcHeight);
      else
        imagecopyresized($thumbImg, $srcImg, 0, 0, $x, $y, $width, $height, $srcWidth,$srcHeight);
      if('gif'==$type || 'png'==$type) {
        $background_color = imagecolorallocate($thumbImg, 255,255,255); // 指派一个绿色
        imagecolortransparent($thumbImg,$background_color); // 设置为透明色,若注释掉该行则输出绿色的图
      }
      // 对jpeg图形设置隔行扫描
      if('jpg'==$type || 'jpeg'==$type)
        imageinterlace($thumbImg,$interlace);
      return $thumbImg;
  }
  public function water($source,$water,$alpha=80,$position="0")
  {
    //检查文件是否存在
    if(!file_exists($source)||!file_exists($water))
      return false;
    //图片信息
    $sInfo = es_imagecls::getImageInfo($source);
    $wInfo = es_imagecls::getImageInfo($water);
    //如果图片小于水印图片,不生成图片
    if($sInfo["0"] < $wInfo["0"] || $sInfo['1'] < $wInfo['1'])
      return false;
    if(is_animated_gif($source))
    {
      require_once APP_ROOT_PATH."system/utils/gif_encoder.php";
      require_once APP_ROOT_PATH."system/utils/gif_reader.php";
      $gif = new GIFReader();
      $gif->load($source);
      foreach($gif->IMGS['frames'] as $k=>$img)
      {
        $im = imagecreatefromstring($gif->getgif($k));   
        //为im加水印
        $sImage=$im;    
        $wCreateFun="imagecreatefrom".$wInfo['type'];
        if(!function_exists($wCreateFun))
          $wCreateFun = 'imagecreatefromjpeg';
        $wImage=$wCreateFun($water);
        //设定图像的混色模式
        imagealphablending($wImage, true);   
        switch (intval($position))
        {
          case 0: break;
          //左上
          case 1:
            $posY=0;
            $posX=0;
            //生成混合图像
            imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
            break;
          //右上
          case 2:
            $posY=0;
            $posX=$sInfo[0]-$wInfo[0];
            //生成混合图像
            imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
            break;
          //左下
          case 3:
            $posY=$sInfo[1]-$wInfo[1];
            $posX=0;
            //生成混合图像
            imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
            break;
          //右下
          case 4:
            $posY=$sInfo[1]-$wInfo[1];
            $posX=$sInfo[0]-$wInfo[0];
            //生成混合图像
            imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
            break;
          //居中
          case 5:
            $posY=$sInfo[1]/2-$wInfo[1]/2;
            $posX=$sInfo[0]/2-$wInfo[0]/2;
            //生成混合图像
            imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
            break;
        }
        //end im加水印
        ob_start();
        imagegif($sImage);
        $content = ob_get_contents();
        ob_end_clean();
        $frames [ ] = $content;
        $framed [ ] = $img['frameDelay'];
      }
      $gif_maker = new GIFEncoder (
          $frames,
          $framed,
          0,
          2,
          0, 0, 0,
          "bin"  //bin为二进制  url为地址
       );
      $image_rs = $gif_maker->GetAnimation ( );
      //如果没有给出保存文件名,默认为原图像名
      @unlink($source);
      //保存图像
      file_put_contents($source,$image_rs);
      return true;
    } 
    //建立图像
    $sCreateFun="imagecreatefrom".$sInfo['type'];
    if(!function_exists($sCreateFun))
      $sCreateFun = 'imagecreatefromjpeg';
    $sImage=$sCreateFun($source);
    $wCreateFun="imagecreatefrom".$wInfo['type'];
    if(!function_exists($wCreateFun))
      $wCreateFun = 'imagecreatefromjpeg';
    $wImage=$wCreateFun($water);
    //设定图像的混色模式
    imagealphablending($wImage, true);
    switch (intval($position))
    {
      case 0: break;
      //左上
      case 1:
        $posY=0;
        $posX=0;
        //生成混合图像
        imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
        break;
      //右上
      case 2:
        $posY=0;
        $posX=$sInfo[0]-$wInfo[0];
        //生成混合图像
        imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
        break;
      //左下
      case 3:
        $posY=$sInfo[1]-$wInfo[1];
        $posX=0;
        //生成混合图像
        imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
        break;
      //右下
      case 4:
        $posY=$sInfo[1]-$wInfo[1];
        $posX=$sInfo[0]-$wInfo[0];
        //生成混合图像
        imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
        break;
      //居中
      case 5:
        $posY=$sInfo[1]/2-$wInfo[1]/2;
        $posX=$sInfo[0]/2-$wInfo[0]/2;
        //生成混合图像
        imagecopymerge($sImage, $wImage, $posX, $posY, 0, 0, $wInfo[0],$wInfo[1],$alpha);
        break;
    }
    //如果没有给出保存文件名,默认为原图像名
    @unlink($source);
    //保存图像
    imagejpeg($sImage,$source,100);
    imagedestroy($sImage);
  }
}
if(!function_exists('image_type_to_extension'))
{
  function image_type_to_extension($imagetype)
  {
    if(empty($imagetype))
      return false;
    switch($imagetype)
    {
      case IMAGETYPE_GIF  : return '.gif';
      case IMAGETYPE_JPEG  : return '.jpeg';
      case IMAGETYPE_PNG  : return '.png';
      case IMAGETYPE_SWF  : return '.swf';
      case IMAGETYPE_PSD  : return '.psd';
      case IMAGETYPE_BMP  : return '.bmp';
      case IMAGETYPE_TIFF_II : return '.tiff';
      case IMAGETYPE_TIFF_MM : return '.tiff';
      case IMAGETYPE_JPC  : return '.jpc';
      case IMAGETYPE_JP2  : return '.jp2';
      case IMAGETYPE_JPX  : return '.jpf';
      case IMAGETYPE_JB2  : return '.jb2';
      case IMAGETYPE_SWC  : return '.swc';
      case IMAGETYPE_IFF  : return '.aiff';
      case IMAGETYPE_WBMP  : return '.wbmp';
      case IMAGETYPE_XBM  : return '.xbm';
      default        : return false;
    }
  }
}
?>

2.get_spec_img()调用图片类,然后再用下面的方法保存不同规格的图片并返回图片连接

//获取相应规格的图片地址 
//gen=0:保持比例缩放,不剪裁,如高为0,则保证宽度按比例缩放 gen=1:保证长宽,剪裁 
function get_spec_image($img_path,$width=0,$height=0,$gen=0,$is_preview=true) 
{ 
  if($width==0) 
    $new_path = $img_path; 
  else 
  { 
    $img_name = substr($img_path,0,-4); 
    $img_ext = substr($img_path,-3);   
    if($is_preview) 
    $new_path = $img_name."_".$width."x".$height.".jpg";   
    else 
    $new_path = $img_name."o_".$width."x".$height.".jpg";  
    if(!file_exists($new_path)) 
    { 
      require_once "imagecls.php"; 
      $imagec = new imagecls(); 
      $thumb = $imagec->thumb($img_path,$width,$height,$gen,true,"",$is_preview); 
      if(app_conf("PUBLIC_DOMAIN_ROOT")!='') 
      { 
        $paths = pathinfo($new_path); 
        $path = str_replace("./","",$paths['dirname']); 
        $filename = $paths['basename']; 
        $pathwithoupublic = str_replace("public/","",$path); 
            $file_data = @file_get_contents($path.$file); 
            $img = @imagecreatefromstring($file_data); 
            if($img!==false) 
            { 
              $save_path = "public/".$path; 
              if(!is_dir($save_path)) 
              { 
                @mk_dir($save_path);       
              } 
              @file_put_contents($save_path.$name,$file_data); 
            } 
      } 
    } 
  } 
  return $new_path; 
}

3.使用方法:

//im:将店铺图片保存为3种规格:小图:48x48,中图120x120,大图200x200
$small_url=get_spec_image($data['image'],48,48,0);
$<span id="result_box" class="short_text" lang="en"><span>middle_url</span></span>=get_spec_image($data['image'],120,120,0);
$big_url=get_spec_image($data['image'],200,200,0);

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
php中autoload的用法总结
Nov 08 PHP
php+mysql数据库实现无限分类的方法
Dec 12 PHP
Smarty分页实现方法完整实例
May 11 PHP
php 读取输出其他文件的实现方法
Jul 26 PHP
php生成与读取excel文件
Oct 14 PHP
PHP实现的自定义图像居中裁剪函数示例【测试可用】
Aug 11 PHP
PHP实现生成模糊图片的方法示例
Dec 21 PHP
Laravel使用消息队列需要注意的一些问题
Dec 13 PHP
php实现微信发红包功能
Jul 13 PHP
php的命名空间与自动加载实现方法
Aug 25 PHP
PHP实现时间日期友好显示实现代码
Sep 08 PHP
PHP实现简单的协程任务调度demo示例
Feb 01 PHP
Linux系统下php获得系统分区信息的方法
Mar 30 #PHP
PHP连接操作access数据库实例
Mar 30 #PHP
php中使用sftp教程
Mar 30 #PHP
php计算一个文件大小的方法
Mar 30 #PHP
smarty模板引擎之内建函数用法
Mar 30 #PHP
PHP中实现Bloom Filter算法
Mar 30 #PHP
smarty模板引擎之配置文件数据和保留数据
Mar 30 #PHP
You might like
PHPUnit PHP测试框架安装方法
2011/03/23 PHP
php图像处理函数大全(推荐收藏)
2013/07/11 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
php文件上传后端处理小技巧
2016/05/22 PHP
PHP INT类型在内存中占字节详解
2019/07/20 PHP
Laravel 对某一列进行筛选然后求和sum()的例子
2019/10/10 PHP
用javascript实现自定义标签
2007/05/08 Javascript
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
精心挑选的15个jQuery下拉菜单制作教程
2012/06/15 Javascript
Jquery 切换不同图片示例代码
2013/12/05 Javascript
让jQuery Mobile不显示讨厌loading界面的方法
2014/02/19 Javascript
javascript中的括号()用法小结
2014/04/14 Javascript
跟我学Nodejs(一)--- Node.js简介及安装开发环境
2014/05/20 NodeJs
jQuery针对各类元素操作基础教程
2014/08/29 Javascript
node.js中使用socket.io的方法
2014/12/15 Javascript
网页中右键功能的实现方法之contextMenu的使用
2017/02/20 Javascript
jQuery插件HighCharts实现的2D条状图效果示例【附demo源码下载】
2017/03/15 Javascript
js Dom实现换肤效果
2017/10/21 Javascript
vue.js 获取select中的value实例
2018/03/01 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
详解vue中v-model和v-bind绑定数据的异同
2020/08/10 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
python和shell变量互相传递的几种方法
2013/11/20 Python
python logging 日志轮转文件不删除问题的解决方法
2016/08/02 Python
Pycharm学习教程(3) 代码运行调试
2017/05/03 Python
Python中with及contextlib的用法详解
2017/06/08 Python
Python使用Phantomjs截屏网页的方法
2018/05/17 Python
Python SELENIUM上传文件或图片实现过程
2019/10/28 Python
Pycharm和Idea支持的vim插件的方法
2020/02/21 Python
如何实现一个python函数装饰器(Decorator)
2020/10/12 Python
CSS3模拟IOS滑动开关效果
2016/09/28 HTML / CSS
红色连衣裙精品店:Red Dress Boutique
2018/08/11 全球购物
2015重阳节座谈会主持词
2015/07/30 职场文书
vue-cropper组件实现图片切割上传
2021/05/27 Vue.js
python数据处理之Pandas类型转换
2022/04/28 Python
Java实现扫雷游戏详细代码讲解
2022/05/25 Java/Android