影像擷取物件之建立

 

首先是影像擷取物件 TCeyes 的宣告:

class TCeyes : public TGraphicControl

{

private:

TCeyesReadThread *CeyesReadThread;

Graphics::TBitmap *FBitmap;

TMemoryStream* ImageStream;

BITMAPINFOHEADER BmiHdr;

char *FImagePtr;

這表示我們創造的影像擷取物件 TCeyes 是從 TGraphicControl 繼承而來的。而 TCeyesReadThread 是我們用讀取影像的執行緒。也可以很明顯的看到,影像擷取物件TCeyes 中有自己的點矩陣對應 Bitmap和一個記憶體緩衝區 ImageStream。至於 BmiHdr 是用來處理點矩陣對應 Bitmap 格式圖形的檔頭。FImagePtr 則是影像擷取物件 TCeyes 自己用的指標。我們盡可能的保持一個習慣:私用的變數都以 F 開頭,如在此例的 FImagePtr ,表示是一指向影像的指標,且是私用的。接下的程式碼:

int FBrightness;

int FContrast;

int FHue;

int FSaturation;

這幾行的意思非常明顯:分別是亮度、對比、色調、飽和度,且都是私有的。如此設計是為了下面的性質

__published:

__property int Brightness={read=GetBrightness,write=SetBrightness};

__ property int Contrast={read=GetContrast,write=SetContrast};

__ property int Hue={read=GetHue,write=SetHue};

__ property int Saturation={read=GetSaturation,write=SetSaturation};

值得留意的是,GetBrightnessSetBrightnessGetContrastSetContrast等都是視訊卡所附的函式。以 GetBrightness 的宣告為例:

int __fastcall GetBrightness();

在此必須注意是 __published的語法,這個是 BCB C++ 的方言之一。__published會將在她以下的性質顯示到物件觀察器(Object Inspector)上。

在影像卡中抓入的尚未進一步處理的影像(raw image),其格式為 RGB,共 3 bytes,但是一般的影像儲存方法一個長整數(long integer)4 byte,格式為 RGBX,其中 X 為保留的 byte,而RGB分別是紅、綠、藍 (Red, Green, Blue),也就是每一個點(pixel) 4 bytes。為此我們必須撰寫一些方便的工具物件來控制影像擷取和處理影像色彩,例如撰寫工具TCeyesColor來方便處理色彩值,我們要把一整數值 113283 化成 RGBX 的格式,只要:

TCeyesColor TheColor(113283);

另外為了與 VCL TColor 相容,下面程式碼也是合法的:

TCeyesColor TheColorByVCL(clGreen);

其中 clGreen VCL 中綠色的定義值。

又例如撰寫出工具GetPixel 是傳入坐標值,以 TCeyesColor方式傳回該坐標的色彩值。

又例如撰寫出工具SetPixel 是直接設定坐標的色彩值。

又例如撰寫出工具FreezeImage 會將影像凍結,而工具 MeltImage 可繼續動態抓取影像。

又例如撰寫出工具CopyImageToSelfCanvas 是將影像更新到畫面,這在攔截OnInspire事件後相當有用,特別是你想一邊處理影像一邊顯示到畫面上。

工具SetImageResolution 是設定抓入影像的解析度,一般為 320x240。可到 640x480。工具GetImage 可以在凍解影像時抓取新影像到緩衝區。

下一頁 回首頁