PHP圖像處理類實現縮放、裁剪、加水印

fmms 12年前發布 | 33K 次閱讀 PHP PHP開發

該類只有一個公共方法,通過在實例化對象的時候給$type參數傳不同的值,從而實現不同功能。   目前只實現了三個功能:1:圖片縮放,2:圖片裁剪,3:加圖片水印。

在實例化中,通過給第二個參數傳不同的值,從而實現不同的功能

<?php
include "image.class.php";
$image=new image("2.png", 1, "300", "500", "5.png");   //使用圖片縮放功能
$image=new image("2.png", 2, "0,0", "50,50", "5.png"); //使用圖片裁剪功能
$image=new image("2.png", 3, "1.png", "0", "5.png");   //使用加圖片水印功能
$image->outimage();
?>
<?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(){  //加圖片水印功能
    //用函數獲取水印文件的長和寬
    $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);
}


}

?></pre>

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!