http://php.net/manual/en/function.imagecopyresampled.php
做這個的原因是我要讓使用者自由上傳圖片,但是實際上用來顯示的區塊不大,如果使用者上傳的圖檔太大了會拖慢整個網站的速度,所以就只截取中間200X200的正方形這樣。
因為做的是上傳圖片,所以先加上選擇檔案上傳的程式碼,submit後連到upload.php
<form id="form1" enctype="multipart/form-data" action="upload.php" method="post" >
<input type='file' id="file" name="file" />
<input type="submit" value="Submit" class="btnSubmit" />
</form>
upload.php
// 取得圖片的副檔名 ( 如 jpg, gif... )
$file_ext = strrchr($_FILES['file']['name'],'.'); //上傳檔案的副檔名
switch(strtolower($file_ext)){
case '.bmp': $src = imagecreatefromwbmp($_FILES['file']['tmp_name']); break;
case '.gif': $src = imagecreatefromgif($_FILES['file']['tmp_name']); break;
case '.jpg': $src = imagecreatefromjpeg($_FILES['file']['tmp_name']); break;
case '.png': $src = imagecreatefrompng($_FILES['file']['tmp_name']); break;
default : echo "Unsupported picture type!";
}
// 取得圖片的寬
$src_w = imagesx($src);
// 取得圖片的長
$src_h = imagesy($src);
// 依長與寬兩者最短的邊來算出要抓的正方形邊長
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(200,200);
// 開始縮圖
imagecopyresampled($finpic, $newpc, 0, 0, 0, 0, 200, 200, $new_w, $new_h);
switch(strtolower($file_ext)){
// 儲存縮圖到指定的目錄存放 , 檔名自訂
case '.bmp': imagewbmp($finpic,"路徑/檔名".$file_ext); break;
case '.gif': imagegif($finpic,"路徑/檔名".$file_ext); break;
case '.jpg': imagejpeg($finpic,"路徑/檔名".$file_ext); break;
case '.png': imagepng($finpic,"路徑/檔名".$file_ext); break;
}
$tmpname="路徑/檔名".$file_ext;
判斷副檔名的時候加上了strtolower()是為了把拿到的副檔名英文字母的部分都轉成小寫,因為副檔名的大小寫不一定(.jpg 跟 .JPG),都轉成小寫比較方便。
https://blog.longwin.com.tw/2007/11/php_snap_image_block_2007/ 這篇裡面把imagecopyresampled()的每個參數都解釋得超清楚~
在找資料的過程中有看到有人說要把儲存檔案的資料夾權限轉成777,我是直接在server端手動新增了一個資料夾,然後就可以存我上傳的檔案了,不需要轉成777。
沒有留言 :
張貼留言