如何根据文件大小限制确定png维度?

时间:2012-06-14 14:51:09

标签: image-processing compression png

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

由于颜色深度,alpha通道等有很多变量......是否有可能知道这一点?或者甚至接近?

4 个答案:

答案 0 :(得分:4)

有可能,但它可能没用。 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字节的文件大小的函数:< / p>

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

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

答案 1 :(得分:1)

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

假设压缩对于最坏情况的情况完全无效,每个像素将存储8个字节的数据,每个R,G,B和B的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

答案 2 :(得分:0)

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

如果您想为用户提供尺寸,则应更改商务逻辑,以便根据尺寸而不是文件大小接受图片。

答案 3 :(得分:0)

假设PNG文件未压缩,您可以预测PNG文件的最大值。乘以宽*高* 3并为标头开销添加一点。

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

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

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

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

例如,如果a为1.5且r为0.5,则您的尺寸为500 x 333。