首頁 > php代码 > php 写一个图片压缩的方法,要求可以设置指定大小,要是不设置大小,那么就按图片大小等比例压缩

php 写一个图片压缩的方法,要求可以设置指定大小,要是不设置大小,那么就按图片大小等比例压缩

以下是一个 PHP 图片压缩方法,它允许你设置指定大小,如果不设置大小,就按图片大小等比例压缩:
```php
<?php
function compressImage($sourcePath, $targetWidth = null, $targetHeight = null, $quality = 80) {
    // 获取原始图片信息
    $imageInfo = getimagesize($sourcePath);
    $originalWidth = $imageInfo[0];
    $originalHeight = $imageInfo[1];
    $imageType = $imageInfo[2];
    $originalImage = null;

    switch ($imageType) {
        case IMAGETYPE_JPEG:
            $originalImage = imagecreatefromjpeg($sourcePath);
            break;
        case IMAGETYPE_PNG:
            $originalImage = imagecreatefrompng($sourcePath);
            break;
        case IMAGETYPE_GIF:
            $originalImage = imagecreatefromgif($sourcePath);
            break;
        default:
            throw new Exception('Unsupported image type.');
    }

    // 如果未指定目标宽度和高度,则进行等比例压缩
    if ($targetWidth === null && $targetHeight === null) {
        // 设置最大宽度和高度,可以根据需要调整
        $maxWidth = 800;
        $maxHeight = 600;
        $ratio = min($maxWidth / $originalWidth, $maxHeight / $originalHeight);
        $targetWidth = (int)($originalWidth * $ratio);
        $targetHeight = (int)($originalHeight * $ratio);
    }

    // 创建新的图像资源
    $newImage = imagecreatetruecolor($targetWidth, $targetHeight);

    // 保留透明度(仅适用于 PNG)
    if ($imageType === IMAGETYPE_PNG) {
        imagesavealpha($newImage, true);
        $transparency = imagecolorallocatealpha($newImage, 0, 0, 0, 127);
        imagefill($newImage, 0, 0, $transparency);
    }

    // 进行图像重采样
    imagecopyresampled($newImage, $originalImage, 0, 0, 0, 0, $targetWidth, $targetHeight, $originalWidth, $originalHeight);

    // 将新图像保存到原路径,根据不同的图片类型保存
    switch ($imageType) {
        case IMAGETYPE_JPEG:
            imagejpeg($newImage, $sourcePath, $quality);
            break;
        case IMAGETYPE_PNG:
            imagepng($newImage, $sourcePath);
            break;
        case IMAGETYPE_GIF:
            imagegif($newImage, $sourcePath);
            break;
    }

    // 释放图片资源
    imagedestroy($originalImage);
    imagedestroy($newImage);
}

// 调用示例,将 'path/to/your/image.jpg' 替换为实际的图片路径
try {
    // 压缩图片并设置指定大小
    // compressImage('path/to/your/image.jpg', 400, 300);
    // 按默认的等比例压缩
    compressImage('path/to/your/image.jpg');
} catch (Exception $e) {
    echo $e->getMessage();
}
?>
```
**代码解释**:
- `compressImage` 函数接收四个参数:
    - `$sourcePath`:源图片的完整路径。
    - `$targetWidth`:目标压缩后的宽度,默认为 `null`。
    - `$targetHeight`:目标压缩后的高度,默认为 `null`。
    - `$quality`:对于 JPEG 图片,设置图片质量,范围从 0(低质量)到 100(高质量),默认为 80。
- 首先,使用 `getimagesize` 函数获取原始图片的信息,包括宽度、高度和类型。
- 根据图片类型使用相应的函数(`imagecreatefromjpeg`、`imagecreatefrompng` 或 `imagecreatefromgif`)创建原始图像资源。
- 如果 `$targetWidth` 和 `$targetHeight` 都为 `null`,则进行等比例压缩:
    - 设置默认的最大宽度和高度(这里是 800 和 600,可以根据需要修改)。
    - 计算等比例缩放的比例并计算新的宽度和高度。
- 创建一个新的图像资源 `$newImage`,使用 `imagecreatetruecolor` 函数创建指定宽度和高度的资源。
- 对于 PNG 图片,使用 `imagesavealpha` 函数保存透明度,使用 `imagecolorallocatealpha` 函数分配一个透明颜色并使用 `imagefill` 函数填充背景为透明。
- 使用 `imagecopyresampled` 函数将原始图像复制到新图像中并进行重采样。
- 根据图片类型使用相应的函数(`imagejpeg`、`imagepng` 或 `imagegif`)将新图像保存到原路径。
- 最后,使用 `imagedestroy` 函数释放原始图像资源和新创建的图像资源。


**使用说明**:
1. 将上述代码保存为一个 PHP 文件,例如 `compress_image.php`。
2. 把 `path/to/your/image.jpg` 替换为你想要压缩的实际图片的完整路径。
3. 在服务器上运行这个 PHP 文件,确保 PHP 的 `GD` 扩展已启用,因为代码中使用的 `imagecreatefromjpeg`、`imagecreatefrompng`、`imagecreatefromgif` 等函数是 `GD` 扩展提供的。
4. 运行文件后,如果出现异常,会输出相应的错误信息,如不支持的图片类型等。


请确保在运行代码前,服务器上的 PHP 环境已正确安装并启用 `GD` 扩展。如果没有启用,可以在 `php.ini` 文件中找到 `extension=gd` 这一行,并确保其未被注释掉(即去掉行首的 `;`),然后重启服务器。


你可以通过调用 `compressImage('path/to/your/image.jpg', 400, 300)` 来设置具体的压缩尺寸,也可以只调用 `compressImage('path/to/your/image.jpg')` 进行默认的等比例压缩。

相关资讯
最新资讯
IT兄弟 IT兄弟-是一家分享开发中常遇到的技术问题解决方案,也是站长们记录技术分享文章的平台。 琼ICP备2022012332号