【问题标题】:How to determine png dimensions based on file size limit?如何根据文件大小限制确定 png 尺寸?
【发布时间】:2012-06-17 15:22:34
【问题描述】:

如果应用的业务逻辑表明 24 位 PNG 永远不能超过 250KB,是否可以预测图像的最大宽度和高度仍然符合 250KB 的要求?

由于颜色深度、Alpha 通道等有很多变量……是否有可能知道这一点?或者更接近?

【问题讨论】:

  • 虽然你可能会找到一个最大尺寸,但我认为如果你将一个非常大的实心图像(例如全空白)压缩为 PNG 会产生一个非常小的 png 文件,这并不实用.
  • 正确,这是不可能的。你必须将图像写成 PNG,测量它的大小,然后你才能确定。

标签: image-processing compression png


【解决方案1】:

这是可能的,但它可能没用。 PNG的zlib压缩最大压缩比为1032:1(对于相同字节值的长序列)。所以 250 KB 压缩(忽略包装器和诸如此类)大约 250 MB 未压缩。对于方形图像,这几乎是 10,000 x 10,000 像素,每个像素三个字节。

请注意,这里的另一个答案莫名其妙地假设 minimum 压缩,它给出了 minimum 像素数,例如500 x 333。由于问题要求“图像可能的最大宽度和高度”,因此该答案没有用。显然 10,000 x 10,000 大于 500 x 333。

更新:

基于最小 PNG 文件的精确计算会得出最大 24 位像素数(压缩数据中存储的每个像素三个字节)作为 n 字节文件大小的函数:

floor(((n - 77) * 8 - 1) / 2) * 86 + 1

所以对于 250*1024 = 256,000 字节,我们得到 88,037,427 像素。对于方形图像,大约为 9383 x 9383 像素。

【讨论】:

    【解决方案2】:

    在处理了同样的问题后,我创建了一个可行的解决方案。

    假设压缩在最坏的情况下完全无效,每个像素将存储 8 个字节的数据,每个 R、G、B 和 A 2 个字节。因此 100x100 像素的图像最大大小为 80,000 字节,加上一些可忽略的元数据。

    在进行了这些简单的计算之后,我对斑驳的多色照片进行了多次实验,但我从未得到超过该尺寸的三分之一,即每 10k 像素大约 30kb。

    有了这些知识,我编写了一个递归函数,将输入 png 缩小 10% 直到大小低于限制,并在生成的图像中保留正确的尺寸,然后在目标对象上恢复它。这导致了最好的质量,尽管可变的质量,正确的大小,并且 CPU 上的额外负载可以忽略不计(因为实际上从未发生过缩减)。

    这个 png 规范是我做出假设的依据: http://www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html

    您可能还想看看维基百科的文章: https://en.wikipedia.org/wiki/Portable_Network_Graphics

    【讨论】:

      【解决方案3】:

      这是不可能的,如果你将一个巨大的空白文件保存为 png,它的大小会非常小,因为 png 压缩。

      如果您想为您的用户提供尺寸,您应该更改您的业务逻辑以接受基于其尺寸而不是文件大小的图像。

      【讨论】:

      • 几乎 10k x 10k 并不算太荒谬,请参阅解决此问题的答案。
      【解决方案4】:

      您可以通过假设 PNG 文件未压缩来预测它的最大大小。乘以 width*height*3 并添加一点标题开销。

      为了做得更好,请为您的应用程序测量大量典型的 PNG 文件,并找到实际文件大小与上述预测值之比最大的文件。使用此比率或稍大的数字来估计任何其他图像的大小。

      这仍然不能保证结果足够小,您只能通过实际尝试写出编码图像来确定。然而,除了最退化的情况外,它应该足够好。

      编辑:如果不清楚,您可以向后工作并从最大文件大小获取图像尺寸。假设wh 是可接受的最大宽度和高度,aw/h 的纵横比,r 是上面发现的文件大小/图像大小的比率:

      w = sqrt((250K * a) / (r * 3))
      h = w / a
      

      例如,如果 a 是 1.5,r 是 0.5,那么您的尺寸将为 500 x 333。

      【讨论】:

      • 问题不是给定图像的最大 PNG 文件。问题是给定 PNG 文件大小的最大图像。
      • @MarkAdler,一旦你知道了两者之间的关系,就可以轻松扭转等式了。
      • 不,因为它们是两种完全不同的关系。您的答案是解决错误问题的正确方法。颠倒这种关系对于实际提出的问题来说是完全错误的答案。为了得到你完全错误的答案,你必须假设最小的压缩量。要获得正确问题的正确答案,您必须假设最大压缩量。
      • @MarkAdler,如果你不能准确计算结果,那么你必须估计。如果有硬限制,您必须保守估计。我的方向是找到压缩最差的图像并将其用作指导。使用最大压缩量是错误的。
      • 哇,好的。我放弃。阅读问题。
      猜你喜欢
      • 2020-01-24
      • 2010-11-21
      • 2023-04-11
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 2020-08-31
      • 2011-08-18
      • 1970-01-01
      相关资源
      最近更新 更多