在php开发中,图片压缩是优化存储和传输效率的常用操作,通过调整图片质量、改变图片尺寸等方式,可以在保证视觉效果的前提下减小图片体积。php内置的GD库和Imagick扩展都支持图片压缩处理,其中GD库使用更为广泛,本文将以GD库为例讲解具体实现方法。

php图片压缩的核心原理
php图片压缩本质是对图片的像素数据进行重新编码,主要有两个调整方向:一是调整图片的压缩质量参数,质量越低,生成的图片体积越小,但清晰度会相应下降;二是缩小图片的尺寸,减少像素点数量,从而直接降低图片体积。两种方式可以单独使用,也可以结合使用。
GD库压缩图片的实现步骤
1. 检查GD库是否开启
首先确认php环境已经开启GD库扩展,可以通过<phpinfo()>函数查看,若没有开启需要在php.ini中开启extension=gd扩展,重启服务后生效。
2. 读取原始图片
根据原始图片的格式,使用对应的GD库函数读取图片资源,常见的格式对应函数如下:
- JPEG格式:
imagecreatefromjpeg() - PNG格式:
imagecreatefrompng() - GIF格式:
imagecreatefromgif()
3. 调整图片质量并保存
对于JPEG格式的图片,可以通过<imagejpeg()>函数的第三个参数调整质量,参数范围为0-100,数值越高质量越好,体积越大。PNG格式的质量参数范围为0-9,数值越高压缩率越高,体积越小。以下是完整的压缩代码示例:
<?php
/**
* php图片压缩函数
* @param string $srcPath 原始图片路径
* @param string $destPath 压缩后保存路径
* @param int $quality 压缩质量 JPEG范围0-100 PNG范围0-9
* @param int $maxWidth 最大宽度 超过则缩放
* @param int $maxHeight 最大高度 超过则缩放
* @return bool 是否压缩成功
*/
function compressImage($srcPath, $destPath, $quality = 75, $maxWidth = 0, $maxHeight = 0) {
// 获取图片信息
$imgInfo = getimagesize($srcPath);
if (!$imgInfo) {
return false;
}
$mime = $imgInfo['mime'];
// 根据mime类型创建图片资源
switch ($mime) {
case 'image/jpeg':
$srcImg = imagecreatefromjpeg($srcPath);
break;
case 'image/png':
$srcImg = imagecreatefrompng($srcPath);
break;
case 'image/gif':
$srcImg = imagecreatefromgif($srcPath);
break;
default:
return false;
}
// 获取原始尺寸
$srcWidth = imagesx($srcImg);
$srcHeight = imagesy($srcImg);
// 计算缩放后的尺寸
$newWidth = $srcWidth;
$newHeight = $srcHeight;
if ($maxWidth > 0 && $srcWidth > $maxWidth) {
$newWidth = $maxWidth;
$newHeight = floor($srcHeight * ($maxWidth / $srcWidth));
}
if ($maxHeight > 0 && $newHeight > $maxHeight) {
$newHeight = $maxHeight;
$newWidth = floor($newWidth * ($maxHeight / $newHeight));
}
// 创建新图片资源
$newImg = imagecreatetruecolor($newWidth, $newHeight);
// 处理PNG透明背景
if ($mime == 'image/png') {
imagealphablending($newImg, false);
imagesavealpha($newImg, true);
$transparent = imagecolorallocatealpha($newImg, 255, 255, 255, 127);
imagefilledrectangle($newImg, 0, 0, $newWidth, $newHeight, $transparent);
}
// 缩放图片
imagecopyresampled($newImg, $srcImg, 0, 0, 0, 0, $newWidth, $newHeight, $srcWidth, $srcHeight);
// 保存图片
$result = false;
switch ($mime) {
case 'image/jpeg':
$result = imagejpeg($newImg, $destPath, $quality);
break;
case 'image/png':
$result = imagepng($newImg, $destPath, $quality);
break;
case 'image/gif':
$result = imagegif($newImg, $destPath);
break;
}
// 释放资源
imagedestroy($srcImg);
imagedestroy($newImg);
return $result;
}
// 调用示例
$src = 'upload/original.jpg';
$dest = 'upload/compressed.jpg';
// 压缩质量为70,最大宽度800,超过则缩放
$res = compressImage($src, $dest, 70, 800, 0);
if ($res) {
echo '图片压缩保存成功';
} else {
echo '图片压缩失败';
}
?>
不同格式的压缩注意事项
JPEG格式是有损压缩,调整质量参数会损失部分图片细节,适合处理照片类图片;PNG格式支持无损压缩,调整质量参数不会影响图片清晰度,适合处理图标、透明背景图片;GIF格式只支持256色,压缩时通常不需要调整质量参数,缩小尺寸是更有效的压缩方式。
常见问题说明
- 压缩质量不是越低越好,建议JPEG质量设置在60-80之间,既能大幅减小体积,也能保证基本清晰度。
- 压缩后的图片保存路径需要有写入权限,否则会出现保存失败的情况。
- 如果原始图片体积本身很小,压缩后可能不会明显减小体积,甚至可能出现体积变大的情况,此时可以跳过压缩步骤。
phpimage_compressionquality_adjustmentimage_save修改时间:2026-06-16 00:09:41