侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

php  /  管理员 发布于 7年前   169

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

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

 $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);$middle_url=get_spec_image($data['image'],120,120,0);$big_url=get_spec_image($data['image'],200,200,0);

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

您可能感兴趣的文章:

  • php实现高效获取图片尺寸的方法
  • PHP图片自动裁切应付不同尺寸的显示
  • php中使用getimagesize获取图片、flash等文件的尺寸信息实例
  • php调整gif动画图片尺寸示例代码分享
  • PHP中改变图片的尺寸大小的代码
  • php实现按指定大小等比缩放生成上传图片缩略图的方法
  • php实现上传图片生成缩略图示例
  • php修改上传图片尺寸的方法


  • 上一条:
    php实现数组按指定KEY排序的方法
    下一条:
    PHP连接操作access数据库实例
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客