一、调色板
1.我们知道,自然界中的所有颜色都可以由红、绿、蓝(R,G,B)三基色组合而成。而计算机对于像素的处理,用一个字节,将每种基色分为了256种等级,那么红、绿、蓝的不同组合共有256*256*256=16777216种,如此之多的组合,对于人眼的辨别能力来说,已经相当足够了,这就是我们平时所说的"真彩色".
对每个像素进行了(R,G,B)量化的图像就是位图,其在计算机中对应文件的扩展名一般为.bmp.对于单色,16色,256色3种位图文件,都是以调色板方式进行存储;而对16位及24位真彩色以调色板进行存储是不划算的,它们直接按照R,G,B分量进行存储。
2.位图中的调色板模块
调色板(色数*4字节)
16)28-...:调色板规范.对于调色板中的每个元素,用下述方法来描述RGB的值:
1字节用于蓝色分量
1字节用于绿色分量
1字节用于红色分量
1字节为保留字
调色板针对的是需要调色板的位图,即单色,16色和256色等.对于不以调色板方式存储的位图,则没有此信息.它实际上就是一个数组,用来储存上面所提到的RGB元素,其中元素的个数由14)里提到的颜色索引数来定,当该值为0的时候,则根据色数来定,其大小等于2的n次幂,n是9)中提到的每个像素的位数(实际上,数组大小通常也就是2,16,256...).
3.后面是实际的位图数据ImageDate.
对于用到调色板的位图,实际的图象数据ImageDate为该象素的颜色在调色板中的索引值;对于真彩色图,图象数据则为实际的R、G、B值:
a.单色位图:用1bit就可以表示象素的颜色索引值;
b.16色位图:用4bit可以表示象素的颜色索引值;
c.256色位图:1个字节表示1个象素的颜色索引值;
d.真彩色:3个字节表示1个象素的颜色R,G,B值.
此外,位图数据每一行的字节数必须为4的整倍数,如果不是,则需要补齐.位图文件中的数据是从下到上(而不是从上到下),从左到右方式存储的.
二、DDB和DIB
在此基础上,让我们再来看2个概念:DDB位图(Device-dependent bitmap,与设备相关的位图)与DIB位图(Device-independent bitmap,与设备无关的位图)
DDB依赖于具体设备,它只能存在于内存中(视频内存或系统内存),其颜色模式必须与特定的输出设备相一致,使用系统调色板.所以一般只能载入色彩较简单的DDB位图,而对于颜色较丰富的位图,则需使用DIB才能长期保存.
DIB不依赖于具体设备,可以用来永久性地保存图象.DIB一般是以*.BMP文件的形式保存在磁盘中的,有时也会保存在*.DIB文件中. DIB位图的特点是将颜色信息储存在位图文件自身的颜色表中,应用程序要根据此颜色表为DIB创建逻辑调色板.因此,在输出一幅DIB位图之前,程序应该将其逻辑调色板选入到相关的设备上下文并实现到系统调色板中.