如何在CodeIgniter中压缩图像,但不改变其尺寸?

4
我有一个网站,用户可以上传图片。我使用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%而不改变尺寸吗?

1个回答

2
我猜你可以这样做:

我猜你可以这样做:

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

然后按照以下方式设置选项:

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

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

  • 将图像旋转360º
  • 给图像添加水印(使用1x1透明图像)
  • 自己动手

自己动手的方法非常简单,我知道你不想使用“自定义”函数,但看一下:

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

如您所见,这比使用CI更加简单。


附注:上面的代码片段可以打开任何类型的图像(GIF,PNG和JPEG),并始终将图像保存为JPEG格式,质量为90%。我相信这就是您想要实现的目标。


1
哦,对不起。我没有读完你的问题。请等几分钟,我会修改我的回答。 - Alix Axel
2
我的代码片段适用于GIF、PNG和JPEG图像,试试吧!你只需要更改文件扩展名。顺便说一句,CI图像库真的很糟糕,旋转图像是GD(捆绑)支持的,请查看http://php.net/manual/en/function.imagerotate.php。 - Alix Axel
1
实际上无法压缩 GIF 图像,PNG 图像应始终以最高级别(9)进行压缩。 - Alix Axel
仔细想了一下,如果使用“ImageInterlace”函数,它可以再压缩一些,但这将使图像与Adobe Flash不兼容。 - Alix Axel
我按照你的$original_size变量进行了操作,但是我得到的图像没有任何改变..? - pratik deshai
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接