本文目录导读:

我来详细介绍PHP中图片优化的几种主要方法:
使用GD库进行基础优化
// 压缩JPEG图片
function optimizeJPEG($source, $destination, $quality = 75) {
$image = imagecreatefromjpeg($source);
imagejpeg($image, $destination, $quality);
imagedestroy($image);
}
// 压缩PNG图片
function optimizePNG($source, $destination, $quality = 6) {
$image = imagecreatefrompng($source);
imagepng($image, $destination, $quality);
imagedestroy($image);
}
使用Imagick扩展(更强大的处理能力)
function optimizeWithImagick($source, $destination, $quality = 75) {
$image = new Imagick($source);
// 设置压缩质量
$image->setImageCompression(Imagick::COMPRESSION_JPEG);
$image->setImageCompressionQuality($quality);
// 调整大小(可选)
$image->resizeImage(800, 600, Imagick::FILTER_LANCZOS, 1);
// 保存
$image->writeImage($destination);
$image->destroy();
}
智能尺寸调整
function smartResize($source, $destination, $maxWidth = 1200, $maxHeight = 1200) {
list($width, $height) = getimagesize($source);
// 计算缩放比例
$ratio = min($maxWidth / $width, $maxHeight / $height);
if ($ratio < 1) {
$newWidth = $width * $ratio;
$newHeight = $height * $ratio;
$image = imagecreatefromjpeg($source);
$newImage = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($newImage, $image, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
imagejpeg($newImage, $destination, 85);
imagedestroy($image);
imagedestroy($newImage);
}
}
WebP格式转换(推荐)
function convertToWebP($source, $destination, $quality = 80) {
$info = getimagesize($source);
switch ($info['mime']) {
case 'image/jpeg':
$image = imagecreatefromjpeg($source);
break;
case 'image/png':
$image = imagecreatefrompng($source);
break;
case 'image/gif':
$image = imagecreatefromgif($source);
break;
}
imagewebp($image, $destination, $quality);
imagedestroy($image);
}
自动转换并优化
class ImageOptimizer {
public function optimize($source, $options = []) {
$defaults = [
'max_width' => 1200,
'max_height' => 1200,
'quality' => 80,
'format' => 'webp' // 可选: webp, jpg, png
];
$options = array_merge($defaults, $options);
$info = getimagesize($source);
// 加载图片
$image = $this->loadImage($source, $info['mime']);
// 调整尺寸
$image = $this->resizeImage($image, $options['max_width'], $options['max_height']);
// 保存为指定格式
$this->saveImage($image, $source, $options);
imagedestroy($image);
}
private function loadImage($source, $mime) {
switch ($mime) {
case 'image/jpeg':
return imagecreatefromjpeg($source);
case 'image/png':
return imagecreatefrompng($source);
case 'image/gif':
return imagecreatefromgif($source);
default:
throw new Exception('Unsupported image format');
}
}
private function resizeImage($image, $maxWidth, $maxHeight) {
$width = imagesx($image);
$height = imagesy($image);
$ratio = min($maxWidth / $width, $maxHeight / $height);
if ($ratio < 1) {
$newWidth = $width * $ratio;
$newHeight = $height * $ratio;
$newImage = imagecreatetruecolor($newWidth, $newHeight);
imagecopyresampled($newImage, $image, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
return $newImage;
}
return $image;
}
private function saveImage($image, $destination, $options) {
switch ($options['format']) {
case 'webp':
imagewebp($image, $destination, $options['quality']);
break;
case 'jpg':
case 'jpeg':
imagejpeg($image, $destination, $options['quality']);
break;
case 'png':
// PNG质量范围为0-9
$pngQuality = max(0, min(9, (int)((100 - $options['quality']) / 11)));
imagepng($image, $destination, $pngQuality);
break;
}
}
}
// 使用示例
$optimizer = new ImageOptimizer();
$optimizer->optimize('original.jpg', [
'max_width' => 800,
'max_height' => 600,
'quality' => 75,
'format' => 'webp'
]);
批量优化目录
function batchOptimize($sourceDir, $destDir, $options = []) {
if (!is_dir($destDir)) {
mkdir($destDir, 0755, true);
}
$files = glob($sourceDir . '/*.{jpg,jpeg,png,gif}', GLOB_BRACE);
$optimizer = new ImageOptimizer();
foreach ($files as $file) {
$filename = pathinfo($file, PATHINFO_FILENAME);
$destination = $destDir . '/' . $filename . '.webp';
$optimizer->optimize($file, array_merge($options, [
'destination' => $destination
]));
}
}
性能优化建议
// 1. 缓存处理后的图片
function getOptimizedImage($source) {
$cacheDir = '/path/to/cache/';
$cacheFile = $cacheDir . md5($source) . '.webp';
if (file_exists($cacheFile) && filemtime($cacheFile) > filemtime($source)) {
return $cacheFile; // 直接返回缓存的图片
}
// 重新优化
$optimizer = new ImageOptimizer();
$optimizer->optimize($source, [
'destination' => $cacheFile
]);
return $cacheFile;
}
// 2. 使用CDN分发
// 3. 实现懒加载
// 4. 使用渐进式JPEG
第三方库推荐
# 1. Imagine(强大的图像处理库) composer require imagine/imagine # 2. Intervention Image(Laravel常用) composer require intervention/image # 3. Spatie Image Optimizer(使用外部工具优化) composer require spatie/image-optimizer
最佳实践建议
-
选择合适的格式
- 照片:JPEG/WebP
- 图标/标志:PNG/SVG
- 动画:GIF/WebP
-
合理的质量设置
- 缩略图:60-70%
- 正常显示:75-85%
- 高质量:90%+
-
响应式图片
<img src="small.jpg" srcset="medium.jpg 768w, large.jpg 1200w" sizes="(max-width: 768px) 100vw, 50vw" alt="Description">
-
使用图片CDN(如Cloudinary, ImageKit)
这些方法可以根据具体需求组合使用,以达到最佳的优化效果。