关于位图中【调色板】、DDB、DIB的概念

一、调色板

1.我们知道,自然界中的所有颜色都可以由红、绿、蓝(R,G,B)三基色组合而成。而计算机对于像素的处理,用一个字节,将每种基色分为了256种等级,那么红、绿、蓝的不同组合共有256*256*256=16777216种,如此之多的组合,对于人眼的辨别能力来说,已经相当足够了,这就是我们平时所说的"真彩色".

对每个像素进行了(R,G,B)量化的图像就是位图,其在计算机中对应文件的扩展名一般为.bmp.
然而,对于"真彩色"来说,它的颜色种类实际上已经超出了人眼的识别范围,在很多时候,我们并没有必要将颜色划分得如此之细.而"真彩色"图片存储空间过大,也是这种文件的一种弊端.我们可以来计算一下一个800*600的"真彩色"图片所需要的存储空间的大小:
800*600*3 = 1440000(字节)= 1.37M(字节)
这是不是和你们平时看到的WINDOWS壁纸一样大小(当然,这里除去了位图文件中文件头以及其他信息头的大小,这些将在后面讲到).如果每个图形文件都花费掉如此大的空间,是很不划算的,于是就出现了"调色板",它的功能在于缓解位图文件存储空间过大的问题.位图文件也就出现了单色,16色,256色,16位,24位真彩色几种格式.
对于一个16色位图文件,它每个象素,只需要4bit,因为调色板提供了这16种等级对应的(R,G,B)值,我们只需要4bit来存储象素在调色板中的索引值,这样,一个800*600的16色位图文件所需要的存储空间为:
800*600*4/8 = 240000(字节) = 0.22 M(字节)
而调色板所带来的额外开销仅仅为16*4=64字节.存储空间大为减少了!

对于单色,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位图之前,程序应该将其逻辑调色板选入到相关的设备上下文并实现到系统调色板中.


你可能感兴趣的:(关于位图中【调色板】、DDB、DIB的概念)