PHP实现图片等比例缩略图:类与自定义函数两种方案

Dylan
Dylan
发布时间:2026-10-14| 5人浏览过
原创

本文详解如何利用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图片处理技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。