PHP图片处理类:自动上传、生成缩略图与添加水印
在Web开发中,图片上传与后期处理(如生成缩略图、添加版权水印)是常见需求。本方案提供了一款轻量级PHP类,通过封装GD库功能,实现了文件的自动重命名、目录管理及图像几何变换,帮助开发者快速集成标准化的图片处理流程。
实现结果与核心功能
该PHP类旨在简化传统图片上传逻辑,主要解决以下问题:
- 文件安全与标准化:使用Unix时间戳作为文件名,避免文件名冲突和特殊字符导致的兼容性问题。
- 自动化目录管理:自动创建附件主目录、缩略图子目录和水印图片子目录。
- 图像压缩与缩放:根据设定阈值对原图进行等比缩放,生成高质量的JPEG缩略图。
- 文字水印叠加:调用系统字体文件,将自定义文本以半透明背景框形式固定在图片底部。
准备条件与环境要求
在部署该类之前,需确保服务器环境满足以下条件:
- PHP版本:建议PHP 5.3及以上(代码使用了较早期的特性,现代项目建议使用PDO或Mysqli替代潜在的安全隐患,但此类基础语法仍适用)。
- 扩展依赖:必须开启
gd扩展以支持图像处理函数,若需支持PNG透明或更多格式,请确保编译时包含相应支持。 - 文件系统权限:Web服务进程(如Nginx/Apache用户)需对目标上传目录具有读写权限。
- 字体文件:需要本地存在一个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开发的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













