php GD库有的图片压缩后更大了?

$newImage = imagecreatetruecolor($newWidth, $newHeight);
$source = imagecreatefrompng($imagePath);
imagecopyresampled($newImage, $source, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
imagepng($newImage, $imagePath, 6);

php7 GD库,有的图片,为啥压缩后变大了 原图100k变300k,300k变700k
完整源码

namespace app\common\model;

use think\Model;

class Attachment extends Model
{
}
$attachment = new Attachment();
$attachment->data(array_filter($params));
$attachment->save();

\think\Hook::listen("upload_after", $attachment);
$this->miniImg($attachment);


public function miniImg($attachment, $maxWidth = 800, $maxHeight = 600, $aspectRatioThreshold = 2) {
        if (!stristr($attachment->mimetype, 'image')) {
            return;
        }

        $imagePath = ltrim($attachment->url, '/');
        if (!file_exists($imagePath)) {
            return;
        }

        $fileSize = filesize($imagePath);
        if ($fileSize < 300 * 1024) {
            return; // 如果文件小于300KB,则不处理
        }

        list($width, $height, $type) = getimagesize($imagePath);
        $newWidth = $width;![]
        $newHeight = $height;

        // 如果宽度或高度超过最大值,则进行特殊处理
        if ($width > $maxWidth || $height > $maxHeight) {
            $ratio = max($width / $maxWidth, $height / $maxHeight);
            $newWidth = ceil($width / $ratio);
            $newHeight = ceil($height / $ratio);

            if ($width / $height > $aspectRatioThreshold) {
                $newHeight = ceil($newWidth / $aspectRatioThreshold);
            } elseif ($height / $width > $aspectRatioThreshold) {
                $newWidth = ceil($newHeight * $aspectRatioThreshold);
            }
        }

        $newImage = imagecreatetruecolor($newWidth, $newHeight);
        switch ($type) {
            case IMAGETYPE_JPEG:
                $source = imagecreatefromjpeg($imagePath);
                break;
            case IMAGETYPE_PNG:
                $source = imagecreatefrompng($imagePath);
                break;
            case IMAGETYPE_GIF:
                $source = imagecreatefromgif($imagePath);
                break;
            case IMAGETYPE_WEBP:
                $source = imagecreatefromwebp($imagePath);
                break;
            default:
                return; // 不支持的图片类型
        }

        imagecopyresampled($newImage, $source, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
        switch ($type) {
            case IMAGETYPE_JPEG:
                imagejpeg($newImage, $imagePath, 60);
                break;
            case IMAGETYPE_PNG:
                imagepng($newImage, $imagePath, 6);
                break;
            case IMAGETYPE_GIF:
                imagegif($newImage, $imagePath);
                break;
            case IMAGETYPE_WEBP:
                imagewebp($newImage, $imagePath, 60);
                break;
        }

        imagedestroy($source);
        imagedestroy($newImage);
    }

大部分图片可以压缩

阅读 1k
avatarAI BotBETA

在PHP中使用GD库处理图片时,遇到压缩后图片大小反而变大的情况,通常与图片的保存格式和压缩质量设置有关。对于PNG图片,尤其容易出现这种情况,因为PNG是一种无损压缩格式,其压缩效果很大程度上依赖于图像内容的复杂度。

原因分析

  1. PNG的压缩特性:PNG图像使用无损压缩,这意味着在压缩过程中不会丢失任何图像数据。如果图像本身包含大量的颜色变化或复杂的纹理,那么即使是使用PNG格式保存,也可能需要较大的文件大小来保持图像质量。
  2. 压缩级别:在你的代码中,imagepng()函数的第三个参数设置了PNG图像的压缩级别。这个参数的范围是0(无压缩)到9(最大压缩)。然而,较高的压缩级别不一定会导致文件大小显著减小,特别是在图像内容复杂的情况下。
  3. 图像内容:某些图像,特别是那些包含大量细节、复杂颜色变化或透明区域的图像,即使尺寸减小,也可能因为压缩算法的局限性而导致最终文件大小仍然很大。

解决方案

  1. 调整PNG压缩级别:虽然这不一定能显著降低文件大小,但可以尝试不同的压缩级别来找到最佳平衡点。
  2. 考虑使用JPEG:如果图像质量允许一些损失,可以考虑将图像转换为JPEG格式。JPEG是一种有损压缩格式,可以显著减小文件大小,尤其是在图像包含大量平滑渐变或自然颜色过渡时。
  3. 优化图像内容:在将图像保存为PNG之前,考虑使用图像编辑软件(如Photoshop)来优化图像内容,例如去除不必要的图层、合并颜色相似的像素等。
  4. 检查并调整图像尺寸:确保在压缩前正确计算了图像的尺寸。如果新尺寸与原尺寸相差不大,那么压缩效果可能不明显。
  5. 使用其他库或工具:考虑使用更专业的图像处理库或工具,如ImageMagick,它提供了更多关于图像压缩和优化的选项。
  6. 服务器端设置:检查服务器上的PHP和GD库配置,确保它们是最新的,并且没有限制图像处理的性能。

示例代码调整

在你的代码中,你可以尝试将PNG的压缩级别设置为不同的值,看看是否对文件大小有影响。此外,如果可能的话,考虑将某些图像转换为JPEG格式。

// 尝试调整PNG的压缩级别
imagepng($newImage, $imagePath, 9); // 使用最大压缩级别

// 或者,如果适用,将图像保存为JPEG
if ($type == IMAGETYPE_PNG) {
    imagejpeg($newImage, $imagePath, 60); // 将PNG转换为JPEG并保存
}

请注意,将PNG转换为JPEG可能会导致图像质量的损失,因此请确保这在你的应用场景中是可接受的。

1 个回答
新手上路,请多包涵

PNG图片不要进行图片质量压缩,仅做长宽大小的处理,如果长宽缩小后png感觉还是大,可以转换成WEBP格式,WEBP的压缩率很高

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