php 將圖片儲存為不同規格的圖片

來源:互聯網
上載者:User

 1.圖片處理類.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;}elsereturn 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);

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.