封裝一個通用的縮略圖生成函數,支援指定目標寬高、自動計算縮放比例、保持原圖比例、多格式輸出。
function makethumb($im, $dstimW, $dstimH, $thumbname, $filetype)
$im:GD 圖片資源(已由 imagecreatefromjpeg/png/gif 建立)。$dstimW、$dstimH:目標最大寬高。$thumbname:輸出文件名(不含副檔名)。$filetype:jpg、png、gif。imagesx/y。imagecreatetruecolor + imagecopyresampled 高質量重採樣;若不存在則退回 imagecopyresized。$filetype 調用對應輸出函數(imagejpeg/png/gif)。imagedestroy。<?php
function makethumb($im, $dstW, $dstH, $thumbname, $filetype) {
$srcW = imagesx($im);
$srcH = imagesy($im);
$funcMap = [
'jpg' => 'imagejpeg',
'jpeg' => 'imagejpeg',
'png' => 'imagepng',
'gif' => 'imagegif',
];
if (!isset($funcMap[$filetype])) return false;
// 無需縮放
if ($dstW >= $srcW && $dstH >= $srcH) {
$funcMap[$filetype]($im, "{$thumbname}.{$filetype}");
return true;
}
// 計算縮放比
$ratioW = $dstW / $srcW;
$ratioH = $dstH / $srcH;
$ratio = min($ratioW, $ratioH);
$newW = (int)($srcW * $ratio);
$newH = (int)($srcH * $ratio);
$dst = imagecreatetruecolor($newW, $newH);
// 保持 PNG/GIF 透明度
if ($filetype === 'png' || $filetype === 'gif') {
imagealphablending($dst, false);
imagesavealpha($dst, true);
}
imagecopyresampled($dst, $im, 0, 0, 0, 0, $newW, $newH, $srcW, $srcH);
$funcMap[$filetype]($dst, "{$thumbname}.{$filetype}");
imagedestroy($dst);
return true;
}
$src = 'photo.jpg';
$im = imagecreatefromjpeg($src);
makethumb($im, 300, 200, 'thumb_photo', 'jpg');
imagedestroy($im);
ini_set('memory_limit', '256M')。