2009/1/12

php : 上傳圖片後再切出並縮小成正方形圖《by 童顏未老人》

 這次的新需求是,會員要可以上傳自己喜愛的照片,而且要大小不拘,然後需由每一張圖居中的取出最大範圍的正方形圖後,在把他縮小到 60 X 60 的大小去,再存到系統上面去,這樣一來可以減低系統的硬碟的負擔。要作到這樣的話,就必需要利用到 GD 的函數了。

 例如,一張 1600 X 1200 的照片上傳以後,需先拮取其中的 1200 X 1200 (中心點不變),再將其縮小成 60 X 60 的圖片!

 在主要的輸入畫面上:

<form name="frm" method="POST" action="loadpic.php" enctype="multipart/form-data">
<input id="filename" type="file" size="45" name="filename">( 請上傳您的個人照片!)
<input type="submit" name="doit" value="送出">
</form>

在這裏最重要的是在 <form> 中必需要加上 enctype="multipart/form-data"!

而在 loadpic.php 這隻主要程式中,應如下的寫:

先定義出一個 function 用來抓副檔名:

function getFiletype ($FileName) {
$num=strrpos($FileName,".");
return ".".substr($FileName,$num+1);
}

// 取得上傳的圖片
$src = imagecreatefromjpeg($_FILES['filename']['tmp_name']);

// 取得圖片的寬
$src_w = imagesx($src);

// 取得圖片的長
$src_h = imagesy($src);

// 取得圖片的副檔名 ( 如 jpg, gif... )
$src_type = strtolower(getFiletype($_FILES["filename"]["name"]));

// 依長與寬兩者最短的邊來算出要抓的正方形邊長
if( $src_w > $src_h){
$new_w = $src_h;
$new_h = $src_h;
}else{
$new_w = $src_w;
$new_h = $src_w;
}

// 以長方形的中心來取得正方形的左上方原點
$srt_w = ( $src_w - $new_w ) / 2;
$srt_h = ( $src_h - $new_h ) / 2;

// 定義一個圖形 ( 針對正方形圖形 )
$newpc = imagecreatetruecolor($new_w,$new_h);

// 抓取正方形的截圖
imagecopy($newpc, $src, 0, 0, $srt_w, $srt_h, $new_w, $new_h );

// 建立縮圖
$finpic = imagecreatetruecolor(60,60);

// 開始縮圖
imagecopyresampled($finpic, $newpc, 0, 0, 0, 0, 60, 60, $new_w, $new_h);

// 儲存縮圖到指定的目錄存放 , 檔名就是記錄在 SESSION 中的 login name
imagejpeg($finpic,
"../../images/Upload/Users/".$_SESSION["MemberLoginName"].$src_type);

// 將檔名存到變數 $filename 去,以備記錄到 table 去,方便日後依會員的帳號來抓取圖片
$filename = $_SESSION["MemberLoginName"].$src_type;

大功告成!