[PHP]縮小/放大圖片並抓取中間位置指定大小區域

今天因為需要縮小/放大圖片,並抓取正中間的區域,所以寫這個function方便以後 只要傳入路徑都可以縮小或放大指定圖片,也可以使用上傳的圖片路徑做指定大小的縮放與切割,使用imageCopyResampled與imagecopy 兩個function作執行。

/**
 * $imgSrc圖片路徑
 * $type 圖片類型(jpeg/png/gif)
 * $goalSizeWidth  要縮小的寬度
 * $goalSizeHeight 要縮小的高度
 * 
 *  EX: imgResize ('image/images.jpge','image/jpge',100,100);
 *  */

function imgResize ($imgSrc,$type,$goalSizeWidth,$goalSizeHeight){
    
    //開啟圖片 
    switch ($type){
        case 'image/jpeg':
            $source = @imagecreatefromjpeg($imgSrc);
            break;
        case  'image/png':
            $source = @imagecreatefrompng($imgSrc);
            break;
        case  'image/gif':
            $source = @imagecreatefromgif($imgSrc);
            break;
        default :
            $source = @imagecreatefromjpeg($imgSrc);
    }
    /*Returns an image resource identifier on success, FALSE on errors.*/
    //開啟圖片 上面若無法開啟會回傳FALSE
    if (!$source){
        return FALSE; 
    }
    // 取得圖片原始寬度與高度
    $originalWidth  = imagesX($source); 
    $originalHeight = imagesY($source);
    
    // 計算縮圖尺寸
    if ($originalWidth<$originalHeight) {  //如果 高大於寬
        $goalWidth= $goalSizeWidth; //寬設定為指定大小
        $goalHeight = intval($originalHeight*$goalWidth /$originalWidth); //以寬縮小/放大的比例縮放
    } else {
        $goalHeight = $goalSizeHeight; //高設定為指定大小
        $goalWidth  = intval($originalWidth*$goalHeight/$originalHeight); //以高縮小/放大的比例縮放
    }
   
    
    // 建立圖片空間(給予要建立的大小 W,H )
    $decrease = imageCreateTrueColor($goalWidth, $goalHeight);
    
    /*bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )*/
    // 縮小圖片,因為要取樣在中間,所以先完成縮小後才擷取,在此不直接擷取
    imageCopyResampled(
        $decrease, $source, 
        0, 0, //要擷取的位置
        0, 0, //要擷取的位置
        $goalWidth,$goalHeight,  //目標寬高
        $originalWidth,$originalHeight //原始寬高
    );
    
    // 圖片選取的起始位址,抓中間
    $cropX = intval(($goalWidth - $goalSizeWidth )/2);
    $cropY = intval(($goalHeight - $goalSizeHeight )/2);


    // 建立圖片空間(給予要建立的大小 W,H )
    $crop = imageCreateTrueColor($goalSizeWidth, $goalSizeHeight);
    
    //設定PNG透明度 
    if($type == 'image/png'){
        $black = imagecolorallocate($crop, 0, 0, 0); 
        imagecolortransparent($crop, $black);
    }
    /*bool imagecopy ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h )*/
    // 複製圖片並指定範圍
    imageCopy(
        $crop,$decrease, 
        0,0,
        $cropX, $cropY, 
        $goalSizeWidth, $goalSizeHeight
    );
            
    switch ($type){
        case 'image/jpeg':
            imageJpeg($crop,$imgSrc);
            break;
        case  'image/png':
            imagepng($crop,$imgSrc);
            break;
        case  'image/gif':
            imagegif($crop,$imgSrc);
            break;
        default :
            imageJpeg($crop,$imgSrc);
    }
    return TRUE;
}

也可以使用$_FILE上傳的圖檔暫存路徑做處理

imgResize($_FILES['MyPhoto']['tmp_name'],$_FILES['MyPhoto']['type'],100,100); 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *