Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.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
Compression 根据分辨率的最大PNG大小_Compression_Png - Fatal编程技术网

Compression 根据分辨率的最大PNG大小

Compression 根据分辨率的最大PNG大小,compression,png,Compression,Png,有没有一种方法可以计算出用PNG压缩的任何图像的最大大小 我需要知道,例如,分辨率为350x350(px)的PNG不能大于“X”KB。(对于恒定质量的压缩,如90) “X”值就是我要找的值。或者用数学表达 350px * 350px * (90q) < X KB 350px*350px*(90q)

有没有一种方法可以计算出用PNG压缩的任何图像的最大大小

我需要知道,例如,分辨率为350x350(px)的PNG不能大于“X”KB。(对于恒定质量的压缩,如90)

“X”值就是我要找的值。或者用数学表达

350px *  350px * (90q) < X KB
350px*350px*(90q)
我不太熟悉PNG压缩算法,但对于特定的分辨率可能有一个最大值


注意:在这种情况下,PNG没有alpha。

在最大情况下,数据是不可压缩的(例如,如果图像大小为1x1,或者如果图像较大,但包含随机不可压缩数据)。所以最大尺寸是

8 // PNG signature bytes
+ 25 // IHDR chunk
+ 12 // IDAT chunk (assuming only one IDAT chunk)
+ height //pixels
  * ( 1 // filter byte for each row
      + (width // pixels
         * 3 // Red, blue, green color samples
         * 2 // 16 bits per color sample
        )
    )
+ 6 // zlib compression overhead
+ 2 // deflate overhead
+ 12 // IEND chunk
压缩“质量”不包括在内。 大多数应用程序可能会将 IDAT为较小的数据块,通常每个数据块为8KB, 因此,在350x350图像的情况下 44个IDAT块,因此为IDAT块开销添加43*12

作为检查,1x1 16位RGB图像可以按如下方式写入 一个72字节的PNG和一个1x1的8位灰度图像 67字节。如果图像是隔行扫描的或有任何 辅助块,或具有alpha通道,它将
自然更大。

在最大情况下,数据是不可压缩的(例如,如果图像大小为1x1,或者如果图像更大,但包含随机不可压缩数据)。所以最大尺寸是

8 // PNG signature bytes
+ 25 // IHDR chunk
+ 12 // IDAT chunk (assuming only one IDAT chunk)
+ height //pixels
  * ( 1 // filter byte for each row
      + (width // pixels
         * 3 // Red, blue, green color samples
         * 2 // 16 bits per color sample
        )
    )
+ 6 // zlib compression overhead
+ 2 // deflate overhead
+ 12 // IEND chunk
压缩“质量”不包括在内。 大多数应用程序可能会将 IDAT为较小的数据块,通常每个数据块为8KB, 因此,在350x350图像的情况下 44个IDAT块,因此为IDAT块开销添加43*12

作为检查,1x1 16位RGB图像可以按如下方式写入 一个72字节的PNG和一个1x1的8位灰度图像 67字节。如果图像是隔行扫描的或有任何 辅助块,或具有alpha通道,它将
当然要更大。

相关的,可能是dup:你说得对!搜索问题时,我没有正确的标签。请不要混淆“分辨率”和“大小”。分辨率是一个绝对值:每个(绝对)测量单位的像素数。典型的单位是“每英寸像素数”,或“ppi”。你问的是尺寸,仅以像素为单位。相关的,可能是dup:你说得对!搜索问题时,我没有正确的标签。请不要混淆“分辨率”和“大小”。分辨率是一个绝对值:每个(绝对)测量单位的像素数。典型的单位是“每英寸像素数”,或“ppi”。你要问的是尺寸,仅以像素为单位。哎呀,我忘了去年我回答了这个问题的一个副本。在这里,我说deflate开销是5个字节,但是我在这里的测试表明它只能是2个字节。读rfc-1951时,我一定是把位和字节弄混了。极端来说:1字节长度的IDAT块有效吗?规范中似乎没有任何内容表明它不是。。。因此,您可以为每个块添加12个字节的巨大开销—每个块都是一个输入字节!我想这取决于OP(认为他)需要知道这一点的原因。@Jongware,是的,一个包含大量1字节数据(甚至零字节数据)IDAT块的PNG是有效的;解码器连接它们的内容以获得zlib数据流。哎呀,我忘了去年我已经回答了这个问题的一个副本。在这里,我说deflate开销是5个字节,但是我在这里的测试表明它只能是2个字节。读rfc-1951时,我一定是把位和字节弄混了。极端来说:1字节长度的IDAT块有效吗?规范中似乎没有任何内容表明它不是。。。因此,您可以为每个块添加12个字节的巨大开销—每个块都是一个输入字节!我想这取决于OP(认为他)需要知道这一点的原因。@Jongware,是的,一个包含大量1字节数据(甚至零字节数据)IDAT块的PNG是有效的;解码器连接它们的内容以获得zlib数据流。