基于VB6.0的数字图像编程实例 |
||||||||
前言 随着编程技术的发展,如何在程序中处理图像已经是所有编程爱好者不得不面对的一个重要问题,笔者在天极网上曾发表了多篇关于数字图像处理的文章,但都是基于Visual C++开发平台的,对于习惯于使用Visual Basic的读者朋友来说,不能不算是一个遗憾。 网上有很多朋友关心如何在Viusal Basic环境下进行一些基本的图像处理,如位图文件数据的读取、显示、实现特效等,为了满足上述这些朋友们的需求,笔者通过这篇文章介绍一下如何在Visual Basic环境下实现图像文件的一些基本操作,希望可以对广大喜爱Visual Basic编程的朋友起到入门的作用。 一、BMP位图的DIB的结构 在 Windows 3.0 以前,Windows系统用的是DDB(设备有关位图),DDB没有调色板,显示的颜色依赖硬件,处理色彩很不方便。所以微软从Windows 3.0以后重新定义了BMP文件格式,使其支持设备无关位图--也就是DIB,其结构主要由以下几个部分构成:1)BITMAPFILEHEADER:BMP文件头;2)DIB BITMAPINFOHEADER:BMP位图文件信息头;3)RGBQUAD[]:BMP位图的调色板;4)位图数据块。BMP文件的结构示意图如图一所示: ![]() 图一、位图文件的结构示意图 (1)BMP位图文件头BITMAPFILEHEADER的VB声明如下:
上述结构中,参数bfType 指示文件的类型,对于位图文件来说,它必须是"BM";参数bfSize指示位图文件的大小,它包括BITMAPFILEHEADER的长度;参数bfReserved1、bfReserved2目前保留,必须等于0;参数bfOffBits表示位图数据距离文件头的偏移字节数。 (2)文件信息头BITMAPINFOHEADER结构在VB中声明如下:
上述结构中,参数biSize表示BITMAPINFOHEADER结构的大小;参数biWidth表示位图的高度,单位是像素;参数biHeight 位图的宽度,单位是像素;参数biPlanes 设备的位平面数,现在都是1;参数biBitCount 图像的颜色位数,1表示单色位图、4表示16色位图、8表示256色位图、24表示真彩色位图、32表示32位位图,默认情况下Windows不会处理最高8位,可以将它作为自己的Alpha通道;参数biCompression表示图像的压缩方式,BI_RGB表示无压缩、BI_RLE8表示行程编码压缩;参数biSizeImage表示实际的位图数据所占字节;参数biXPelsPerMeter表示目标设备的水平分辨率,单位是每米的像素个数;参数biYPelsPerMeter表示目标设备的垂直分辨率,单位是每米的像素个数;参数biClrUsed表示使用的颜色数(当biBitCount等于1、4、8时才有效),如果该项为0,表示颜色数为2^biBitCount;参数biClrImportant# 重要的颜色数,如果该项为0,表示所有颜色都是重要的。 (3)位图调色板 调色板实际上是一个数组,它的元素的个数由biBitCount和biClrUsed决定,对于位图文件来说,只有biBitCount等于1、4、8时才有调色板,它们对应的调色板的元素个数分别是2、16、256。调色板结构在VB中的声明如下:
上述结构中,参数rgbBlue表示蓝色分量,参数rgbGreen 绿色分量;参数rgbRed表示红色分量;参数rgbReserved为保留位,设置为0既可。对于各个颜色的分量来说,它们分布在0-255之间,数值越大,亮度越大,反之则亮度越小。 需要说明的是,BITMAPINFOHEADER结构和调色板数据合在一起就构成了BITMAPINFO结构,这个结构在显示位图文件时能够用到。该结构在VB中声明如下:
(4)位图数据 对于位图文件来说,一行的图像数据叫做一个扫描行,一个扫描行的长度必须是4的倍数(字节),如果不是,则需要补齐。计算公式:LineBytes=((biWidth*biBitCount+31)And &HFFFFFFE0)\8,通常情况下DIB的扫描行是逆序存储的(相对于屏幕坐标系而言),即屏幕上的第一行是DIB位图数据的最后一行。对于256色位图来说,它用8bit表示一个像素的颜色索引,也就是说,位图显示时,根据当前索引值来到位图的调色板中确定该像素的颜色;对于真彩色图象来说,位图文件中没有调色板信息,它直接用24个bit位表示一个像素的颜色,每个字节表示一种基色,也就是R、G、B分量中的一个值,需要注意的是,真彩色位图文件中三个字节的排列顺序是BGR,而不是传统的RGB。 二、位图文件的显示 对位图文件的结构了解以后,我们就能顺利读取位图文件中的各种信息,然后结合特定的显示函数就可以将位图文件显示出来,本文中这个特定的显示函数是StretchDIBits(),它在VB中的声明如下:
该函数执行成功返回位图句柄,零表示失败。其中参数hDC 一个设备场景的句柄,该设备场景定义了要创建的与设备有关位图的配置信息;参数Xdest为指定绘制区域的左上角X坐标;参数Ydest为指定绘制区域的左上角Y坐标;参数nDestWidth为指定绘制区域的高度;参数nDestHeight为指定绘制区域的宽度;参数XSrc为矩形在DIB中的起点X坐标;参数YSrc 为矩形在DIB中的起点Y坐标;参数nSrcWidth指定原位图绘制区域的左上角X坐标;参数nSrcHeight指定原位图绘制区域的左上角Y坐标;参数lpBits 指向一个缓冲区的指针,这个缓冲区包含了以DIB格式描述的位图数据;lpBitsInfo 指向BITMAPINFO结构,参数iUsage一般情况下等于DIB_RGB_COLORS,表示包含了RGB颜色;参数dwRop表示欲进行的光栅运算,具体内容可以参见MSDN。 当然,显示位图文件的函数不只这一个,还有其他的一些函数,具体内容读者朋友可以参考相关资料。 三、实现位图的淡入淡出的实例 为了演示如何在Visual Basic中实现数字图像的基本操作,本文的例子实现了一幅256色彩色位图淡入淡出的显示效果,用户可以通过设定时间的长短控制图像淡入淡出的速度。例子程序中,有两个模块,其中MyMemory模块是用来申请特定的内存空间,为后续读取位图文件作准备,另一模块Bitmap是用来实现位图文件数据的读写、准备淡入淡出操作时的调色板等。对于例子中的256色彩色位图来说,实现淡入淡出显示主要是通过操作图像的调色板来实现的。具体思路是设置一个数组来存放若干个调色板,其中一个调色板保存位图文件中的原始调色板数据,另外的调色板中的数据按照比例等间隔的缩小,直至调色板中的R、G、B分量全部为零为止。有了这些预设的调色板,就可以在定时显示的过程中实现图像的淡入淡出的效果了。 四、小结 本文介绍了Visual Basic中处理位图文件的基本知识,提供了示例中实现了位图文件的读写、显示等基本操作,读者朋友可以在该代码的基础上进行修改、丰富,实现更多更复杂的图像处理功能,有兴趣的朋友可以动手亲自实验一下。 下载本文源代码 |