php将图片保存为不同尺寸图片的图片类实例
author:一佰互联 2019-04-28   click:179

本文实例讲述了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程序设计有所帮助。