PHP 如何做缩略图
在日常处理图片的场景里,比如给电商商品图做统一尺寸、给博客文章配图做预览图,我们常常需要把大尺寸图片缩小成合适的缩略图。很多人觉得这是专业修图软件的活,其实用PHP就能简单搞定,甚至不用额外装复杂工具,今天就用生活化的例子讲清楚怎么操作。
先搞懂核心:缩略图是怎么“变瘦”的
你可以把一张图片想象成一张方格纸,每个格子就是一个“像素点”,格子的颜色凑起来就是我们看到的画面。所谓做缩略图,就是把这张方格纸的格子数量变少——比如原来的图是1000格宽、800格高,要做200格宽的缩略图,就把每5个横向格子合并成1个,纵向同理,这样整体大小就缩成原来的1/5,画面还不会太模糊,这就是缩略图的核心原理。

用PHP实现这个功能,其实就是“读取原图片→计算缩略图尺寸→把原图片的像素合并压缩→输出保存缩略图”,整个过程靠PHP自带的图片处理扩展就能完成,最常用的是GD库,它就像PHP自带的“图片小助手”,不用额外安装复杂插件。
第一步:准备工作,先确认“小助手”能用
要做缩略图,首先得确认PHP里的GD库有没有开启。怎么看呢?可以在自己的网站根目录建一个叫phpinfo.php的文件,内容写一行<?php phpinfo(); ?>,上传后打开网址,搜“GD”,如果能看到GD库的版本信息,说明它已经准备好工作了,要是没找到,找空间服务商开一下就行,大部分免费/付费空间都默认开启了这个功能。
第二步:写简单代码,亲手做一张缩略图
这里举个最常用的例子:把一张本地的JPG图片,缩成宽度200像素的缩略图,高度自动按比例调整,不会把图片拉变形。代码看起来有点像代码,但你不用怕,我把每一步都翻译成大白话:
`php
<?php
// 1. 读取原图片(把原图片的方格纸数据读进来)
$original_path = 'original.jpg'; // 换成你自己的原图片路径
$original_image = imagecreatefromjpeg($original_path);
// 2. 拿到原图片的尺寸,计算缩略图的尺寸
$original_width = imagesx($original_image); // 原图片宽度(横向格子数)
$original_height = imagesy($original_image); // 原图片高度(纵向格子数)
$thumb_width = 200; // 想要的缩略图宽度,这里固定200
$thumb_height = $original_height * ($thumb_width / $original_width); // 按比例算高度,不会变形
// 3. 创建空白的缩略图画布,用来放合并后的像素
$thumb_image = imagecreatetruecolor($thumb_width, $thumb_height);
// 4. 核心操作:把原图片的像素合并到缩略图画布里
imagecopyresampled(
$thumb_image, $original_image,
0, 0, // 缩略图的坐标(从左上角开始放)
0, 0, // 原图片的坐标(从原图片左上角开始取像素)
$thumb_width, $thumb_height, // 缩略图的总格子数
$original_width, $original_height // 原图片的总格子数
);
// 5. 把缩略图保存到本地,大功告成
imagejpeg($thumb_image, 'thumb.jpg', 90); // 第三个参数是图片质量,0-100,90已经很清晰
// 6. 清理临时的图片数据,释放空间
imagedestroy($thumb_image);
imagedestroy($original_image);
?>
`
这段代码只要把original.jpg换成你电脑里的图片路径,上传到网站就能用,出来的thumb.jpg就是做好的缩略图。
注意几个容易踩的“小坑”
就像冲咖啡要注意水温一样,做缩略图也有几个细节要注意:第一,不同格式的图片要用不同的读取函数,比如PNG要用imagecreatefrompng(),GIF要用imagecreatefromgif(),不然会显示不出来;第二,如果原图片是透明的PNG,要给缩略图画布加上透明背景,不然会变成讨厌的黑色背景;第三,要是做批量缩略图,记得给缩略图命名加序号,比如thumb_1.jpg,不然会覆盖之前的文件。
其实PHP做缩略图远不止这个简单版本,还能做固定尺寸的裁剪(比如要缩略图刚好是200×200,多出来的部分剪掉)、批量处理文件夹里的所有图片,但只要掌握了最基础的合并像素的逻辑,复杂的功能都是在这个基础上小改。平时给网站做文章配图缩略、用户头像缩略,用这个方法都能搞定,不用再找修图工具,代码简单还好维护。