【问题标题】:Maximum PNG size according to resolution根据分辨率的最大 PNG 大小
【发布时间】:2015-07-06 11:11:39
【问题描述】:

有没有一种方法可以计算任何使用 PNG 压缩的图像的最大尺寸?

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

“X”值是我正在寻找的值。或者在数学表达式中

350px *  350px * (90q) < X KB

我对PNG压缩算法不是很熟悉,但是对于特定的分辨率可能有一个最大值?

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

【问题讨论】:

  • 你是对的!搜索我的问题时,我没有正确的标签。
  • 不要混淆“分辨率”和“尺寸”。 分辨率是一个绝对值:每个(绝对)测量单位的像素数。典型的单位是“每英寸像素数”或“ppi”。你问的是size,以像素为单位only

标签: compression png


【解决方案1】:

在最大情况下,数据是不可压缩的(例如,如果图像大小为 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 分成更小的块,通常每个 8kbytes, 所以在 350x350 图像的情况下,会有 44 个 IDAT 块,因此为 IDAT 块开销添加 43*12。

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

【讨论】:

  • 糟糕,我忘了我去年回答过这个问题的副本。在那里,我说放气开销是 5 个字节,但我在这里的测试表明它只能是 2 个字节。我在阅读 rfc-1951 时一定混淆了位和字节。
  • 将其发挥到极致:1 字节长度的 IDAT 块是否有效?规范中似乎没有任何内容表明它不是……因此您可以为每个块添加 12 个字节的 whopping 开销 - 每个块一个单个输入字节!我想这取决于为什么 OP(认为他)需要知道这一点。
  • @Jongware,是的,具有多个 1 字节数据(甚至零字节数据)IDAT 块的 PNG 是有效的;解码器连接它们的内容以获得 zlib 数据流。
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2015-04-25
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 2014-09-21
  • 1970-01-01
相关资源
最近更新 更多