程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php 將圖片保存為不同規格的圖片

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

編輯:關於PHP編程

     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;
    		}
    		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);

     

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved