Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 如何根据文件大小限制确定png尺寸?_Image Processing_Compression_Png - Fatal编程技术网

Image processing 如何根据文件大小限制确定png尺寸?

Image processing 如何根据文件大小限制确定png尺寸?,image-processing,compression,png,Image Processing,Compression,Png,如果一个应用程序的业务逻辑表明24位PNG永远不能超过250KB,那么有可能预测图像的最大宽度和高度,并且在250KB的要求下仍然适合吗 因为有很多与颜色深度、alpha通道等有关的变量。。。有可能知道这一点吗?或者更接近?这是不可能的,如果您将一个巨大的空白文件保存为png,由于png压缩,它的大小将非常小 如果您想向用户提供尺寸,您应该更改业务逻辑,根据图像尺寸而不是文件大小来接受图像。您可以通过假设PNG文件未压缩来预测其最大尺寸。将宽度*高度*3相乘,并为标题开销添加一位 为了获得更好的

如果一个应用程序的业务逻辑表明24位PNG永远不能超过250KB,那么有可能预测图像的最大宽度和高度,并且在250KB的要求下仍然适合吗


因为有很多与颜色深度、alpha通道等有关的变量。。。有可能知道这一点吗?或者更接近?

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


如果您想向用户提供尺寸,您应该更改业务逻辑,根据图像尺寸而不是文件大小来接受图像。

您可以通过假设PNG文件未压缩来预测其最大尺寸。将宽度*高度*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。

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

请注意,这里的另一个答案莫名其妙地假设最小压缩,即给出最小像素数,例如500 x 333。因为这个问题问的是“图像的最大宽度和高度”,所以这个答案没有用。显然,10000 x 10000大于500 x 333

更新:

基于最小PNG文件的精确计算会导致最大24位像素数(压缩数据中存储的每个像素三个字节),这是文件大小
n
字节的函数:

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

对于250*1024=256000字节,我们得到88037427像素。对于正方形图像,大约是9383 x 9383像素。

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

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

在做了这些简单的计算之后,我用斑驳的多色照片做了很多实验,我从来没有得到过超过三分之一的大小,每10k像素大约30kb

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

这个png规范是我做出假设的依据:

您可能还想看看维基百科的文章:

虽然您可能会找到一个最大大小,但我认为这并不实用,因为如果您将一个非常大的实体图像(例如全部空白)压缩为PNG,则会产生一个非常小的PNG文件。正确,这是不可能的。你必须将图像写成PNG格式,测量它的大小,然后才能确定。问题不是给定图像的最大PNG文件。问题是给定PNG文件大小的最大图像。@MarkAdler,一旦你知道两者之间的关系,就很容易颠倒方程。不,因为它们是两种完全不同的关系。你的回答是对错误问题的正确回答。对于实际提出的问题,扭转这种关系是完全错误的答案。要得到错误的答案,必须假设压缩量最小。为了得到正确问题的正确答案,您必须假设最大压缩量。@MarkAdler,如果您不能准确计算结果,则必须进行估计。如果有硬限制,你必须保守估计。我的方向是找到压缩效果最差的图像,并以此作为指导。使用最大压缩量将是一个错误。哇,好的。我放弃了。阅读问题。几乎10公里乘10公里并不太可笑,看看能解决这个问题的答案。