PHP实现图片等比例缩略图:类与自定义函数两种方案
本文详解如何利用PHP的GD库实现图片等比例缩略图生成,提供了基于类的完整封装与轻量级自定义函数两种方案,涵盖JPG、PNG及GIF格式的读取与输出。
使用场景与准备
在Web开发中,为了提升页面加载速度,通常需要将用户上传或存储的高分辨率原图生成指定尺寸的缩略图。PHP内置的GD库提供了丰富的图像处理函数,无需安装额外扩展即可实现。
操作前请确认服务器环境已启用 gd 扩展,并确保PHP版本兼容所调用的底层C语言接口(如 imagecopyresampled 和 imagecreatefromjpeg 等)。
方案一:基于类的通用缩略图处理
此方案将功能封装为 resizeimage 类,实例化后自动生成缩略图。其优势在于逻辑清晰,支持“等比缩放”与“强制裁切”两种模式,适用于需要严格对齐固定尺寸卡片的场景。
第1步:定义类属性与初始化参数
目的: 设置源文件路径、目标尺寸及裁切开关。
关键参数说明:
$img:源图片路径$wid:目标宽度(像素)$hei:目标高度(像素)$c:裁切标志,0表示不裁切(保持比例),1表示裁切(填满目标区域)$dstpath:保存后的新图片路径
$resizeimage = new resizeimage("./shawn.jpg", "200", "100", "0", "../pic/shawnsun.jpg");
// 实例化后会立即执行生成操作
第2步:核心生成逻辑解析
入口: newimg() 方法
动作: 根据比例关系决定绘制策略。
1. **计算比例**:比较原图宽高比 ($ratio) 与目标框宽高比 ($resize_ratio)。
2. **裁切模式 ($cut=="1")**:
- 若原图更宽 ($ratio >= $resize_ratio),则截取中间部分填满高度,宽度优先。
- 若原图更高 ($ratio < $resize_ratio),则截取中间部分填满宽度,高度优先。
- 使用 imagecopyresampled 进行高质量重采样复制。
3. **非裁切模式**:
- 始终保持一边尺寸等于设定值,另一边按比例缩小,确保原图内容不丢失。
<?php
class resizeimage{
public $type, $width, $height;
public $resize_width, $resize_height;
public $cut, $srcimg, $dstimg, $im;
function resizeimage($img, $wid, $hei, $c, $dstpath){
$this->srcimg = $img;
$this->resize_width = $wid;
$this->resize_height = $hei;
$this->cut = $c;
// 识别图片类型 (jpg/gif/png)
$this->type = strtolower(substr(strrchr($this->srcimg,"."),1));
// 初始化资源
$this->initi_img();
$this->dst_img($dstpath);
$this->width = imagesx($this->im);
$this->height = imagesy($this->im);
// 执行生成
$this->newimg();
ImageDestroy ($this->im);
}
function initi_img(){
if($this->type=="jpg") $this->im = imagecreatefromjpeg($this->srcimg);
elseif($this->type=="gif") $this->im = imagecreatefromgif($this->srcimg);
elseif($this->type=="png") $this->im = imagecreatefrompng($this->srcimg);
}
function dst_img($dstpath){
$this->dstimg = $dstpath;
}
function newimg(){
$resize_ratio = ($this->resize_width)/($this->resize_height);
$ratio = ($this->width)/($this->height);
$newimg = imagecreatetruecolor($this->resize_width, $this->resize_height);
if($this->cut == "1") {
// 裁切逻辑
if($ratio >= $resize_ratio) {
imagecopyresampled($newimg, $this->im, 0, 0, 0, 0,
$this->resize_width, $this->resize_height,
(($this->height)*$resize_ratio), $this->height);
} else {
imagecopyresampled($newimg, $this->im, 0, 0, 0, 0,
$this->resize_width, $this->resize_height,
$this->width, (($this->width)/$resize_ratio));
}
} else {
// 等比缩放逻辑
if($ratio >= $resize_ratio) {
$final_w = $this->resize_width;
$final_h = ($this->resize_width)/$ratio;
$newimg = imagecreatetruecolor($final_w, $final_h);
imagecopyresampled($newimg, $this->im, 0, 0, 0, 0,
$final_w, $final_h, $this->width, $this->height);
} else {
$final_w = ($this->resize_height)*$ratio;
$final_h = $this->resize_height;
$newimg = imagecreatetruecolor($final_w, $final_h);
imagecopyresampled($newimg, $this->im, 0, 0, 0, 0,
$final_w, $final_h, $this->width, $this->height);
}
}
ImageJpeg ($newimg, $this->dstimg);
}
}
?>
方案二:轻量级自定义函数
目的: 提供一段简短的代码片段,无需面向对象的结构即可快速生成缩略图。
入口: 直接调用 thumbs() 函数。
动作: 自动计算最佳缩放比例,并进行适当的居中绘制。
第1步:函数调用与参数
使用方式如下,参数顺序为:文件名、保存路径、设定宽、设定高。
thumbs('shawn.jpg', 'shawnsun.jpg', 100, 100);
第2步:内部处理逻辑
该函数通过 getimagesize 获取原图信息,并根据 MIME 类型分别调用对应的创建函数(imagecreatefromjpeg 等)。
核心算法在于 $scalc = max($width/$SetW, $height/$SetH),取宽度和高度各自缩放倍数的较大者作为统一缩放基准,从而保证图片不变形且充满预设边界。
最后使用 imagecopyresized 将缩放后的图像放置在 $SetW x $SetH 的背景画布中央。
<?php
function thumbs($FileName, $SaveTo, $SetW, $SetH){
$IMGInfo = getimagesize($FileName);
if(!$IMGInfo) return false;
// 根据MIME类型加载图像
if(in_array($IMGInfo['mime'], ['image/pjpeg', 'image/jpeg'])) {
$ThisPhoto = imagecreatefromjpeg($FileName);
} elseif(in_array($IMGInfo['mime'], ['image/x-png', 'image/png'])) {
$ThisPhoto = imagecreatefrompng($FileName);
} elseif($IMGInfo['mime'] == "image/gif") {
$ThisPhoto = imagecreatefromgif($FileName);
} else {
return false;
}
$width = $IMGInfo[0];
$height = $IMGInfo[1];
// 计算缩放比例,防止变形
$scalc = max($width/$SetW, $height/$SetH);
$nw = intval($width / $scalc);
$nh = intval($height / $scalc);
// 微调以适配整数像素边界(可选优化)
if($SetW - $nw == 1) $nw = $SetW;
if($SetH - $nh == 1) $nh = $SetH;
// 确定最终画布偏移量,实现居中
$px = ($SetW - $nw) / 2;
$py = ($SetH - $nh) / 2;
// 创建空白画布并填充
$NewPhoto = imagecreatetruecolor($SetW, $SetH);
// 实际绘制,保留透明通道需额外处理Alpha,此处默认背景
imagecopyresized($NewPhoto, $ThisPhoto, $px, $py, 0, 0, $nw, $nh, $width, $height);
// 输出JPEG格式
ImageJpeg ($NewPhoto, $SaveTo);
imagedestroy($ThisPhoto);
imagedestroy($NewPhoto);
return true;
}
?>
注意事项与维护
性能提示: 上述示例主要用于演示原理。在生产环境中,建议开启 gd.jpeg_ignore_warning 配置项以防止低质量JPG引发警告报错,或在创建画布时预置背景色填充透明度。
格式兼容性: PNG和GIF包含透明通道,若直接使用 ImageJpeg 输出可能会丢失透明性。若需保持透明或支持动图,应分别调用 ImagePng 或检查是否为 GIF 动画并进行帧处理。
内存管理: 处理完成后务必调用 imagedestroy() 释放内存,特别是在批量处理图片循环中。
以上就是PHP生成等比缩略图类和自定义函数的详细内容,更多关于PHP图片处理技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













