有什么方法可以预测 png 的大小吗?
Is there some way to predict png size?
我正在实现剪贴板,我想为png图像分配一次内存。有什么方法可以预测 png 文件的最大大小?
一张 PNG 图像包含以下内容:
- 签名和基本元数据(图像大小和类型)
- 调色板(仅当图像被索引时)
- 原始像素数据
- 可选元数据(辅助块)
- 图像块结束
项目 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(辅助区块数据)几乎不可能绑定。
我正在实现剪贴板,我想为png图像分配一次内存。有什么方法可以预测 png 文件的最大大小?
一张 PNG 图像包含以下内容:
- 签名和基本元数据(图像大小和类型)
- 调色板(仅当图像被索引时)
- 原始像素数据
- 可选元数据(辅助块)
- 图像块结束
项目 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(辅助区块数据)几乎不可能绑定。