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