当前位置: 首页 > 知识库问答 >
问题:

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

闾丘京
2024-09-05
$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);
    }

大部分图片可以压缩

共有1个答案

郜俊健
2024-09-05

在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可能会导致图像质量的损失,因此请确保这在你的应用场景中是可接受的。

 类似资料:
  • compressImage 压缩图片接口(安卓10.0.12版本支持,ios 10.0.15版本支持) 使用方法 AlipayJSBridge.call('compressImage', { apFilePaths: ["https://resource/apmlcc0ed184daffc5a0d8da86b2f518cf7b.image"], compressLevel: 4 }, f

  • 本文向大家介绍Android图片压缩(质量压缩和尺寸压缩),包括了Android图片压缩(质量压缩和尺寸压缩)的使用技巧和注意事项,需要的朋友参考一下 在网上调查了图片压缩的方法并实装后,大致上可以认为有两类压缩:质量压缩(不改变图片的尺寸)和尺寸压缩(相当于是像素上的压缩);质量压缩一般可用于上传大图前的处理,这样就可以节省一定的流量,毕竟现在的手机拍照都能达到3M左右了,尺寸压缩一般可用于生成

  • 请务必理解如下章节后阅读此章节: 安装 Node 和 gulp 使用 gulp 压缩 JS 访问论坛获取帮助 压缩 图片文件可降低文件大小,提高图片加载速度。 找到规律转换为 gulp 代码 规律 找到 images/ 目录下的所有文件,压缩它们,将压缩后的文件存放在 dist/images/ 目录下。 gulp 代码 你可以 下载所有示例代码 或 在线查看代码 一、安装 gulp-imagemi

  • 本文向大家介绍C#无损压缩图片,包括了C#无损压缩图片的使用技巧和注意事项,需要的朋友参考一下 话不多说,请看代码: 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持呐喊教程!

  • browser-image-compression 浏览器端需要压缩图片,用browser-image-compression,发现图片质量下降,请问这个库会损坏图片质量吗? 类似tinypng的库有吗

  • 本文向大家介绍java图片压缩工具类,包括了java图片压缩工具类的使用技巧和注意事项,需要的朋友参考一下 直接上java图片压缩code: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍JNI方法实现图片压缩(压缩率极高),包括了JNI方法实现图片压缩(压缩率极高)的使用技巧和注意事项,需要的朋友参考一下 前言 直接使用项目或直接复制libs中的so库到项目中即可(当前只构建了armeabi),需要其他ABI可检下项目另外使用CMake构建即可。 结果预览: 效果图.png   jni_278KB.png quality_484KB.png sample_199KB

  • 本文向大家介绍android 将图片压缩到指定的大小的示例,包括了android 将图片压缩到指定的大小的示例的使用技巧和注意事项,需要的朋友参考一下 从网上收集后自己写的一个方法; 1.首先是一个根据分辨率压缩的类,首先对图片进行一次压缩 2.第二就是循环对图片的压缩,直到压缩到指定的大小以下为止(重要!) 在这其中  这个方法用来动态设置每次压缩的比例,主要用于提升压缩的时间,这其中的数值是我