PHP图片处理类:自动上传、生成缩略图与添加水印

七月
七月
发布时间:2026-10-16 | 6人浏览过
原创

在Web开发中,图片上传与后期处理(如生成缩略图、添加版权水印)是常见需求。本方案提供了一款轻量级PHP类,通过封装GD库功能,实现了文件的自动重命名、目录管理及图像几何变换,帮助开发者快速集成标准化的图片处理流程。

实现结果与核心功能

该PHP类旨在简化传统图片上传逻辑,主要解决以下问题:

  1. 文件安全与标准化:使用Unix时间戳作为文件名,避免文件名冲突和特殊字符导致的兼容性问题。
  2. 自动化目录管理:自动创建附件主目录、缩略图子目录和水印图片子目录。
  3. 图像压缩与缩放:根据设定阈值对原图进行等比缩放,生成高质量的JPEG缩略图。
  4. 文字水印叠加:调用系统字体文件,将自定义文本以半透明背景框形式固定在图片底部。

准备条件与环境要求

在部署该类之前,需确保服务器环境满足以下条件:

  1. PHP版本:建议PHP 5.3及以上(代码使用了较早期的特性,现代项目建议使用PDO或Mysqli替代潜在的安全隐患,但此类基础语法仍适用)。
  2. 扩展依赖:必须开启 gd 扩展以支持图像处理函数,若需支持PNG透明或更多格式,请确保编译时包含相应支持。
  3. 文件系统权限:Web服务进程(如Nginx/Apache用户)需对目标上传目录具有读写权限。
  4. 字体文件:需要本地存在一个TrueType字体文件(如 04B_08__.TTF),用于水印文字渲染。

真实操作顺序

第1步:定义类结构与属性配置

首先初始化类的成员变量,设定默认的存储路径、允许的文件类型、大小限制及字体路径。这是整个处理逻辑的基础配置。

<?php
class UpImages {
    var $annexFolder = "upload";//附件存放点,默认为:annex
    var $smallFolder = "small";//缩略图存放路径,注:必须是放在 $annexFolder下的子目录,默认为:smallimg
    var $markFolder = "mark";//水印图片存放处
    var $upFileType = "jpg gif png";//上传的类型,默认为:jpg gif png rar zip
    var $upFileMax = 1024;//上传大小限制,单位是“KB”,默认为:1024KB
    var $fontType;//字体
    var $maxWidth = 500; //图片最大宽度
    var $maxHeight = 600; //图片最大高度
    
