首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 圖片上傳類:支援水印(文字/圖片)與自動縮略圖生成

     編輯:PHP 相關知識

功能完整的 PHP 圖片上傳處理範例

本程式碼整合檔案上傳驗證、圖片水印(文字或圖片)、多位置選擇、自動生成縮略圖預覽等功能,採用程序式寫法,邏輯清晰,適合直接整合至專案或作為學習參考。

核心配置參數

$uptypes = array('image/jpg', 'image/jpeg', 'image/png', 'image/pjpeg', 'image/gif', 'image/bmp', 'image/x-png');
$max_file_size = 5000000;          // 5MB
$destination_folder = "upload/";   // 上傳目錄
$watermark = 1;                    // 1=加水印
$watertype = 1;                    // 1=文字, 2=圖片
$waterposition = 1;                // 1=左下, 2=右下, 3=左上, 4=右上, 5=置中
$waterstring = "newphp.site.cz";   // 水印文字
$waterimg = "xplore.gif";          // 水印圖片
$imgpreview = 1;                   // 1=生成預覽
$imgpreviewsize = 1/2;             // 縮略圖比例

處理流程摘要

  1. 驗證上傳檔案型態、大小、是否為真實上傳檔案。
  2. 建立上傳目錄、產生唯一檔名 (時間戳 + 副檔名)。
  3. 移動暫存檔至目標路徑。
  4. 若啟用水印:建立真彩色畫布、複製原圖、繪製半透明背景矩形、寫入文字或疊加水印圖片、覆蓋存回原檔。
  5. 若啟用預覽:輸出 <img> 標籤,寬高依比例縮小。

關鍵程式碼片段:水印處理

$iinfo = getimagesize($destination, $iinfo);
$nimage = imagecreatetruecolor($image_size[0], $image_size[1]);
$white = imagecolorallocate($nimage, 255, 255, 255);
$black = imagecolorallocate($nimage, 0, 0, 0);
imagefill($nimage, 0, 0, $white);

switch ($iinfo[2]) {
    case 1: $simage = imagecreatefromgif($destination); break;
    case 2: $simage = imagecreatefromjpeg($destination); break;
    case 3: $simage = imagecreatefrompng($destination); break;
    case 6: $simage = imagecreatefromwbmp($destination); break;
    default: die("不支援的檔案類型");
}
imagecopy($nimage, $simage, 0, 0, 0, 0, $image_size[0], $image_size[1]);
imagefilledrectangle($nimage, 1, $image_size[1]-15, 80, $image_size[1], $white);

switch ($watertype) {
    case 1: // 文字水印
        imagestring($nimage, 2, 3, $image_size[1]-15, $waterstring, $black);
        break;
    case 2: // 圖片水印
        $simage1 = imagecreatefromgif("xplore.gif");
        imagecopy($nimage, $simage1, 0, 0, 0, 0, 85, 15);
        imagedestroy($simage1);
        break;
}

// 依原格式存回
switch ($iinfo[2]) {
    case 1: imagejpeg($nimage, $destination); break; // GIF 轉存為 JPG
    case 2: imagejpeg($nimage, $destination); break;
    case 3: imagepng($nimage, $destination); break;
    case 6: imagewbmp($nimage, $destination); break;
}
imagedestroy($nimage);
imagedestroy($simage);

優化建議

  • 使用 imagettftext 支援 TTF 字型、中文、字體大小、旋轉、透明度。
  • 水印位置計算改為動態依圖片尺寸與水印尺寸計算座標。
  • 加入檔案雜湊 (MD5/SHA1) 做重複檢測、檔案型態二進位偵測 (finfo) 替代 MIME 判斷。
  • 將上傳邏輯封裝為類別,支援多實例、依賴注入、單元測試。
  • 前端加入拖曳上傳、進度條、多檔案佇列 (如 Dropzone, Uppy)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved