今天因為需要縮小/放大圖片,並抓取正中間的區域,所以寫這個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);