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

PHP 圖片處理實作:水印添加與縮略圖生成自訂函數

     編輯:PHP 綜合知識

函數一:watermark() - 添加水印

/**
 * @param string $bigimg   大圖路徑(被加水印)
 * @param string $smallimg 水印圖路徑
 * @param int    $coord    位置:1左上 2右上 3右下 4左下 5置中
 */
function watermark($bigimg, $smallimg, $coord = 1) {
    // 載入大圖
    $bi = getimagesize($bigimg);
    switch ($bi[2]) {
        case IMAGETYPE_GIF:  $im1 = imagecreatefromgif($bigimg);  break;
        case IMAGETYPE_JPEG: $im1 = imagecreatefromjpeg($bigimg); break;
        case IMAGETYPE_PNG:  $im1 = imagecreatefrompng($bigimg);  break;
        default: return false;
    }
    // 載入水印圖
    $si = getimagesize($smallimg);
    switch ($si[2]) {
        case IMAGETYPE_GIF:  $im2 = imagecreatefromgif($smallimg);  break;
        case IMAGETYPE_JPEG: $im2 = imagecreatefromjpeg($smallimg); break;
        case IMAGETYPE_PNG:  $im2 = imagecreatefrompng($smallimg);  break;
        default: return false;
    }
    // 計算座標並合成
    switch ($coord) {
        case 1: imagecopy($im1, $im2, 0, 0, 0, 0, $si[0], $si[1]); break;
        case 2: imagecopy($im1, $im2, $bi[0]-$si[0], 0, 0, 0, $si[0], $si[1]); break;
        case 3: imagecopy($im1, $im2, $bi[0]-$si[0], $bi[1]-$si[1], 0, 0, $si[0], $si[1]); break;
        case 4: imagecopy($im1, $im2, 0, $bi[1]-$si[1], 0, 0, $si[0], $si[1]); break;
        case 5: imagecopy($im1, $im2, ($bi[0]-$si[0])/2, ($bi[1]-$si[1])/2, 0, 0, $si[0], $si[1]); break;
    }
    // 輸出
    header('Content-Type: ' . image_type_to_mime_type($bi[2]));
    switch ($bi[2]) {
        case IMAGETYPE_GIF:  imagegif($im1); break;
        case IMAGETYPE_JPEG: imagejpeg($im1); break;
        case IMAGETYPE_PNG:  imagepng($im1); break;
    }
    imagedestroy($im1); imagedestroy($im2);
}

函數二:thumbnail() - 生成縮略圖

/**
 * @param string $srcimg   來源圖片路徑
 * @param int    $multiple 縮小倍數(預設 2 = 縮為 1/2)
 */
function thumbnail($srcimg, $multiple = 2) {
    $info = getimagesize($srcimg);
    $w = $info[0] / $multiple;
    $h = $info[1] / $multiple;

    switch ($info[2]) {
        case IMAGETYPE_GIF:  $im = imagecreatefromgif($srcimg);  break;
        case IMAGETYPE_JPEG: $im = imagecreatefromjpeg($srcimg); break;
        case IMAGETYPE_PNG:  $im = imagecreatefrompng($srcimg);  break;
        default: return false;
    }

    $thumb = imagecreatetruecolor($w, $h);
    imagecopyresampled($thumb, $im, 0, 0, 0, 0, $w, $h, $info[0], $info[1]); // 高品質重採樣

    header('Content-Type: ' . image_type_to_mime_type($info[2]));
    switch ($info[2]) {
        case IMAGETYPE_GIF:  imagegif($thumb); break;
        case IMAGETYPE_JPEG: imagejpeg($thumb); break;
        case IMAGETYPE_PNG:  imagepng($thumb); break;
    }
    imagedestroy($im); imagedestroy($thumb);
}

改進建議(現代化)

  • 使用 image_type_to_mime_type() 替代手動 switch 判斷 MIME
  • 縮圖改用 imagecopyresampled()(雙三次插值)取代 imagecopyresized(),品質更好
  • 新增 儲存至檔案 參數(imagejpeg($im, $filename, 90)),而非直接輸出
  • 支援 WebP 格式(imagecreatefromwebp、imagewebp)
  • 加入錯誤處理與例外拋出,避免靜默失敗

使用範例

// 加水印並儲存
watermark('photo.jpg', 'logo.png', 3); // 右下角

// 產生縮略圖儲存
thumbnail('photo.jpg', 4); // 縮為 1/4
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved