<?php /*已知問題:1.在圖片縮放功能中,使用imagecreatetruecolor函數創建畫布,並使用透明處理演算法,但PNG格式的圖片無法透明。用imagecreate函數創建畫布可以解決這個問題,但是縮放出來的圖片色數太少了 * * *type值: * (1):代表使用圖片縮放功能,此時,$value1代表縮放後圖片的寬度,$value2代表縮放後圖片的高度 * (2):代表使用圖片裁剪功能,此時,$value1代表裁剪開始點的坐標,例:從原點開始即是“0,0”前面是x軸後面是y軸,中間用,分隔,$value2代表裁剪的寬度和高度,同樣也是“20,20”的形式使用 * (3):代表使用加圖片水印功能,此時,$value1代表水印圖片的文件名,$value2代表水印在圖片中的位置,有10值個可以選,1代表左上,2代表左中,3代表左右,4代表中左,5代表中中,6代表中右,7代表下做,8代表下中,9代表下右,0代表隨機位置 * */ class image{ private $types; //使用的功能編號,1為圖片縮放功能 2為圖片裁剪功能 3,為圖片加圖片水印功能 private $imgtype;//圖片的格式 private $image; //圖片資源 private $width;//圖片寬度 private $height;//圖片高度 private $value1;//根據所傳type值的不同,$value1分別代表不同的值 private $value2;//根據所傳type值的不同,$value2分別代表不同的值 private $endaddress;//輸出後的地址+文件名 function __construct($imageaddress, $types, $value1="", $value2="", $endaddress){ $this->types=$types; $this->image=$this->imagesources($imageaddress); $this->width=$this->imagesizex(); $this->height=$this->imagesizey(); $this->value1=$value1; $this->value2=$value2; $this->endaddress=$endaddress; } function outimage(){ //根據傳入type值的不同,輸出不同的功能 switch($this->types){ case 1: $this->scaling(); break; case 2: $this->clipping(); break; case 3: $this->imagewater(); break; default: return false; } } private function imagewater(){ //http://www.hzhuti.com 加圖片水印功能 //用函數獲取水印文件的長和寬 $imagearrs=$this->getimagearr($this->value1); //調用函數計算出水印載入的位置 $positionarr=$this->position($this->value2, $imagearrs[0], $imagearrs[1]); //加水印 imagecopy($this->image, $this->imagesources($this->value1), $positionarr[0], $positionarr[1], 0, 0, $imagearrs[0], $imagearrs[1]); //調用輸出方法保存 $this->output($this->image); } private function clipping(){ //圖片裁剪功能 //將傳進來的值分別賦給變數 list($src_x, $src_y)=explode(",", $this->value1); list($dst_w, $dst_h)=explode(",", $this->value2); if($this->width < $src_x+$dst_w || $this->height < $src_y+$dst_h){ //這個判斷就是限制不能截取到圖片外面去 return false; } //創建新的畫布資源 $newimg=imagecreatetruecolor($dst_w, $dst_h); //進行裁剪 imagecopyresampled($newimg, $this->image, 0, 0, $src_x, $src_y, $dst_w, $dst_h, $dst_w, $dst_h); //調用輸出方法保存 $this->output($newimg); } private function scaling(){ //圖片縮放功能 //獲取等比縮放的寬和高 $this-> proimagesize(); //根據參數進行縮放,並調用輸出函數保存處理後的文件 $this->output($this->imagescaling()); } private function imagesources($imgad){ //獲取圖片類型並打開圖像資源 $imagearray=$this->getimagearr($imgad); switch($imagearray[2]){ case 1://gif $this->imgtype=1; $img=imagecreatefromgif($imgad); break; case 2://jpeg $this->imgtype=2; $img=imagecreatefromjpeg($imgad); break; case 3://png $this->imgtype=3; $img=imagecreatefrompng($imgad); break; default: return false; } return $img; } private function imagesizex(){ //獲得圖片寬度 return imagesx($this->image); } private function imagesizey(){ //獲取圖片高度 return imagesy($this->image); } private function proimagesize(){ //計算等比縮放的圖片的寬和高 if($this->value1 && ($this->width < $this->height)) { //等比縮放演算法 $this->value1=round(($this->value2/ $this->height)*$this->width); }else{ $this->value2=round(($this->value1/ $this->width) * $this->height); } } private function imagescaling(){//圖像縮放功能,返回處理後的圖像資源 $newimg=imagecreatetruecolor($this->value1, $this->value2); $tran=imagecolortransparent($this->image);//處理透明演算法 if($tran >= 0 && $tran < imagecolorstotal($this->image)){ $tranarr=imagecolorsforindex($this->image, $tran); $newcolor=imagecolorallocate($newimg, $tranarr['red'], $tranarr['green'], $tranarr['blue']); imagefill($newimg, 0, 0, $newcolor); imagecolortransparent($newimg, $newcolor); } imagecopyresampled($newimg, $this->image, 0, 0, 0, 0, $this->value1, $this->value2, $this->width, $this->height); return $newimg; } private function output($image){//輸出圖像 switch($this->imgtype){ case 1: imagegif($image, $this->endaddress); break; case 2: imagejpeg($image, $this->endaddress); break; case 3: imagepng($image, $this->endaddress); break; default: return false; } } private function getimagearr($imagesou){//返回圖像屬性數組方法 return getimagesize($imagesou); } private function position($num, $width, $height){//根據傳入的數字返回一個位置的坐標,$width和$height分別代表插入圖像的寬和高 switch($num){ case 1: $positionarr[0]=0; $positionarr[1]=0; break; case 2: $positionarr[0]=($this->width-$width)/2; $positionarr[1]=0; break; case 3: $positionarr[0]=$this->width-$width; $positionarr[1]=0; break; case 4: $positionarr[0]=0; $positionarr[1]=($this->height-$height)/2; break; case 5: $positionarr[0]=($this->width-$width)/2; $positionarr[1]=($this->height-$height)/2; break; case 6: $positionarr[0]=$this->width-$width; $positionarr[1]=($this->height-$height)/2; break; case 7: $positionarr[0]=0; $positionarr[1]=$this->height-$height; break; case 8: $positionarr[0]=($this->width-$width)/2; $positionarr[1]=$this->height-$height; break; case 9: $positionarr[0]=$this->width-$width; $positionarr[1]=$this->height-$height; break; case 0: $positionarr[0]=rand(0, $this->width-$width); $positionarr[1]=rand(0, $this->height-$height); break; } return $positionarr; } function __destruct(){ imagedestroy($this->image); } } ?>