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中上传大体积文件时需要的设置
Oct 09 PHP
PHP图片等比缩放类SimpleImage使用方法和使用实例分享
Apr 10 PHP
PHP正则替换函数preg_replace和preg_replace_callback使用总结
Sep 22 PHP
php数组排序usort、uksort与sort函数用法
Nov 17 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
Nov 29 PHP
CI框架源码解读之URI.php中_fetch_uri_string()函数用法分析
May 18 PHP
总结PHP中DateTime的常用方法
Aug 11 PHP
PHP 500报错的快速解决方法
Dec 14 PHP
深入解析PHP中SESSION反序列化机制
Mar 01 PHP
php 读写json文件及修改json的方法
Mar 07 PHP
thinkPHP5框架自定义验证器实现方法分析
Jun 11 PHP
PHP扩展安装方法步骤解析
Nov 24 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
php将access数据库转换到mysql数据库的方法
2014/12/24 PHP
Smarty模板变量调节器用法分析
2016/05/23 PHP
Smarty实现页面静态化(生成HTML)的方法
2016/05/23 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
thinkphp 验证码 的使用小结
2017/05/07 PHP
js 方法实现返回多个数据的代码
2009/04/30 Javascript
jQuery+slidereveal实现的面板滑动侧边展出效果
2015/03/14 Javascript
JavaScript中toString()方法的使用详解
2015/06/05 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
原生JS实现网络彩票投注效果
2016/09/25 Javascript
jQuery与JavaScript节点创建方法的对比
2016/11/18 Javascript
基于jQuery实现Accordion手风琴自定义插件
2020/10/13 Javascript
微信小程序 picker 组件详解及简单实例
2017/01/10 Javascript
深入理解Angular.JS中的Scope继承
2017/06/04 Javascript
Vue-cli配置打包文件本地使用的教程图解
2018/08/02 Javascript
JS 数组随机洗牌的实例代码
2018/09/12 Javascript
angularjs的单选框+ng-repeat的实现方法
2018/09/12 Javascript
js canvas实现星空连线背景特效
2019/11/01 Javascript
Vue SPA 初次进入加载动画实现代码
2019/11/14 Javascript
jQuery HTML获取内容和属性操作实例分析
2020/05/20 jQuery
深入理解Python变量与常量
2016/06/02 Python
DataFrame中的object转换成float的方法
2018/04/10 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
Python线上环境使用日志的及配置文件
2019/07/28 Python
Python配置文件处理的方法教程
2019/08/29 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
python 高阶函数简单介绍
2021/02/19 Python
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
Abbott Lyon官网:女士手表、珠宝及配件
2020/12/26 全球购物
酒店服务与管理毕业生求职信
2013/11/02 职场文书
经济管理毕业生求职信
2014/03/15 职场文书
微笑服务标语
2014/06/24 职场文书
开展创先争优活动总结
2014/08/28 职场文书
店长岗位职责
2015/02/11 职场文书
酒店人事主管岗位职责
2015/04/11 职场文书
话题作文之成长
2019/12/09 职场文书