有什么方法可以预测 png 的大小吗?

Is there some way to predict png size?

我正在实现剪贴板,我想为png图像分配一次内存。有什么方法可以预测 png 文件的最大大小?

一张 PNG 图像包含以下内容:

  1. 签名和基本元数据(图像大小和类型)
  2. 调色板(仅当图像被索引时)
  3. 原始像素数据
  4. 可选元数据(辅助块)
  5. 图像块结束

项目 1 的大小是固定的:8 + 12 + 11 = 31 字节

项目 2 的大小(如果需要)最多为 12 + 3 * 256 = 780 字节

项目 5 的大小是固定的:12 字节

项目 3,原始像素数据,通常是最重要的一项。过滤后未压缩的数据量为

FUD=(W*C*8/BPC+1)*H bytes

其中 W=以像素为单位的宽度,H=以像素为单位的高度,C=通道(如果是 RGB,则为 3,如果是调色板或灰度,则为 1,如果是 RGBA,则为 4,如果是 GA,则为 2),BPC=每个通道的位数(通常为 8)

这是用 ZLIB 压缩的。 bound precisely the worst case 压缩率几乎是不可能的。实际上,人们可能会假设在最坏的情况下压缩流将比原始流多几个字节。 那么项目 3 的大小将大约受限于(再次假设 IDAT 块大小相当小,为 8192 字节)

 (FUD + 6)(1 + 12/8192) ~ FUD

项目 4(辅助区块数据)几乎不可能绑定。