函數一: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