| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
6e72
10年前发布

一个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);