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

PHP 圖片裁剪與縮放:生成符合行動裝置需求的縮略圖

     編輯:PHP 綜合知識

前言

當圖片尺寸過大且規格不一時,若單靠 JavaScript 在客戶端控制顯示,不僅在行動裝置上效果不佳,還會消耗大量流量。最佳解決方案是將處理邏輯前置到伺服器端,利用 PHP GD 庫統一處理現有圖庫,生成適合行動裝置的縮略圖。

核心需求

  • 來源圖片:wallpaper.jpg
  • 目標尺寸:寬 300px、高 200px
  • 處理邏輯:裁剪圖像以最大化顯示區域,再按比例縮放至指定尺寸

關鍵技術點:imagecopyresampled vs imagecopyresized

初期嘗試使用 imagecopyresized 進行等比縮小,但發現縮圖噪點嚴重、畫質粗糙。改用 imagecopyresampled 後,該函數會對圖像重新取樣並進行平滑處理,清晰度大幅提升。注意:網路上許多轉載文章將函數名誤寫為 imagecopysampled(少了一個 're'),會導致無法使用,請特別留意。

完整實作程式碼

<?php
$src_img = "wallpaper.jpg";
$dst_w = 300;
$dst_h = 200;

// 取得原圖尺寸
list($src_w, $src_h) = getimagesize($src_img);

// 計算長寬比
$dst_scale = $dst_h / $dst_w; // 目標比例
$src_scale = $src_h / $src_w; // 原圖比例

// 依據比例決定裁剪區域
if ($src_scale >= $dst_scale) {
    // 原圖過高:以寬為基準,高度置中裁剪(此處採 1/3 位置,可依設計調整)
    $w = intval($src_w);
    $h = intval($dst_scale * $w);
    $x = 0;
    $y = ($src_h - $h) / 3;
} else {
    // 原圖過寬:以高為基準,寬度置中裁剪
    $h = intval($src_h);
    $w = intval($h / $dst_scale);
    $x = ($src_w - $w) / 2;
    $y = 0;
}

// 建立圖像資源並裁剪
$source = imagecreatefromjpeg($src_img);
$cropped = imagecreatetruecolor($w, $h);
imagecopy($cropped, $source, 0, 0, $x, $y, $w, $h);

// 縮放至目標尺寸
$target = imagecreatetruecolor($dst_w, $dst_h);
$scale = $dst_w / $w;
$final_w = intval($w * $scale);
$final_h = intval($h * $scale);
imagecopyresampled($target, $cropped, 0, 0, 0, 0, $final_w, $final_h, $w, $h);

// 輸出檔案(以時間戳命名避免衝突)
$timestamp = time();
imagejpeg($target, "$timestamp.jpg");

// 釋放資源
imagedestroy($source);
imagedestroy($cropped);
imagedestroy($target);
?>

補充說明

  • 若來源圖片為 PNG 或 GIF,請對應使用 imagecreatefrompng、imagecreatefromgif 並以 imagepng、imagegif 輸出。
  • 裁剪座標 $y = ($src_h - $h) / 3 採用「黃金分割點」而非單純置中,視覺效果通常更佳;可依專案需求改為 / 2。
  • 正式環境建議加入錯誤處理(如檔案是否存在、GD 擴展是否載入)與輸出標頭 header('Content-Type: image/jpeg') 直接輸出二進位串流。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved