【问题标题】:How to compress images in CodeIgniter, yet do not change their dimensions?如何在 CodeIgniter 中压缩图像,但不改变它们的尺寸?
【发布时间】:2025-11-22 05:10:02
【问题描述】:

我有一个用户可以上传图片的网站。我直接处理这些图像并使用 CodeIgniter Image Manipulation 类将它们调整为 5 种其他格式。我这样做非常有效,如下所示:

  • 我总是从以前的格式而不是原来的格式调整大小
  • 我使用 90% 的图像质量调整大小,这大约是 jpeg 文件大小的一半

在我从另一个问题中得到建议后,我实施了上述做事方式。我的测试用例是 RGB 模式下的 1.6MB JPEG,分辨率为 3872 x 2592。对于该图像,这是一种边界情况,调整大小的过程总共需要大约 2 秒,这对我来说是可以接受的。

现在,只剩下一个挑战。我希望使用 90% 的质量压缩原始文件,但不调整其大小。这个想法是该文件也将占用文件大小的一半。我想我可以简单地将其调整为当前尺寸,但这似乎对文件或其大小没有任何影响。这是我的代码,有些简化:

$sourceimage = "test.jpg";
$resize_settings['image_library'] = 'gd2';
$resize_settings['source_image'] = $sourceimage;
$resize_settings['maintain_ratio'] = false;
$resize_settings['quality'] = '90%';
$this->load->library('image_lib', $resize_settings);

$resize_settings['width'] = $imagefile['width'];
$resize_settings['height'] = $imagefile['height'];
$resize_settings['new_image'] = $filename;
$this->image_lib->initialize($resize_settings);
$this->image_lib->resize();

上述代码适用于除原始格式之外的所有格式。我尝试调试 CI 类以查看为什么没有任何反应,我注意到脚本检测到尺寸没有改变。接下来,它只是简单地复制该文件而不对其进行处理。我评论了那段代码以强制它调整大小,但现在仍然没有任何反应。

有谁知道如何在不改变尺寸的情况下使用 CI 类将图像(任何图像,而不仅仅是 jpeg)压缩到 90%?

【问题讨论】:

    标签: php image codeigniter compression gd2


    【解决方案1】:

    我猜你可以这样做:

    $original_size = getimagesize('/path/to/original.jpg');
    

    然后像这样设置以下选项:

    $resize_settings['width'] = $original_size[0];
    $resize_settings['height'] = $original_size[1];
    

    好的,由于 CI 试图变得聪明,所以这不起作用,在我看来,你有三个可能的选择:

    • 将图像旋转 360º
    • 水印图像(带有 1x1 透明图像)
    • 自己动手

    DIY的方法真的很简单,我知道你不想使用“自定义”功能,但看看:

    ImageJPEG(ImageCreateFromString(file_get_contents('/path/to/original.jpg')), '/where/to/save/optimized.jpg', 90);
    

    如您所见,它甚至比使用 CI 更简单。


    PS:上面的 sn-p 可以打开任何类型的图像(GIF、PNG 和 JPEG),它总是将图像保存为 90% 质量的 JPEG,我相信这就是你想要的存档。

    【讨论】:

    • 感谢您的回复。嗯,这实际上是我已经在做的事情。 $imagefile 数组保存了我用来配置调整大小类的原始宽度和高度。
    • 哦,对不起。我直到最后才读到你的问题。几分钟后检查我的编辑。
    • 没问题,感谢您再次提供帮助。好吧,我做了一些测试。 GD2 不支持旋转,至少这是 CI 作为错误返回的。我可以通过切换到 imagemagick 来旋转,但这会增加文件大小而不是减小文件大小。我可以看到您的代码将如何易于使用,并且为此退出 CI 类没有问题,但我也需要一些适用于 GIF 和 PNG 的东西。
    • 我的代码 sn-p 适用于 GIF、PNG 和 JPEG 图像,试试吧!您需要做的就是更改文件扩展名。顺便说一句,CI 图像库真的很糟糕,旋转图像受 GD(捆绑)支持,检查php.net/manual/en/function.imagerotate.php
    • 您实际上无法压缩 GIF 图像,而 PNG 图像应始终压缩到*别 (9)。
    最近更新 更多