news 2026/10/21 22:51:20

调色板:让图像变小的隐藏神器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
调色板:让图像变小的隐藏神器

一、一句话理解

调色板是一张"颜色表"。图像里的每个像素不直接存颜色,只存一个编号(索引),真正的颜色要拿编号去调色板里查。

可以类比"按编号涂色"的填色画:画上只写着 1、2、3……,旁边有一张对照表写着"1 = 红,2 = 绿,3 = 蓝"。

这种图像叫索引色图像(Indexed Color),PNG 中对应颜色类型 3。


二、具体内容

1. 调色板本身

调色板是一个数组,每一项是一种颜色:

索引 R G B ──────────────────────── 0 255 0 0 红 1 0 255 0 绿 2 0 0 255 蓝 3 255 255 255 白 ... 255 ... ... ... 最多 256 项
  • 在 PNG 中,调色板存放在PLTE 块里,每项 3 字节(R、G、B),最多 256 项,所以块长度最大为 768 字节。
  • 透明度单独存放在tRNS 块里,按顺序给每一项提供一个 Alpha 值。tRNS 可以比调色板短,没写到的项默认 Alpha = 255(不透明)。

2. 像素数据

像素数据里每个像素只是一个索引值:

像素数据(4×2 的小图): 0 0 1 1 2 2 3 3 查表后的实际颜色: 红 红 绿 绿 蓝 蓝 白 白

索引的位数决定了调色板最多能用多少项:

位深每像素占用最多颜色数
1 位1/8 字节2
2 位1/4 字节4
4 位1/2 字节16
8 位1 字节256

这也是 PNG 规定调色板图不能是 16 位的原因:16 位索引意味着 65536 项调色板,已经失去意义。


三、作用

1. 节省空间(最主要的作用)

以一张 1000×1000 的图为例:

存储方式像素数据大小
RGB 真彩色,每像素 3 字节约 3 MB
RGBA,每像素 4 字节约 4 MB
8 位调色板,每像素 1 字节 + 768 字节调色板约 1 MB
4 位调色板(16 色)约 0.5 MB

数据量少了,再经过 Deflate 压缩后文件也更小。

2. 适合颜色少的图像

图标、Logo、像素画、简单的界面图、图表等,本来就只有几种到几十种颜色,用调色板几乎没有损失。

照片就不合适:照片可能有几十万种颜色,压缩到 256 色必然失真(出现色带、需要抖动)。

3. 历史原因:显卡硬件

早期显卡(如 VGA 的 256 色模式)显存很小,硬件本身就按"索引 + 调色板"工作。改调色板就能让整个画面变色,老游戏常用这个技巧做"调色板动画",比如水流、闪烁效果,不用改任何像素。GIF、BMP、PCX 等老格式都保留了调色板设计。


四、stb_image 怎么处理调色板

stb 的原则是:输出永远是直接的颜色值,不把调色板交给用户。

文件中: PLTE(颜色表) + tRNS(可选的 Alpha) + 像素索引 ↓ stbi__expand_png_palette 输出: 每个像素直接是 RGB 或 RGBA

具体过程(对应上一篇 PNG 第四、八节):

  1. 读 PLTE:存进palette[1024],即 256 项 × 4 字节(RGBA),Alpha 先填 255。
  2. 读 tRNS:把 Alpha 填进对应项,并把输出通道数从 3 改成 4。
  3. 反滤波:此时每像素只有 1 个通道,就是索引。低位深时不做 0~255 的放大,因为索引必须保持原值。
  4. 展开:逐像素查表:
for(i=0;i<pixel_count;++i){intn=orig[i]*4;// 索引 × 4 = 该颜色在表中的位置p[0]=palette[n];// Rp[1]=palette[n+1];// Gp[2]=palette[n+2];// Bif(pal_img_n==4)p[3]=palette[n+3];// Ap+=pal_img_n;}

所以对使用者来说:

  • 调色板 PNG 加载后,comp报告的是3(无 tRNS)或4(有 tRNS),而不是 1;
  • 拿不到原始索引和调色板。如果确实需要索引(例如做像素画编辑器、要改调色板),stb_image 做不到,需要用 libpng 或 lodepng 等库。

五、其他格式里的调色板

格式调色板情况
PNGPLTE 块,RGB;透明度放在 tRNS 块
GIF必须使用调色板,最多 256 色;有全局调色板,每帧也可以有局部调色板;透明用一个"透明索引"表示
BMP1/4/8 位图在文件头后跟调色板,每项 4 字节,顺序是B、G、R、保留
TGA可选的颜色映射表(Color Map),项可以是 15/16/24/32 位
PSD、JPEGJPEG 不支持调色板;stb 的 PSD 解码只处理 RGB 等直接颜色模式

stb 对这些格式都是一样的做法:解码时查表展开,输出直接的颜色值。


六、总结

问题答案
调色板是什么一张颜色表,像素存索引,用索引查表得到颜色
内容是什么最多 256 项 RGB 颜色(PNG 的 PLTE),可选配每项的 Alpha(tRNS)
有什么作用节省存储空间;适合颜色少的图;早期硬件的工作方式
缺点最多 256 色,不适合照片
stb 怎么处理解码时展开成 RGB/RGBA,用户拿到的是直接颜色,拿不到索引
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/21 16:43:29

ZYNQ7010 与 AD7768 高精度 ADC 采集:从硬件到数据落地全攻略

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/18 15:31:22

Raft算法实战指南:从原理到生产落地的分布式一致性详解

1. 这不是教科书里的“分布式”&#xff0c;而是我踩过坑后才敢写的实战笔记“分布式理论与分布式一致性算法详解”——看到这个标题&#xff0c;你脑子里是不是立刻浮现出一堆抽象符号、希腊字母和论文截图&#xff1f;别急&#xff0c;先放下那些让你头皮发紧的Paxos推导图。…

作者头像 李华
网站建设 2026/10/21 11:29:59

2026年,薪酬设计咨询公司如何用科学分钱激活团队?

2026年的人才争夺战&#xff0c;早已不是简单加薪就能解决的。大量企业HR向我反馈&#xff0c;他们面临的困境高度一致&#xff1a;竞争对手的市场数据不够精准&#xff0c;样本量模糊&#xff0c;一线城市AI算法岗的真实薪酬被笼统的全行业数据掩盖&#xff1b;薪酬数据时效性…

作者头像 李华
网站建设 2026/10/21 21:01:30

SAP CTO谈预测AI:能解释业务,不等于能准确预测业务

企业希望AI预测客户付款、商品需求和设备故障&#xff0c;但这些问题并不适合全部交给语言模型。在CIO的采访中&#xff0c;SAP首席技术官Philipp Herzig指出&#xff0c;分类、回归等结构化数据任务&#xff0c;需要更合适的预测工具&#xff1b;SAP正在通过RPT和TabPFN等表格…

作者头像 李华