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;

大功告成!

6 則留言:

  1. 非常有用的教材。謝謝!

    請問如果想另縮一個較大的圖,用作放大之用應如何寫呢?

    回覆刪除
  2. CC 您好 :
    看不太懂您的意司, 您既要縮一個較大的圖,然後又要放大, 是否有作任何裁切?

     不過我想您的問題應該不是太麻煩就是了 , 希您能說下具體的狀況, 比較好一起來討論 ! 謝謝

    回覆刪除
  3. 太好了
    讓我發現這個好地方
    目前我在幫公司寫會員管理搜尋系統
    我目前寫出的功能是
    管理員登入後可以看到所有會員的【詳細】資料,而且可以搜尋會員
    一般會員登入後只能看到所有會員的【基本】資料,但是無法搜尋會員的功能
    現在想改良兩個地方
    1.希望一般會員登入後可以看到自己的【詳細】資料
    2.希望會員在註冊頁面中加一個上傳圖片的功能,然後可以對應在資料庫中,圖片可以顯示在【基本】資料中(欄位已經留了),希望還可以不限圖片大小,自動把圖片縮在那個欄位裡
    希望您可以幫忙小弟解答一下我的問題
    如果需要檔案或程式碼
    我絕對會配合您
    謝謝您

    回覆刪除
  4. 補充一下
    那個權限的問題我已經解決了
    現在差那個上傳圖片的功能,然後可以對應在資料庫中,圖片可以顯示在【基本】資料中(欄位已經留了),希望還可以不限圖片大小,自動把圖片縮在那個欄位裡
    還有
    希望可以加上登入多久後自動登出(用session函數)
    感恩

    回覆刪除
  5. 請問,png 縮圖後,背景變黑色的,該怎麼處理

    回覆刪除