摘 要:考生肖像信息的即時采集越來越多地被應用到招生考試工作中。文章介紹了如何在Windows系統上運用Debhi 7和DSPack快速開發基于Direct Show技術的數碼攝像程序。
關鍵詞:數碼攝像;DSPack;DirectX;Direct Show
0 引言
在招生信息采集工作中,一個非常重要的部分就是采集考生的肖像信息。隨著考生人數的激增與工作要求的提高,肖像采集模式的不斷調整,從最早的掃描儀掃描照片、數碼相機聯機拍攝一直到現在的視頻捕獲卡+攝像機快速采集,以不斷適應招生形勢的變化。我們把聯機直接拍攝考生肖像的程序叫數碼攝像程序。對于數碼攝像程序,早期大多利用Video forWindow編寫,它支持的設備種類少,且實現難度較高。現在利用Direct Show可以開發出支持攝像頭、內置或外置視頻采集卡、1394卡、內置或外置電視卡等多種設備的數碼攝像程序,但直接用Direct Show開發,難度同樣很高且開發效率也不高。可是有了DSPack情況就完全不同了,利用它來開發一個數碼攝像程序,幾乎是一件輕而易舉的事情。
DSPack是一組封裝了MS Direct Show和DirectX技術的組件,用于在安裝了DirectX9的Windows 9x、ME、2000和Windows XP系統上的多媒體應用系統的開發。它支持Delphi5、6、7和C++ Builder 6,它不僅功能強大而且完全免費。本文對利用DSPack開發視頻捕獲方式的數碼攝像程序做一個粗淺的介紹。
1 DSPack的安裝
DSPack的下載地址為: http://www.progdigy.com/modules.php?name=DSPack,當前版本是2.3.4。為了避免不必要的麻煩,先要確認系統中已裝上了DirectX9,然后再安裝DSPack。如果想進行VMR、Direct3D或ASF方面的開發,則還需要下載并安裝一些別的內容(請參考所下載的DSPack234.zip中所含Readme.htm中文件的相關內容)。下面是DSPack的安裝步驟:
(1)將DSPack解壓至任意目錄。假設解壓至Programfiles\\DSPack目錄,然后查看,有沒有只讀屬性的文件,如果有,請把只讀屬性去掉;
(2)以Delphi 7為例,在Tools>Environment Options>Li-brary>Library path中,添加以下搜索路徑:
Program files\\DSPack\\src\\Directx9
Program files\\DSPack\\src\\DSPack
(3)用Files>open分別打開Program files\\packages下的DirectX9_D7.dpk和DSPack_D7.dpk按Compile鈕進行編譯;
(4)最后打開Program files\\packages下的DSPackDesign_D7.dpk,按Install鈕進行安裝。
以上步驟如果順利完成,并且在Delphi工具欄上出現了如圖1所示的DSPack工具欄,則安裝成功。

2 一個最基本的攝像程序功能概述
它由預覽窗口、取景框、照片名輸入框、拍攝鈕、照片和設備連接與設置這六個部分組成。其使用步驟與方法為:首先,在程序運行時所顯示的視頻設備下拉列表中,選中其中一個(如果有多個的話),按連接按鈕,程序就會連接指定的視頻設備,如果連接正常就會在預覽窗口中即時顯示被拍攝對像;然后輸入照片名,自由拖動取景框,框住要拍攝的部分(通常是頭像),按拍攝按鈕就可以把取景框中的內容拍攝下來顯示在照片上,并同時保存為“照片名.jpg”。
圖2所示,這是通過一個Logitech QuickCam Pro 4000攝像頭拍攝某游戲雜志的封面女主角所看到的程序運行效果截圖。

3 關鍵點說明
(1)所用到的DSPack組件
FilterGraph、Filter、SampleGrabber和VideoWindow各一個,將Filter、SampleGrabber和VideoWindow的FilterGraph屬性都設置成FilterGraph的name,并注意將FilterGraph的Mode屬性設置成gmCapture。
DSPack及普通VCL的組件分布如圖3所示。

(2)視頻設備的聯接因為是要用來拍攝照片,所以我們要求只列出支持DireShow的視頻設備就可以了,否則在設備列表中將出現一大堆與應用無關的設備。方法是聲明一個TsysDevEnum型變量sysdev,在表單的OnCreate中,利用TSysDevEnum.Create(CLSID_VideolnputDeviceCategory)把視頻設備列表取到sysdev中。
(3)取景框的制作
如果用Video for Window方式開發過視頻捕獲程序,就會知道要在一個視頻流上放一個框不是一件容易的事——任何控件往上一放,只要一連接視頻,它就會消失。傳統的辦法是放一個Timer,在OnTimer事件中不停地調用API直接寫屏畫框。這種方式控制起來比較復雜,常常會由于interval設置得不當或因為機器性能的差異,出現取景框拖動時的軌跡殘留與閃爍現象。在DSPack中可以用DSVideoWindowEx2來代替VideoWindow,因為它有Canvas,而且可以把視頻輸出到任何有Handle的控件上。如何利用它的這一特性來做可以移動的取景框,可以參考DSPack自帶的一個例子(在Dspack'tDemoskDSVideoWindowEXkPlayWin中)。其實,用第二種方法也不簡單。更簡單更直接的辦法是可以在SampleGrabber的OnBuffer事件中,利用其GetBitmap方法,將視頻流導向到一個普通的Image上,而在一個\romage上,可以想放什么就放什么,控制起來很方便。因為窗口上沒有必要放兩個一樣的視頻,所以把VideoWindow的高和寬都設置成了0。這是個典型的懶人懶辦法,其它副作用沒發現,只是多了個Image。
(4)視頻設備的屬性設置
有時候連接到程序中的視頻設備并沒有工作在想要的模式中,或者為了利用它們自帶的一些功能,來改善畫面的質量,而又想在程序中直接調出如圖4所示的設置窗口時,就需要用到DsUtil的HaveFilterPropertyPage()、ShowFilterPropertyPage()和ShowPinpropertyPageO了。

4 結束語
本文對“數碼攝像”的主要功能(6種)作了介紹,并描述了如何實現一個最基本的數碼攝像應用過程,但在實際中要考慮的因素問題還有很多,如:錯誤控制、自適應視頻流的大小、允許視頻的縮放、照片的存儲控制、操作人員的權限控制、頭像的自動切割等等。