网上一搜,可以看到BMP位图结构的详细说明,这篇文章专门谈一下其中的调色板。

多少位位图并不是指每一个颜色该用多少位表示,对于颜色来说,它始终都是24位(RGB),或者是32位(RGBA),而是指该位图每个像素点用多少位表示,若是n位位图,则该位图每个像素点用n位表示,该位图共有2n种颜色(对应于调色板的颜色索引)。对于小于24位的位图,一个像素点所用的位数不足以表示一个颜色,所以要用调色板,而每一像素所用的位数存放的是对应于调色板的索引,所以有多少位就能表示2n种颜色;

比如:有一个长宽各为200个象素,颜色数为16色的彩色图,每一个象素都用R,G,B三个分量表示,因为每个分量有256个级别,要用8位(bit),即一个字节(byte)来表示,所以每个象素需要用3个字节。整个图象要用200*200*3,约120k字节,可不是一个小数目呀!

如果我们用下面的方法,就能省的多。 因为是一个16色图,也就是说这幅图中最多只有16种颜色,我们可以用一个表:表中的每一行记录一种颜色的R,G,B值。这样当我们表示一个象素的颜色时,只需要指出该颜色是在第几行,即该颜色在表中的索引值。举个例子,如果表的第0行为255,0,0(红色),那么当某个象素为色时,只需要标明0即可。 让我们再来计算一下:16种状态可以用4位(bit)表示,所以一个象素要用半个字节。整个图象要用200*200*0.5,约20k字节,再加上表占用的字节为3*16=48字节。整个占用的字节数约为前面的1/6,省很多吧。

这张RGB的表,即是我们常说的调色板(Palette),另一种叫法是颜色查找表LUT(LookUpTable),似乎更确切一些。

若对于24位或32位位图,它就不需要调色板了,因为24位足可以放对应的颜色值了,每个字节对应于R,G,B分量的值。

计算每行像素所占字节数:

#define BYTE_PER_LINE(width, bitCount) ((((width)*(bitCount)+31)/32)*4)

其中width是每行像素数,bitCount是每个像素所占的位数,为什么要乘以4除以32呢?因为Windows规定图像文件中一个扫描行所占的字节数必须是4的倍数(即以字为单位,1个字4个字节),不足的以0填充,乘以4保证是4的倍数,除以32保证实际字节数不变(即实际除以8,一个字节是8位),加31是为了多余的整数不够32除另外加的。

最新文章

  1. pt-mext
  2. 深入理解Spring MVC
  3. JMeter专题系列(四)参数化
  4. XE3随笔16:将字符串转换成 UTF8 编码的函数
  5. 使用Immutable优化复制注意事项
  6. Linux python <tab>自动补全
  7. iOS:等比压缩截图代码
  8. Html+CSS命名规范:
  9. Tomcat集群,Nginx集群,Tomcat+Nginx 负载均衡配置,Tomcat+Nginx集群
  10. laravel框架——路由
  11. Android(工具・集成)
  12. tomcat中开启的对SSL(https)的支持
  13. [MFC美化] SkinMagic使用详解2- SkinMagic常用函数介绍
  14. pack://application:,,,/
  15. Git创建本地版本库
  16. Linux-Jenkins安装部署
  17. Linux下挂载iso文件和配置yum本地源
  18. Codeforces Round #381 (Div. 2)C Alyona and mex
  19. windows环境下搭建Java开发环境(一):jdk安装和配置
  20. malloc基本实现

热门文章

  1. php处理的图片无法进CDN缓存
  2. spring mvc(2) spring mvc初体验
  3. 搭建ssm整合
  4. 2020 计蒜之道 预赛 第三场 石子游戏(简单)(暴力DP)
  5. Linux系统编程—进程间同步
  6. [LCTF]bestphp's revenge 给我的启发学习
  7. vue学习04 v-on指令
  8. Linux Wait Queue 等待队列
  9. Flex、Grid、媒体查询实现响应式布局
  10. 解析Vue-router相关干货及工作原理