1.2.4 灰度图像的颜色表
如表1-2所示,灰度图像的颜色表是一个256个表项的RGBQUAD结构体数组(具体参看BMP文件结构中对颜色表的描述),而每个RGBQUAD中的R、G、B分量的值是相等的。随着颜色表数组下标从0到255变化,颜色表数组元素中R、G、B分量也从0到255依次变化。灰度图像的位图数据每像素一个字节,其值为0到255之间的一个,当显示一幅灰度图像时,系统根据像素值,到颜色表数组下标与之对应的表项(数组元素)中查看颜色,根据该表项中的颜色显示像素。由于灰度图像颜色表每个表项中R、G、B分量相等,因此只有图像亮度信息,没有颜色信息,因而显示出的灰度图像也就没有颜色了。
表1-2 灰度图像的颜色表
|
B< xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> |
G |
R |
保 留 位 |
|
0 |
0 |
0 |
不确定 |
|
1 |
1 |
1 |
不确定 |
|
2 |
2 |
2 |
不确定 |
|
3 |
3 |
3 |
不确定 |
|
M |
M |
M |
M |
|
254 |
254 |
254 |
不确定 |
|
255 |
255 |
255 |
不确定 |
从以上的解释中我们知道,图像颜色表决定了图像的颜色,如果对灰度图像的颜色表数据进行改变,图像颜色自然也就被改变了。下面的main()函数,把灰度图像颜色表的蓝色分量进行了改变。
void main() { //读入指定BMP文件进内存 char readPath[]="dog.BMP"; readBmp(readPath); //输出图像的信息 printf("width=%d,height=%d,biBitCount=%d\n", bmpWidth,bmpHeight,biBitCount); //改变灰度图像的颜色表蓝色分量的值,查看前后变化 if(biBitCount==8){ for(int i=0; i<256;i++){ pColorTable[i].rgbBlue = 255-pColorTable[i].rgbBlue; } } //将图像数据存盘 char writePath[]="dogcpy.BMP"; saveBmp(writePath, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable); //清除缓冲区,pBmpBuf和pColorTable是全局变量, 在文件读入时申请的空间 delete []pBmpBuf; if(biBitCount==8) delete []pColorTable; } |
改变后灰度图像颜色表变为表1-3的形式(蓝色分量是结构体的第一个分量),此时颜色表R、G、B三个分量的值已经不再相等,因此图像也就具有了颜色信息,只不过此时的颜色并不是物体真实的颜色,读者可以运行程序,查看颜色表改变前后图像颜色的变化。
表1-3 改变后的颜色表
|
B |
G |
R |
保留位 |
|
255 |
0 |
0 |
不确定 |
|
254 |
1 |
1 |
不确定 |
|
253 |
2 |
2 |
不确定 |
|
252 |
3 |
3 |
不确定 |
|
M |
M |
M |
M |
|
1 |
254 |
254 |
不确定 |
|
0 |
255 |
255 |
不确定 |
这里需要说明的是,为了说明方便,我们在1.2.3和1.2.4两小节中都重新写了main()函数,这些main()函数均在chap1-1中的bmpReadWrite.cpp文件内。而C语言中,一个程序只能有一个main()函数,读者在调用其中一个main()函数时,需要将其他两个屏蔽掉。
本节内容用简单的C语言、采用结构化的程序设计思想实现了BMP文件的读写及访问操作,这只是我们后面可视化图像编程(www.cppentry.com)的前奏,有了这个基础后,我们来学习MFC库中的GDI位图,并采用面向对象的思想自己设计实现一个图像类(ImgCenterDIB类)。
【责任编辑:
夏书 TEL:(010)68476606】