當圖片尺寸過大且規格不一時,若單靠 JavaScript 在客戶端控制顯示,不僅在行動裝置上效果不佳,還會消耗大量流量。最佳解決方案是將處理邏輯前置到伺服器端,利用 PHP GD 庫統一處理現有圖庫,生成適合行動裝置的縮略圖。
wallpaper.jpgimagecopyresampled 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);
?>
imagecreatefrompng、imagecreatefromgif 並以 imagepng、imagegif 輸出。$y = ($src_h - $h) / 3 採用「黃金分割點」而非單純置中,視覺效果通常更佳;可依專案需求改為 / 2。header('Content-Type: image/jpeg') 直接輸出二進位串流。