colors - 索引颜色内存大小与原始图像
问题描述
在这篇文章中https://en.m.wikipedia.org/wiki/Indexed_color
它是这样说的:
调色板大小超过 256 个条目的索引彩色图像很少见。实际限制是每个像素大约 12 位,4,096 个不同的索引。由于以字节为单位的调色板大小大于原始图像数据本身,因此使用索引的 16 bpp 或更高并不能提供索引彩色图像的特性。此外,有用的直接 RGB 高彩模式可用于 15 bpp 及以上。
我不明白为什么索引的 16 bpp 或更高在内存方面效率低下
因为在这篇文章中还有这个:
索引颜色节省了大量的内存、存储空间和传输时间:使用真彩色,每个像素需要 24 位,即 3 个字节。典型的 640×480 VGA 分辨率真彩色未压缩图像需要 640×480×3 = 921,600 字节 (900 KiB)。将图像颜色限制为 256,每个像素只需要 8 位,即每个 1 字节,因此示例图像现在只需要 640×480×1 = 307,200 字节(300 KiB),加上 256×3 = 768 个额外字节来存储调色板贴图本身(假设为 RGB),大约是原始大小的三分之一。较小的调色板(4 位 16 色、2 位 4 色)可以将像素打包得更多(达到六分之一或十二分之一),显然是以色彩准确性为代价的。
如果我有 640x480 分辨率并且如果我想使用 16 位调色板:640x480x2(16 位 == 2 字节) + 65536(2^16)*3(rgb) 614400 + 196608 = 811008 字节
原始图像内存大小:640x480x3(rgb) 921600 字节
所以 811008 < 921600
如果我有 1920x1080 分辨率:
原始图像:1920x1080x3 = 6 220 800
索引颜色:
1920x1080x2 + 调色板尺寸(2**16 * 3)
4147200 + 196608
4343808 字节
所以再次索引颜色在内存方面是有效的。我不明白,为什么在这篇文章中说它效率低下。
解决方案
这实际上取决于图像的大小。正如你所说,如果b是每个像素的字节数,p是像素数,那么图像数据大小i是:
我 = p * b
色表大小t为:
t = 2^(b * 8) * 3
因此,原始图像与索引图像占用相同空间的点是:
p * 3 = p * b + 2^(b * 8) * 3
我现在将解决 p:
p * 3 - p * b = 2^(b * 8) * 3
p * (3 - b) = 2^(b * 8) * 3
p = (2^(b * 8) * 3) / (3 - b)
因此,对于各种 bytepp,使用索引图像的最小图像大小会达到平衡:
1 bytepp (8 bit) - 384 pixels (like an image of 24 x 16)
1.5 bytepp (12 bit) - 8192 pixels (like an image of 128 x 64)
2 bytepp (16 bit) - 196,604 pixels (like an image of 512 x 384)
2.5 bytepp (20 bit) - 6,291,456 pixels (like an image of 3072 x 2048)
2.875 bytepp (23 bit) - 201,326,592 (like an image of 16,384 x 12,288)
如果您使用小于 512 x 384 的图像,则每像素 16 位索引颜色将占用比原始 24 位图像数据更多的空间。
推荐阅读
- python - sklearn rfecv 特征选择结果不一致
- firebase - 如何修复android studio中的“您必须传入非空视图”错误
- electron - 将 inetc 插件用于带有电子生成器的 nsis
- c# - 修复“底层提供程序在打开时失败。”
- javascript - 从博主迁移到 wordpress 后,如何删除 wordpress 帖子中的 javascript 和 CSS
- javascript - WooCommerce:在删除购物车中的商品之前显示确认消息
- github - 如何也限制组织成员提交的主分支?
- mysql - 启动lampp时phpmyadmin没有打开
- php - 无法使用访问令牌交换授权代码 - Google Client PHP API
- excel - Excel - 查看 IP 地址是否包含在子网列表中的公式