1. 基本概念
先来用通俗的语句讲解位图和调色板的概念。
我们知道,自然界中的所有颜色都可以由红、绿、蓝(R,G,B)三基色组合而成。针对含有红、绿、蓝色成分的多少,可以对其分别分成0~255个等级,而红、绿、蓝的不同组合共有256×256×256种,因此约能表示1600万种颜色。对于人眼而言,这已经是"真彩色"了。
对每个像素进行了(R,G,B)量化的图像就是位图,其在计算机中对应文件的扩展名一般为.bmp。既然用R,G,B的量化值就可以直接记录一张位图的所有像素,那我们需要调色板干什么呢?
首先,我们可以计算完全利用(R,G,B)组合来存储一个800×600的位图所需要的空间为:
800×600×3 = 1440000(字节)= 1.37M(字节)
惊人的大!因此,调色板横空出世了,它的功能在于缓解位图文件存储空间过大的问题。
假设一个位图为16色,其像素总数为800×600。我们只需要用4个bit就可以存储这个位图的每个像素在16种颜色中所处的等级,然后调色板提供了这16种等级对应的(R,G,B)值,这样,存储这个16色位图只需要:
800×600×4/8 = 240000(字节)= 0.22 M(字节)
额外的存储R,G,B表的开销(即调色板Palette,也称为颜色查找表LUT)仅仅为16×3=48字节。
存储空间被大为减少!
常见的位图有单色、16色、256色、16位及24位真彩色5种,对于前三者(即不大于256色)都可以调色板方式进行存储,而对16位及24位真彩色以调色板进行存储是不划算的,它们直接按照R,G,B分量进行存储。
在此基础上我们来分析DDB位图(Device-dependent bitmap,与设备相关的位图)与DIB位图(Device-independent bitmap,与设备无关的位图)的概念以及二者的区别。
DDB依赖于具体设备,它只能存在于内存中(视频内存或系统内存),其颜色模式必须与特定的输出设备相一致,使用系统调色板。一般只能载入色彩较简单的DDB位图,对于颜色较丰富的位图,需使用DIB才能长期保存。
DIB不依赖于具体设备,可以用来永久性地保存图象。DIB一般是以*.BMP文件的形式保存在磁盘中的,有时也会保存在*.DIB文件中。 DIB位图的特点是将颜色信息储存在位图文件自身的颜色表中,应用程序要根据此颜色表为DIB创建逻辑调色板。因此,在输出一幅DIB位图之前,程序应该将其逻辑调色板选入到相关的设备上下文并实现到系统调色板中。
2. 例程简述
本文后续的讲解都基于这样的一个例子工程,它是一个基于对话框的MFC应用程序,包括2个父菜单:
(1) DDB位图
DDB位图父菜单又包括两个子菜单:
a. ID:IDM_LOADDDBPIC caption:加载
单击事件:加载资源中的DDB位图并显示之
b. ID:IDM_MARK_DDBPIC caption:标记
单击事件:在DIB位图中透明地添加天极网logo
(2) DIB位图
DIB位图父菜单又包括两个子菜单:
a. ID:IDM_OPENDIBPIC caption:打开
单击事件:弹出文件对话框,打开.bmp位图文件,并显示
b. ID:IDM_MARK_DIBPIC caption:标记
单击事件:在DIB位图中透明地添加天极网logo
工程中还包含下列位图资源:
(1)IDB_LOADED_BITMAP:要加载的位图资源
(2)IDB_YESKY_BITMAP:天极网logo
后续篇章将集中在对4个子菜单单击事件消息处理函数的讲解,下面的代码是整个对话框类CBitMapExampleDlg的消息映射:
BEGIN_MESSAGE_MAP(CBitMapExampleDlg, CDialog) //{{AFX_MSG_MAP(CBitMapExampleDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_COMMAND(IDM_LOADDDBPIC, OnLoadddbpic) ON_COMMAND(IDM_MARK_DDBPIC, OnMarkDdbpic) ON_COMMAND(IDM_OPENDIBPIC, OnOpendibpic) ON_COMMAND(IDM_MARK_DIBPIC,OnMarkDibpic) //}}AFX_MSG_MAP END_MESSAGE_MAP() |
分享到:
相关推荐
DDB与DIB位图编程,讲的比较好~值得学习
将ddb的位图转换成DIB的位图 用VS2005,C++
Vs2005 C++ dib类 将DDB的位图转换为DIB的位图 绘制DIB的图片
位图中DDB与DIB的区别介绍,以及编程全攻略,文档中有代码的
Converting DDB to DIB将一个设备相关的位图转换成设备无关的位图(6KB)
我遇到了这个问题,于是在网上查了好多资料,搞了一天才写出了两个函数进行转化,将32位的DDB和DIB互相转换。(包含详细的注释) 如果你需要转换其他格式的,可以自己设定参数。 网上下的那些代码都有问题,我这个是...
第1章 Visual C++与数字图像处理 1 1.1 数字图像处理概述 2 1.1.1 图像与数字图像 2 1.1.2 数字图像处理研究的内容 4 1.1.3 数字图像处理的应用 6 1.2 Visual C++概述 8 1.2.1 C++语言简介 8 1.2.2 Visual C++简介 ...
DDB2DIB转变源代码
用CreateDIBitamp函数和LoadImage函数实现DIB到DDB位图的转换和百叶窗效果。
ConvertDDBToDIB从ddb到dib转换的类
Converting DIB to DDB将一个设备无关的位图转换成设备相关的位图(5KB)
转换DDB到DIB.pdf
对于刚学图像处理的人往往分不清DIB,DDB和DIBSection的区别,这个文档很好地说明了它们之间的区别。
基础知识,图像处理的基本知识,很多人都在问,看了这个就明白了
1.4与设备无关的位图(DIB) 11.5动画控件 11.6媒体控制接口(MCI). 11,7小结 第十二章 多线程与串行通信 12.1 多任务、进程和线程 12.2 线程的同步 12.3 串行通信与重叠I/O 12.4 一个通信...
VS2005 C# Dib 处理设备无关图像 DDB转化为DIB 绘制DIB
实现DIB与DDB图像相互转换 读取 显示 储存 简易vc++代码 睡不着 无聊的写的代码 绝对好用
VS2005 C++ CDib 处理设备无关图像 DDB转化为DIB 绘制DIB
VS2005 设备相关转为设备无关 已测试过