    function UpImages($annexFolder,$smallFolder,$includeFolder) {
        $this->annexFolder = $annexFolder;
        $this->smallFolder = $smallFolder;
        $this->fontType = $includeFolder."/04B_08__.TTF";
    }
    // ... 后续方法见下文

第2步:执行文件上传与校验

通过 upLoad 方法接收前端表单数据。该方法会验证文件是否存在、类型是否匹配、大小是否在允许范围内。若校验通过,文件将被移动到指定的上传目录,并以当前时间戳命名返回新文件名。

function upLoad($inputName) {
    $imageName = time();//设定当前时间为图片名称
    if(@empty($_FILES[$inputName]["name"])) die("没有上传图片信息,请确认");
    $name = explode(".",$_FILES[$inputName]["name"]);//将上传前的文件以“.”分开取得文件类型
    $imgCount = count($name);//获得截取的数量
    $imgType = $name[$imgCount-1];//取得文件的类型
    if(strpos($this->upFileType,$imgType) === false) die(error("上传文件类型仅支持 ".$this->upFileType." 不支持 ".$imgType));
    $photo = $imageName.".".$imgType;//写入数据库的文件名
    $uploadFile = $this->annexFolder."/".$photo;//上传后的文件名称
    $upFileok = move_uploaded_file($_FILES[$inputName]["tmp_name"],$uploadFile);
    if($upFileok) {
        $imgSize = $_FILES[$inputName]["size"];
        $kSize = round($imgSize/1024);
        if($kSize > ($this->upFileMax*1024)) {
            @unlink($uploadFile);
            die(error("上传文件超过 ".$this->upFileMax."KB"));
        }
    } else {
        die(error("上传图片失败,请确认你的上传文件不超过 $upFileMax KB 或上传时间超时"));
    }
    return $photo;
}

第3步:获取图片元信息与生成缩略图

调用 getInfo 可获取图片宽高及类型。随后使用 smallImg 方法,根据源图尺寸按比例计算目标宽高,利用 imagecreatetruecolor 创建新画布并重采样图像,最后保存为JPEG格式至缩略图目录。

function smallImg($photo,$width=128,$height=128) {
    $imgInfo = $this->getInfo($photo);
    $photo = $this->annexFolder."/".$photo;//获得图片源
    $newName = substr($imgInfo["name"],0,strrpos($imgInfo["name"], "."))."_thumb.jpg";//新图片名称
    
    // 判断图像类型并加载资源
    if($imgInfo["type"] == 1) { $img = imagecreatefromgif($photo); }
    elseif($imgInfo["type"] == 2) { $img = imagecreatefromjpeg($photo); }
    elseif($imgInfo["type"] == 3) { $img = imagecreatefrompng($photo); }
    else { $img = ""; }
    
    if(empty($img)) return False;
    
    // 计算等比缩放尺寸
    $srcW = $imgInfo["width"]; 
    $srcH = $imgInfo["height"];
    if ($srcW * $width > $srcH * $height) { 
        $height = round($srcH * $width / $srcW); 
    } else { 
        $width = round($srcW * $height / $srcH); 
    }
    
    // 创建高质量缩略图
    if (function_exists("imagecreatetruecolor")) { 
        $newImg = imagecreatetruecolor($width, $height); 
        ImageCopyResampled($newImg, $img, 0, 0, 0, 0, $width, $height, $imgInfo["width"], $imgInfo["height"]); 
    } else { 
        $newImg = imagecreate($width, $height); 
        ImageCopyResized($newImg, $img, 0, 0, 0, 0, $width, $height, $imgInfo["width"], $imgInfo["height"]); 
    }
    
    // 保存文件
    if ($this->toFile) {
        if (file_exists($this->annexFolder."/".$this->smallFolder."/".$newName)) @unlink($this->annexFolder."/".$this->smallFolder."/".$newName);
        ImageJPEG($newImg,$this->annexFolder."/".$this->smallFolder."/".$newName);
        return $this->annexFolder."/".$this->smallFolder."/".$newName;
    } else {
        ImageJPEG($newImg);
    }
    ImageDestroy($newImg);
    ImageDestroy($img);
    return $newName;
}

第4步:添加文字水印

waterMark 方法先读取原图,计算缩放尺寸,然后在图片底部绘制半透明矩形区域作为水印底色,最后使用 ImageTTFText 写入两行文字。注意需预先下载对应的 .ttf 字体文件到指定目录。

function waterMark($photo,$text) {
    $imgInfo = $this->getInfo($photo);
    $photo = $this->annexFolder."/".$photo;
    $newName = substr($imgInfo["name"], 0, strrpos($imgInfo["name"], ".")) . "_mark.jpg";
    
    // 加载图像资源... (逻辑同smallImg)
    switch ($imgInfo["type"]) {
        case 1: $img = imagecreatefromgif($photo); break;
        case 2: $img = imagecreatefromjpeg($photo); break;
        case 3: $img = imagecreatefrompng($photo); break;
        default: return False;
    }
    // ... (省略重复的尺寸计算代码)

第5步:综合调用示例

在实际项目中,按顺序实例化类、配置参数、依次调用上传、缩略图和加水印方法,即可得到处理完毕的图片路径。

include 'Upimages.class.php';
$max="upload"; //文件上传路径
$mix="small"; //缩略图路径(必须在upload下建立)
$mark="mark"; //加水引的图片存放路径
$text = array("oktang","2012"); //水印内容
$img= new UpImages($max,$mix,$max); //实例化类文件

// 1. 上传文件
$photo = $img->upLoad("file"); 

// 2. 配置全局参数
$img->maxWidth = $img->maxHeight = 600; //设置高,和宽
$img->toFile = true;

// 3. 生成缩略图
$newSmallImg = $img->smallImg($photo); 

// 4. 添加水印
$newMark = $img->waterMark($photo,$text); 

// 输出路径供前端展示
echo $newSmallImg; 
echo $newMark;

完成判断

  • 检查 upload 目录是否新增了以时间戳命名的原图文件。
  • 检查 upload/small 目录是否生成了带有 _thumb.jpg 后缀的缩略图文件。
  • 检查 upload/mark 目录是否生成了带有 _mark.jpg 后缀的水印图片,且底部可见文字及半透明背景。
  • 浏览器能正常访问上述生成的图片URL,无404错误。

简要总结

该PHP类提供了一个紧凑的方案,用于解决静态图片处理中的上传命名、尺寸控制和版权保护问题。虽然代码风格较为传统,但其逻辑清晰,涵盖了从输入校验到GD库绘图的全流程。在使用时,需注意确保目录权限正确,并准备好所需的字体文件。以上就是PHP上传图片类实现随机命名、缩略图生成及水印功能的详细内容,更多关于PHP图像处理及Web开发的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表