如果应用程序的业务逻辑表明 24 位 PNG 永远不会超过 250KB,是否可以预测图像的最大宽度和高度仍然符合 250KB 的要求?
由于颜色深度、alpha 通道等有很多变量......有可能知道这一点吗?或者更接近?
如果应用程序的业务逻辑表明 24 位 PNG 永远不会超过 250KB,是否可以预测图像的最大宽度和高度仍然符合 250KB 的要求?
由于颜色深度、alpha 通道等有很多变量......有可能知道这一点吗?或者更接近?
这是可能的,但它可能没有用。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 像素。
在处理了同样的问题后,我创建了一个可行的解决方案。
假设压缩在最坏的情况下完全无效,每个像素将存储 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
这是不可能的,如果您将一个巨大的空白文件保存为 png,由于 png 压缩,它的大小会非常小。
如果您想为您的用户提供尺寸,您应该更改您的业务逻辑以接受基于其尺寸而不是文件大小的图像。
您可以通过假设 PNG 文件未压缩来预测它的最大值。乘以 width*height*3 并添加一些标题开销。
为了做得更好,请为您的应用程序测量大量典型的 PNG 文件,并找到实际文件大小与上述预测的比率最大的那个。使用此比率或稍大的数字来估计任何其他图像的大小。
这仍然不能保证结果足够小,您只能通过实际尝试写出编码图像来确定。然而,除了最退化的情况外,它应该足够好。
编辑:如果不清楚,您可以向后工作并从最大文件大小获取图像尺寸。假设w
和h
是最大可接受的宽度和高度,a
是 的纵横比w/h
,r
是 上面发现的文件大小/图像大小的比率:
w = sqrt((250K * a) / (r * 3))
h = w / a
例如,如果a
是 1.5 和r
0.5,那么您的尺寸将为 500 x 333。