PHP缩略图类

  1 class ThumbImages{

  2     /**

  3      * 生成缩略图

  4      * prorate 按比例缩放

  5      * distortion 扭曲型缩图

  6      * cut 最小裁剪后的缩图

  7      * backFill 背景填充图

  8      * clssname ThumbImages

  9      * createtime:2014-1-14下午04:44:28

 10      * author:lhm

 11      * for example

 12      * include 'ThumbImages.class.php'

 13      * $th=new ThumbImages(array('imagePre'=>'',

 14      *                           'imagePath'=>'./uploads/thumb/',

 15      *                           'echoType'=>'file'));

 16      * $th->setThumb($srcImage, 384, 300, 'prorate');

 17      */

 18     private $imagepre;               //缩略图名称前缀

 19     private $imagepath;             //缩略图存放路径

 20     private $srcImage='';          //源图路径

 21     private $newImageName;        //缩略图名称

 22     private $imageType;           //图片类型

 23     private $echotype;          //输出图片类型,link--直接输出到浏览器;file--保存为文件

 24     private $im='';            //临时变量

 25     private $originName='';   //源图名称

 26     private $srcW='';        //源图宽

 27     private $srcH='';       //源图高

 28     private $errorNum=0;   //错误号

 29     private $errorMess='';//用来提供错误报告

 30     

 31  

 32     public function __construct($options = array()){

 33         $allowOption = array('imagepre','imagepath','echotype');

 34         foreach($options as $key=>$val){

 35             $key = strtolower($key);

 36             //查看用户参数中数组的下标是否和成员属性名相同

 37             //if(!in_array($key,get_class_vars(get_class($this)))){

 38             if(!in_array($key, $allowOption)){

 39                 $this->errorNum = -3;

 40                 $this->errorMess = $this->getError();

 41                 continue 1;

 42             }

 43             $this->$key = $val;

 44         }

 45     }

 46     /**

 47      * 

 48      * 判断源文件路径、缩略图存放路径是否正确

 49      * 判断GD库是否支持缩略图格式

 50      * 初始化图片高宽、缩略图存放路径、缩略图生成方式

 51      * @param string $srcImage

 52      * @param int $toW

 53      * @param int $toH

 54      * @param string $method

 55      * @param string $echotype

 56      */

 57     public function setThumb($srcImage = '', $toW = 0, $toH = 0, $method = 'distortion'){

 58         $this->srcImage = $srcImage;

 59         $imageName = explode('/', $this->srcImage);

 60         $this->originName = $imageName[2];

 61            //检查源文件是否存在

 62         if(empty($srcImage) || filetype($srcImage) != 'file'){

 63             $this->errorNum = 4;

 64             $this->errorMess = $this->getError();

 65             return false;

 66         }

 67         //检查文件上传路径

 68         if ($this->echotype == 'file'){

 69             if(!$this->checkImagePath()){

 70                 $this->errorMess = $this->getError();

 71                 return false;

 72             }

 73         }

 74         $info = '';

 75         $data = getimagesize($this->srcImage, $info);//获取图像大小

 76         $this->srcW = $data[0];//

 77         $this->srcH = $data[1];// 78          //检查GD库

 79         if(!$this->checkGD($data[2])){

 80             $this->errorMess = $this->getError();

 81             return false;

 82         }

 83         $this->setImageName();//设置缩略图名称

 84         $toFile = $this->imagepath.$this->newImageName;//缩略图存放路径

 85         $return = $this->createImageMethod($method, $toFile, $toW, $toH);

 86           return $return;

 87     }

 88     /**

 89      * 

 90      * 初始化缩略图生成方式

 91      * prorate 按比例缩放

 92      * distortion 扭曲型缩图

 93      * cut 最小裁剪后的缩图

 94      * backFill 背景填充图

 95      * @param string $method

 96      * @param string $toFile

 97      * @param int $toW

 98      * @param int $toH

 99      */

100     private function createImageMethod($method, $toFile, $toW, $toH){

101         switch ($method){

102               case 'prorate':

103                   $return = $this->prorate($toFile, $toW, $toH);

104                   break;

105               case 'cut':

106                   $return = $this->cut($toFile, $toW, $toH);

107                   break;

108               case 'backFill':

109                   $return = $this->backFill($toFile, $toW, $toH);

110                   break;

111               default:

112                   $return = $this->distortion($toFile, $toW, $toH);

113            }

114            return $return;

115     }

116     //生成扭曲型缩图

117     function distortion($toFile='', $toW=0, $toH=0){

118         $cImg=$this->creatImage($this->im, $toW, $toH, 0, 0, 0, 0, $this->srcW, $this->srcH);

119         return $this->echoImage($cImg, $toFile);

120         imagedestroy($cImg);

121     }

122     

123     //生成按比例缩放的缩图

124     function prorate($toFile, $toW, $toH){

125         $toWH = $toW / $toH;

126         $srcWH = $this->srcW / $this->srcH;

127         if($toWH <= $srcWH){

128             $ftoW = $toW;

129             $ftoH = $ftoW * ($this->srcH / $this->srcW);

130         }else{

131               $ftoH = $toH;

132               $ftoW = $ftoH * ($this->srcW / $this->srcH);

133         }

134         if($this->srcW > $toW || $this->srcH > $toH){

135             $cImg = $this->creatImage($this->im, $ftoW, $ftoH, 0, 0, 0, 0, $this->srcW, $this->srcH);

136             return $this->echoImage($cImg, $toFile);

137             imagedestroy($cImg);

138         }else{

139             $cImg = $this->creatImage($this->im, $this->srcW, $this->srcH, 0, 0, 0, 0, $this->srcW, $this->srcH);

140             return $this->echoImage($cImg, $toFile);

141             imagedestroy($cImg);

142         }

143     }

144     

145     //生成最小裁剪后的缩图

146     private function cut($toFile, $toW, $toH){

147           $toWH = $toW/$toH;

148           $srcWH = $this->srcW / $this->srcH;

149           if($toWH <= $srcWH){

150                $ctoH = $toH;

151                $ctoW = $ctoH * ($this->srcW / $this->srcH);

152           }else{

153               $ctoW = $toW;

154               $ctoH = $ctoW * ($this->srcH / $this->srcW);

155           } 

156         $allImg = $this->creatImage($this->im, $ctoW, $ctoH, 0, 0, 0, 0, $this->srcW, $this->srcH);

157         $cImg = $this->creatImage($allImg, $toW, $toH, 0, 0, ($ctoW-$toW) / 2, ($ctoH-$toH) / 2, $toW, $toH);

158         return $this->echoImage($cImg, $toFile);

159         imagedestroy($cImg);

160         imagedestroy($allImg);

161     }

162  

163     //生成背景填充的缩图

164     private function backFill($toFile, $toW, $toH, $bk1=255, $bk2=255, $bk3=255){

165         $toWH = $toW / $toH;

166         $srcWH = $this->srcW / $this->srcH;

167         if($toWH <= $srcWH){

168             $ftoW = $toW;

169             $ftoH = $ftoW * ($this->srcH / $this->srcW);

170         }else{

171               $ftoH = $toH;

172               $ftoW = $ftoH*($this->srcW / $this->srcH);

173         }

174         if(function_exists("imagecreatetruecolor")){

175             @$cImg = imagecreatetruecolor($toW,$toH);

176             if(!$cImg){

177                 $cImg = imagecreate($toW,$toH);

178             }

179         }else{

180             $cImg = imagecreate($toW,$toH);

181         }

182         $backcolor = imagecolorallocate($cImg, $bk1, $bk2, $bk3);        //填充的背景颜色

183         imagefilledrectangle($cImg,0,0,$toW,$toH,$backcolor);

184         if($this->srcW > $toW || $this->srcH > $toH){

185             $proImg = $this->creatImage($this->im,$ftoW,$ftoH,0,0,0,0,$this->srcW,$this->srcH);

186             if($ftoW < $toW){

187                  imagecopy($cImg, $proImg, ($toW - $ftoW) / 2, 0, 0, 0, $ftoW, $ftoH);

188             }else if($ftoH < $toH){

189                  imagecopy($cImg, $proImg, 0, ($toH-$ftoH) / 2, 0, 0, $ftoW, $ftoH);

190             }else{

191                  imagecopy($cImg, $proImg, 0, 0, 0, 0, $ftoW, $ftoH);

192             }

193         }else{

194              imagecopymerge($cImg, $this->im, ($toW - $ftoW) / 2,($toH - $ftoH) / 2, 0, 0, $ftoW, $ftoH, 100);

195         }

196         return $this->echoImage($cImg, $toFile);

197         imagedestroy($cImg);

198     }

199     //创建图像

200     private function creatImage($img, $creatW, $creatH, $dstX, $dstY, $srcX, $srcY, $srcImgW, $srcImgH){

201         if(function_exists("imagecreatetruecolor")){

202             @$creatImg = imagecreatetruecolor($creatW, $creatH);

203             if($creatImg){

204                 imagecopyresampled($creatImg, $img, $dstX, $dstY, $srcX, $srcY, $creatW, $creatH, $srcImgW, $srcImgH);

205             }else{

206                 $creatImg=imagecreate($creatW,$creatH);

207                 imagecopyresized($creatImg, $img, $dstX, $dstY, $srcX, $srcY, $creatW, $creatH, $srcImgW, $srcImgH);

208             }

209          }else{

210             $creatImg=imagecreate($creatW, $creatH);

211             imagecopyresized($creatImg, $img, $dstX, $dstY, $srcX, $srcY, $creatW, $creatH, $srcImgW, $srcImgH);

212          }

213          return $creatImg;

214     }

215     

216     //输出图片,link---只输出,不保存文件。file--保存为文件

217     function echoImage($img, $toFile){

218         switch($this->echotype){

219             case 'link':

220                 if(function_exists('imagejpeg')) 

221                     return imagejpeg($img);

222                 else 

223                     return imagepng($img);

224                 break;

225             case 'file':

226                 if(function_exists('imagejpeg')) 

227                     return imagejpeg($img,$toFile);

228                 else 

229                     return imagepng($img,$toFile);

230                 break;

231         }

232     }

233     /**

234      * 

235      * 设置随机文件名称

236      * @access private

237      * @return string

238      */

239     private function setRandName(){

240         $fileName = date("YmdHis").rand(100,999);

241         return $fileName.'.'.$this->imageType;

242     }

243     private function setImageName(){

244         if ($this->imagepre != ''){

245             $this->newImageName = $this->imagepre.'_'.$this->setRandName();

246         }else {

247             $this->newImageName = $this->setRandName();

248         }

249     }

250     /**

251      * 

252      * 用来检查文件上传路径

253      * @access private

254      * @return bool

255      */

256     private function checkImagePath(){

257         if(empty($this->imagepath)) {

258             $this->errorNum = -2;

259             return false;

260         }

261 

262         if(!file_exists($this->imagepath) || !is_writable($this->imagepath)){

263             if(!@mkdir($this->imagepath, 0755)){

264                 $this->errorNum = -1;

265                 return false;

266             }

267         }

268         return true;

269     }

270     private function checkGD($imageType){

271         switch ($imageType){

272              case 1:

273                if(!function_exists("imagecreatefromgif")){

274                        $this->errorNum = 1;

275                        return false;

276                }

277                $this->imageType = 'gif';

278                $this->im = imagecreatefromgif($this->srcImage);

279                break;

280              case 2:

281                if(!function_exists("imagecreatefromjpeg")){

282                      $this->errorNum = 2;

283                      return false;

284                 }

285                 $this->imageType = 'jpg';

286                 $this->im = imagecreatefromjpeg($this->srcImage);    

287                 break;

288              case 3:

289                 if(!function_exists("imagecreatefrompng")){

290                       $this->errorNum = 3;

291                       return false;

292                  }

293                  $this->imageType = 'png';

294                  $this->im = imagecreatefrompng($this->srcImage);    

295                  break;

296               default:

297                  $this->errorNum = 0;

298                  return false;

299           }

300           return true;

301     }

302     /**

303      * 

304      * 用于获取上传后缩略图片的文件名

305      * @access public

306      * @return string

307      */

308     public function getNewImageName(){

309         return $this->newImageName;

310     }

311 

312     /**

313      * 

314      * 获取上传错误信息

315      * @access private

316      * @return string

317      */

318     private function getError(){

319         $str='生成缩略图<font color="red">'.$this->originName.'</font>时出错:';

320 

321         switch($this->errorNum){

322             case 4: $str .= '没有找到需要缩略的图片'; 

323                 break;

324             case 3: $str .= '你的GD库不能使用png格式的图片,请使用其它格式的图片!'; 

325                 break;

326             case 2: $str .= '你的GD库不能使用jpeg格式的图片,请使用其它格式的图片!';

327                 break;

328             case 1: $str .= '你的GD库不能使用GIF格式的图片,请使用Jpeg或PNG格式!';

329                 break;

330             case -1: $str .= '建立存放缩略图目录失败,请重新指定缩略图目录';

331                 break;

332             case -2: $str .= '必须指定缩略图的路径';

333                 break;

334             case -3: $str .= '初始化参数出错';

335                 break;

336             default: $str .= '末知错误';

337         }

338 

339         return $str.'<br>';

340     }

341     public function getErrorMsg() {

342         return $this->errorMess;

343     }

344 }

 

你可能感兴趣的:(PHP)