3

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

由于颜色深度、alpha 通道等有很多变量......有可能知道这一点吗?或者更接近?

4

4 回答 4

5

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

请注意,这里的另一个答案莫名其妙地假设了最小压缩,它给出了最小数量的像素,例如 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 像素。

于 2012-06-15T19:25:24.273 回答
1

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

假设压缩在最坏的情况下完全无效,每个像素将存储 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

于 2013-12-15T00:30:27.653 回答
0

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

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

于 2012-06-14T15:07:27.027 回答
0

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

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

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

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

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

例如,如果a是 1.5 和r0.5,那么您的尺寸将为 500 x 333。

于 2012-06-14T15:19:37.573 回答