首頁 > php代码 > php有没有办法在压缩图片的同时保持其透明度?

php有没有办法在压缩图片的同时保持其透明度?

以下是一个修改后的 PHP 函数,它可以在压缩图片的同时保持其透明度(主要针对 PNG 图片):
```php
<?php
function compressImageWithTransparency($sourcePath, $maxWidth = 800, $maxHeight = 600, $quality = 80) {
    $imageInfo = getimagesize($sourcePath);
    $originalWidth = $imageInfo[0];
    $originalHeight = $imageInfo[1];
    $imageType = $imageInfo[2];
    $originalImage = null;

    switch ($imageType) {
        case IMAGETYPE_PNG:
            // 创建一个具有透明度支持的原始图像资源
            $originalImage = imagecreatefrompng($sourcePath);
            // 计算等比例缩放比例
            $ratio = min($maxWidth / $originalWidth, $maxHeight / $originalHeight);
            $newWidth = (int)($originalWidth * $ratio);
            $newHeight = (int)($originalHeight * $ratio);
            // 创建一个新的具有透明度支持的图像资源
            $newImage = imagecreatetruecolor($newWidth, $newHeight);
            // 保留透明度
            imagesavealpha($newImage, true);
            $transparency = imagecolorallocatealpha($newImage, 0, 0, 0, 127);
            imagefill($newImage, 0, 0, $transparency);
            // 进行图像重采样
            imagecopyresampled($newImage, $originalImage, 0, 0, 0, 0, $newWidth, $newHeight, $originalWidth, $originalHeight);
            // 将新图像保存到原路径
            imagepng($newImage, $sourcePath, 9);
            break;
        case IMAGETYPE_JPEG:
            // 对于 JPEG 图片,不支持透明度,按照普通压缩处理
            $originalImage = imagecreatefromjpeg($sourcePath);
            $ratio = min($maxWidth / $originalWidth, $maxHeight / $originalHeight);
            $newWidth = (int)($originalWidth * $ratio);
            $newHeight = (int)($originalHeight * $ratio);
            $newImage = imagecreatetruecolor($newWidth, $newHeight);
            imagecopyresampled($newImage, $originalImage, 0, 0, 0, 0, $newWidth, $newHeight, $originalWidth, $originalHeight);
            imagejpeg($newImage, $sourcePath, $quality);
            break;
        case IMAGETYPE_GIF:
            // 对于 GIF 图片,暂时不进行特殊处理,因为其压缩比较复杂
            $originalImage = imagecreatefromgif($sourcePath);
            imagegif($originalImage, $sourcePath);
            break;
        default:
            throw new Exception('Unsupported image type.');
    }

    if ($originalImage) {
        imagedestroy($originalImage);
    }
    if ($newImage) {
        imagedestroy($newImage);
    }
}

// 调用示例,将 'path/to/your/image.png' 替换为实际的图片路径
try {
    compressImageWithTransparency('path/to/your/image.png');
} catch (Exception $e) {
    echo $e->getMessage();
}
?>
```
**代码解释**:
- `compressImageWithTransparency` 函数接收四个参数:
    - `$sourcePath`:源图片的完整路径。
    - `$maxWidth`:压缩后图片的最大宽度,默认为 800 像素。
    - `$maxHeight`:压缩后图片的最大高度,默认为 600 像素。
    - `$quality`:对于 JPEG 图片,设置图片质量,范围从 0(低质量)到 100(高质量),默认为 80。
- 首先,使用 `getimagesize` 函数获取图片的信息,包括原始宽度、高度和类型。
- 对于不同类型的图片有不同的处理:
    - **PNG 图片**:
        - 使用 `imagecreatefrompng` 创建原始图像资源。
        - 计算等比例缩放比例并创建新的图像资源。
        - `imagesavealpha($newImage, true)` 确保新图像保留透明度。
        - `imagecolorallocatealpha($newImage, 0, 0, 0, 127)` 为新图像分配一个完全透明的颜色。
        - `imagefill($newImage, 0, 0, $transparency)` 填充新图像背景为透明。
        - 使用 `imagecopyresampled` 进行图像重采样,将原始图像复制到新图像并进行缩放。
        - 使用 `imagepng($newImage, $sourcePath, 9)` 将新图像保存到原路径,这里压缩级别设置为 9,这是较高的无损压缩级别。
    - **JPEG 图片**:
        - JPEG 不支持透明度,所以按照普通的压缩处理。使用 `imagecreatefromjpeg` 创建原始图像资源,计算等比例缩放比例,创建新图像资源,使用 `imagecopyresampled` 进行图像重采样,最后使用 `imagejpeg` 保存并设置压缩质量。
    - **GIF 图片**:
        - 暂时不进行特殊处理,因为 GIF 的压缩比较复杂,直接使用 `imagecreatefromgif` 创建原始图像资源并使用 `imagegif` 保存。
- 最后,使用 `imagedestroy` 函数释放创建的图像资源,释放内存。


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


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

这个函数会根据图片的类型进行不同的处理,对于 PNG 图片,重点关注了在压缩过程中保持透明度,而对于 JPEG 图片则按照常规的压缩方法,对于 GIF 图片则暂时不进行复杂的压缩处理。

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