王国庆1龙沪强1姜兆华2、3骆公序2、3
(1.上海交通大学 上海 200240; 2.上海市激光技术研究所 上海 200233;
3.上海市激光束精细加工重点实验室 上海 200233)
中图分类号:TH74 文献标识码:A 文章编号:1007-9416(2012)02-0140-02
1 、设计背景
目前,基于数字微反射镜(Digital Micro-mirror Device,DMD)为核心部件的投影设备以其低廉的成本及高效清晰的显示效果等优势正逐步替代传统LCD投影仪,将成为市场上主流投影显示。同时,基于数字微反射镜的激光直写系统在光学及机械结构上已基本成形,本课题从应用实际出发,以成熟的数字微反射镜为核心的激光直写系统作为硬件平台,设计该控制软件以控制数字微反射镜在光刻时的翻转时序,并最终实现把数字反射镜上的图像进行光学干涉并根据色深逐层曝光到光刻胶板上,得到一个缩小倍率的、高质量的任意干涉光斑图形。软件尝试控制以实现光刻2D/3D图像、3D图像以及各种精密的微刻图像和文字。相对于传统的逐点光刻的形式,以逐面逐层光刻除了速度上比逐点光刻快很多,而且在制作的质量和难度上都有着很大的进步。本文旨在通过BMP文件调色板处理后按色分层显示以达到DMD同步显示的控制目的。
2 、设计思路及主要流程
Visual Basic,简称VB,是当今世界上应用最广泛的编程语言之一,它也被公认为是编程效率最高的一种编程方法。本软件即运用VISUAL BASIC 6.0为软件开发平台,程序的主要功能是对加载的图像根据色深进行处理,处理后图片为黑白色以便数字微反射镜的翻转显示,并通过数字微反射镜逐层曝光在光刻胶板上。图片处理及控制过程中有一个问题需要解决:从彩色位图文件得到黑白分色图形文件。若能顺利解决这个问题,软件便可实现预想的功能并开始后续的开发。要从彩色位图文件得到黑白分色图形文件可以通过利用API的调色板函数直接用调色板替换系统调色板来实现[1] 。
3 、软件结构
随着编程技术的发展,如何在程序中处理图像已经是很多程序工作者不得不面对的一个重要问题,以下是如何在Visual Basic环境下实现对图像文件的一些基本操作。
3.1 BMP 位图的 DIB 的结构
在Windows 3.0以前,Windows系统用的是DDB(设备有关位图),DDB没有调色板,显示的颜色依赖硬件,处理色彩很不方便。所以微软从Windows 3.0以后重新定义了BMP文件格式,使其支持设备无关位图——也就是DIB,其结构主要由以下几个部分构成:
( 1 ) B I T M A P F I L E H E A D E R[ 2 ]:BMP文件头;(2)DIBBITMAPINFOHEADER[2]:BMP位图文件信息头;(3)RGBQUAD[][2]:BMP位图的调色板;(4)位图数据块[2]。
3.1.1 BMP位图文件头BITMAPFILEHEADER[2]的VB声明如下:
Type BITMAPFILEHEADER[2]
bfType(0 to 1) As Byte
bfSize As Long
bfReserved1 As Integer
bfReserved2 As Integer
bfOffBits As Long
End Type
上述结构中,参数bfType 指示文件的类型,对于位图文件来说,它必须是"BM";参数bfSize指示位图文件的大小,它包括BITMAPFILEHEADER[2]的长度;参数bfReserved1、bfReserved2目前保留,必须等于0;参数bfOffBits表示位图数据距离文件头的偏移字节数。
3.1.2 文件信息头BITMAPINFOHEADER[2]结构在VB中声明如 下 :
Type BITMAPINFOHEADER[2]
biSize As Long
biWidth As Long
biHeight As Long
biPlanes As Integer
biBitCount As Integer
biCompression As Long
biSizeImage As Long
biXPelsPerMeter As Long
biYPelsPerMeter As Long
biClrUsed As Long
biClrImportant As Long
End Type
上述结构中,参数biSize表示BITMAPINFOHEADER[2]结构的大小;参数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.1.3 位图调色板
调色板实际上是一个数组,它的元素的个数由biBitCount和biClrUsed决定,对于位图文件来说,只有biBitCount等于1、4、8时才有调色板,它们对应的调色板的元素个数分别是2、16、256[2]。调色板结构在VB中的声明如下:
Private Type RGBQUAD[2]
rgbBlue As Byte
rgbGreen As Byte
rgbRed As Byte
rgbReserved As Byte
End Type
上述结构中,参数rgbBlue表示蓝色分量,参数rgbGreen 绿色分量;参数rgbRed表示红色分量;参数rgbReserved为保留位,设置为0既可。对于各个颜色的分量来说,它们分布在0-255之间,数值越大,亮度越大,反之则亮度越小。
需要说明的是,BITMAPINFOHEADER[2]结构和调色板数据合在一起就构成了BITMAPINFO结构,这个结构在显示位图文件时能够用到。该结构在VB中声明如下:
Private Type BITMAPINFO
bmiHeader As BITMAPINFOHEADER[2]
bmiColors(0 To 255)As RGBQUAD[2]
End Type
3.1.4 位图数据
对于位图文件来说,一行的图像数据叫做一个扫描行,一个扫描行的长度必须是4的倍数(字节),如果不是,则需要补齐。计算公式:LineBytes=((biWidth*biBitCount+31)And &HFFFFFFE0)8,通常情况下DIB的扫描行是逆序存储的(相对于屏幕坐标系而言),即屏幕上的第一行是DIB位图数据的最后一行。对于256色位图来说,它用8bit表示一个像素的颜色索引,也就是说,位图显示时,根据当前索引值到位图的调色板中确定该像素的颜色;对于真彩色图象来说,位图文件中没有调色板信息,它直接用24个bit位表示一个像素的颜色,每个字节表示一种基色,也就是R、G、B分量中的一个值,需要注意的是,真彩色位图文件中三个节的排列顺序是BGR,而不是传统的RGB[2] 。
3.2 位图文件的显示
DMD可以根据计算机给出的VGA信号进行显示,本软件的功能旨在对BMP图片进行分色处理,并连续动画显示。这时虽然也可以通过保存多幅画面,然后再连续播放这些画面来表现动态效果,但Windows给我们提供了更简便的方法,即:调色板动画,它利用对系统调色板的直接访问,可以实现“对显示的位图没有真正改变”的动画的制作。这种方法适合于颜色周期变化的动画。上一节曾提到:用调色板palette实现色彩动画,仅限于色深256色以下的BMP格式图像文件[3] 。
实现调色板动画主要有以下几个步骤[3] :(1)创建自己定义的逻辑调色板;(2)将这个自定义的逻辑调色板选入要进行操作的设备环境中;(3)在这个设备环境中利用逻辑调色板中的颜色来绘制图形;(4)周期性地改变逻辑调色板中的颜色值,并使其立即反映到系统调色板中。
进行上面的操作,要用到以下的API函数和数据结构:
3.2.1 CreatePalette[4]
该函数用于创建一个逻辑彩色调色板。函数原型:HPALETTECreatePalette(CONST LOGPALETTE *lplgpl);如果函数成功,则返回值是一个逻辑调色板的句柄;如果失败,返回值为NULL。参数lplgpl:指向LOGPALETTE结构的指针,该结构用来定义逻辑调色板。其中第一个字段包含一个常数,为十六进制的300,表示为&H300;第二个字段指定新调色板中的调色板项的数量[4]。
Type LOGPALETTE
palVersion As Integer
palNumEntries As Integer
palPalEntry(4) As PALETTEENTRY
End Type
第三个字段是PALETTEENTRY结构的一个数组。
Type PALETTEENTRY
peRed As Byte
peGreen As Byte
peBlue As Byte
peFlags As Byte
End Type
以上结构用来定义调色板项,前三个字段分别设置红、绿、蓝三原色的值,取值为0~255。
3.2.2 RealizePalette [4]
该函数从当前逻辑调色板中映射调色板入口点到系统调色板中。函数原型:UINT RealizePalette(HDC hdc);参数hdc:设备环境句柄。一个逻辑调色板被选择在该设备环境中。如果函数成功,函数返回值定义口点的数目,这些逻辑调色板中的入口点映射到系统调色板中;如果失败,返回值是GDI_ERROR[4] 。
3.2.3 ANImatePalette[4]
该函数替换指定逻辑调色板上的入口点。函数原型:BOOL AnimatePalette(HPALETTE hpal,UINT iStartindex,UINT cEntries,CONST PALETTEENTRY *ppe);参数:hpal:逻辑调色板的句柄。iStartIndex:指定要被替换的第一个逻辑调色板入口点。cEntries:指定要被替换的入口点数目。Ppe:指向PALETTEENTRY数组结构第一个元素的指针,用来替换当前的入口点。函数如果执行成功,返回非零值;如果失败,返回值是零[4] 。
本控制软件根据BMP图片色深进行处理并分层连续动画显示的流程:打开BMP文件加载,根据返回色深值计算需处理的图片次数及循环显示次数。比如,16色的BMP图片根据每个颜色进行调色板修改,第一个颜色A区域通过调色板修改为黑色,图片其它区域改为白色显示,延时一段时间后第二个颜色B区域通过调色板修改为黑色,图片其余区域改为白色显示,以此类推直至图片的每个颜色都有显示即色深次循环结束。如此连续显示即有动画效果,亦可设定定时时间满足曝光的时间要求和DMD微反射镜反转角度的要求。
4 、结语
本文通过参照Visual Basic中BMP图像文件的文件格式和WINDOWS API调色板函数实现了256色位图文件的读写、修改调色板并根据要求的曝光时间间隔连续显示图像中各色阶,最终实现激光直写系统中DMD显示的软件控制功能。
参考文献
[1]MicosoftCorporation《,Visual Basic6.0 中文版语言参考手册》,1998.
[2]龚沛曾《.Visual Basic 程序设计与实用技术》.高等教育出版社,1998.
[3]牛又奇,孙建国《.新编 Visual Basic 程序设计教程》.苏州大学出版社,2002.
[4]朱友芹《.新编 Windows API 参考大全》,电子工业出版社,2000.* 基金项目
上海市科学技术委员会应用技术开发专项资金项目(项目编号:08-205)




