【问题标题】:PHP Reducing Image Quality until filesize is upto say 1mbPHP降低图像质量直到文件大小达到1mb
【发布时间】:2012-10-26 10:25:06
【问题描述】:

我正在处理我的一个项目,用户将在其中上传图片。上传的图像将使用灯箱显示。

问题是用户可能会上传大小为 5mb 的图像等等。因此,它需要大量的加载时间。所以我想降低图像质量,保持尺寸不变。

我知道我们可以使用 imagejpeg() 函数,并传递第三个参数,即质量 90,这也可以减小文件大小。

我需要所有图像文件大小最大为 1mb,不超过 1mb。

所以,我很困惑应该将什么值作为质量传递,以便获得最佳质量。

例如。如果上传的图像文件大小是 1.2mb,那么说我将通过 90 作为质量,这可能会将大小降低到 1mb 以下,并且质量也可以接受。另一种情况,如果上传的文件大小是 5mb,而不是我通过 90 作为质量,那么文件大小可能不小于 1mb。在这里我需要传递较少的质量值(我猜)。

那么有什么方法可以帮助我确定应该传递的最佳质量参数。

非常感谢您的宝贵时间。

【问题讨论】:

  • 最常见的情况是改变图像质量以降低文件大小,并结合某种比例来帮助它。例如,如果图像是 12000X12000 像素,则仅降低 5mb 图像的图像质量可能还不够。最好的办法是设置压缩所有图像的质量级别,然后缩小超过一定大小的图像 - 这将为您提供最一致的结果。
  • 首先感谢您的快速回复。缩小图像也会改变它的尺寸。我不想那样。我必须保持图像的尺寸。
  • 不用担心。好吧,这实际上是您可以做的唯一两件事来影响文件大小 - 如果您不准备缩小图像,那么我会考虑在您的服务器上设置压缩或者使用 CDN 来传递图像,但是我认为如果你也不能缩放图像,你将不得不接受没有好的解决方案。
  • 谢谢 jammypeach,我会尝试你的方法来缩放图像。

标签: php image gd


【解决方案1】:

不久前,我花了很长时间来处理同样的事情。首先,我发现 PNG 和 JPG 格式在猜测结果时非常尴尬。 JPG照片一般不会很好地转换成PNG,但是矢量jpg图像会,矢量png一般不能很好地转换成JPG,但是照片会。您会发现很难确保图像小于 1mb,尤其是如果您不调整它们的大小。如果你不调整它们的大小,你也会遇到更多的麻烦——图像越大,质量就会越来越低(有点讽刺)。

您需要每个图像的几个版本。让我解释一下。

  1. 您希望保留原始图像,因此您可以在以后随时根据原始图像刷新图像,以提高图像质量,甚至获得一些新的尺寸。

  2. 将原始图像与灯箱一起使用通常不是一个好主意。您最好调整它的大小以适应 1024 x 1024 的大小。这足以满足大多数人的需求,并且通常会提供合理的文件大小。然后,如果您愿意,您可以提供要下载的原件。当图像需要很长时间才能加载时,使用尽可能大的文件通常会导致不满意的访问者,甚至可能会在一段时间后通过带宽使用使他们付出很多代价(出于同样的原因)。

我能想到的唯一方法是按照您的要求创建一些糟糕的代码性能,循环通过,逐渐降低质量并检查生成的图像大小。一旦找到低于 1mb 的图像大小,它就会退出循环并使用该质量设置。不过,我真的建议不要这样做。

附:在这个答案的范围之外,我在 cmets 中提到了我使用的解决方案的方法。

【讨论】:

  • 谢谢VBAssassin,我会去的。
  • 很好的答案,绝对存储每个用例的原始文件和比例。这就是 wordpress 如何处理图片上传 IIRC
  • 你知道,我决定创建一个 php 守护进程来处理队列中的图像大小调整(守护进程一次可以处理 1 个图像,防止并发用户请求上传导致内存使用量激增图片)。您可能还想检查图像是否可以加载到内存中(我在某处写了一个函数,但不知道我把它放在哪里,您必须在操作之前对尺寸和颜色深度等进行一些数学运算)。如果您不检查,它可能会使您的服务器因大量内存使用而崩溃。此外,尝试使用基于文件的调整大小的图像“缓存”。完美运行:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 2019-08-23
相关资源
最近更新 更多