【正文】
域以及調(diào)色板等等。對(duì)象使用的所有系統(tǒng)資源都會(huì)被釋放。Private Declare Function DeleteObject Lib gdi32 (ByVal hObject As Long) As Long(9)BitBlt函數(shù)將一幅位圖從一個(gè)設(shè)備場(chǎng)景復(fù)制到另一個(gè)。源和目標(biāo)DC相互間必須兼容。Private Declare Function BitBlt Lib gdi32 (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long(10)StretchBlt函數(shù)將一幅位圖從一個(gè)設(shè)備場(chǎng)景復(fù)制到另一個(gè)。源和目標(biāo)DC相互間必須兼容。這個(gè)函數(shù)會(huì)在設(shè)備場(chǎng)景中定義一個(gè)目標(biāo)矩形,并在位圖中定義一個(gè)源圖像。源矩形會(huì)根據(jù)需要進(jìn)行伸縮,以便與目標(biāo)矩形的大小相符。Private Declare Function StretchBlt Lib gdi32 (ByVal hDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long(11)SetStretchBltMode函數(shù)指定StretchBlt 和 StretchDIBits函數(shù)的伸縮模式。這種伸縮模式定義了Windows如何對(duì)伸縮過(guò)程中剔除的掃描線進(jìn)行控制。對(duì)于VB窗體和控件,倘若在API繪圖過(guò)程中使用這個(gè)函數(shù),建議恢復(fù)原來(lái)的StretchBlt模式。Private Declare Function SetStretchBltMode Lib gdi32 (ByVal hDC As Long, ByVal nStretchMode As Long) As Long(12)GetDIBColorTable函數(shù)選入設(shè)備場(chǎng)景的DIBSection中取得顏色表信息Private Declare Function GetDIBColorTable Lib gdi32 (ByVal hDC As Long, ByVal un1 As Long, ByVal un2 As Long, lpRGBQuad As Any) As Long(13)GetDIBits函數(shù)將來(lái)自一幅位圖的二進(jìn)制位復(fù)制到一幅與設(shè)備無(wú)關(guān)的位圖里Private Declare Function GetDIBits Lib gdi32 (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpbi As Any, ByVal wUsage As Long) As Long(14)SetRect函數(shù)設(shè)置指定矩形的內(nèi)容Private Declare Function SetRect Lib user32 (lpRect As RECT2, ByVal x1 As Long, ByVal y1 As Long, ByVal x2 As Long, ByVal y2 As Long) As Long(15)FillRect函數(shù)用指定的刷子填充一個(gè)矩形Private Declare Function FillRect Lib user32 (ByVal hDC As Long, lpRect As RECT2, ByVal hBrush As Long) As Long(16)CreateSolidBrush函數(shù)用純色創(chuàng)建一個(gè)刷子Private Declare Function CreateSolidBrush Lib gdi32 (ByVal crColor As Long) As Long(17)CreatePalette函數(shù)創(chuàng)建調(diào)色板 Private Declare Function CreatePalette Lib gdi32 (lpLogPalette As Any) As Long(18)GetDC函數(shù)獲取指定窗口的設(shè)備場(chǎng)景Private Declare Function GetDC Lib user32 (ByVal hWnd As Long) As Long(19)GetDesktopWindow函數(shù)獲得代表整個(gè)屏幕的一個(gè)窗口(桌面窗口)句Private Declare Function GetDesktopWindow Lib user32 () As Long(20)ReleaseDC函數(shù)釋放由調(diào)用GetDC或GetWindowDC函數(shù)獲取的指定設(shè)備場(chǎng)景。它對(duì)類或私有設(shè)備場(chǎng)景無(wú)效Private Declare Function ReleaseDC Lib user32 (ByVal hWnd As Long, ByVal hDC As Long) As Long(21)OpenClipboard函數(shù)打開剪貼板Private Declare Function OpenClipboard Lib user32 (ByVal hWnd As Long) As Long(22)CloseClipboard函數(shù)關(guān)閉剪貼板 Private Declare Function CloseClipboard Lib user32 () As Long(23)SetClipboardData函數(shù)設(shè)定剪貼板的數(shù)據(jù)Private Declare Function SetClipboardData Lib user32 (ByVal wFormat As Long, ByVal hMem As Long) As Long(24)EmptyClipboard函數(shù)清空剪貼板 Private Declare Function EmptyClipboard Lib user32 () As Long(25)DeleteObject函數(shù)刪除GDI對(duì)象,比如畫筆、刷子、字體、位圖、區(qū)域以及調(diào)色板等等。對(duì)象使用的所有系統(tǒng)資源都會(huì)被釋放Private Declare Function DeleteObject Lib gdi32 (ByVal hObject As Long) As Long本系統(tǒng)中還使用了其他一些API函數(shù),讀者可以參考相關(guān)的資料。3.常用圖像處理原理本系統(tǒng)實(shí)現(xiàn)了很多的圖像處理的功能,但是每種圖像處理都有一定的理論基礎(chǔ),下面介紹一些常用的圖像處理的原理。(1)圖像的灰度處理圖像由彩色轉(zhuǎn)化為灰度的過(guò)程叫做灰度化,由于位圖為點(diǎn)陣圖像,它的每一個(gè)像素點(diǎn)有R、G、B三個(gè)分量組成,R、G、B的變化可以產(chǎn)生1600多萬(wàn)種顏色,Delphi中灰度化有幾種方法可以實(shí)現(xiàn):方法一:求出每一個(gè)像素點(diǎn)的R、G、B的平均值,然后把這個(gè)平均值賦給該像素點(diǎn)的R、G、B三個(gè)分量。方法二:求出每一個(gè)像素點(diǎn)R、G、B三個(gè)分量的最大值,然后把這個(gè)最大值賦給原來(lái)像素點(diǎn)的R、G、B三個(gè)分量。方法三:根據(jù) YUV的顏色空間,Y分量的物理含義就是亮度,它含了灰度圖的所有信息,只用Y分量就完全能夠表示出一幅灰度圖來(lái)。YUV和RGB之間有著如下的對(duì)應(yīng)關(guān)系: 利用上式,可以求出:Y=+0587G+根據(jù)R,G,B的值求出Y值后,將R,G,B值都賦值成Y,就能表示出灰度圖來(lái),這就是24位真彩色圖轉(zhuǎn)灰度圖的原理。(2)圖像的二值化 圖像的二值化的具體辦法是:通過(guò)設(shè)定閾值(Threshold),把灰度圖像變換成僅用兩個(gè)值(0或1)來(lái)分別表示的圖像目標(biāo)和圖像背景的二值圖像,其中目標(biāo)取值為1,背景值取值為0。實(shí)際的位圖(Bitmap)中,0對(duì)應(yīng)于RGB值均為0,1對(duì)應(yīng)于RGB值均為255,二值化圖像的方法很多,閾值的選擇是二值化圖像的關(guān)鍵。閾值的選擇主要可以分為兩類:全局閾值和局部閾值。全局閾值是對(duì)整個(gè)圖像采用一個(gè)閾值進(jìn)行劃分,例如固定閾值法二值化、判斷分析法二值化、基于灰度差直方圖的閾值法等。不同的灰度圖像,其灰度深度是存在差異的。同一幅灰度圖像,不同部位其明暗分布可能是不同的。因此,在對(duì)灰度圖像進(jìn)行二值化的過(guò)程中,如果選用全局閾值法顯然是不合適的。局部閾值是將圖像分成一些子塊,對(duì)于每一子塊選定一個(gè)閾值。其中動(dòng)態(tài)閾值法是一個(gè)變換方法,即在一個(gè)nn的子塊中,所有具有灰度級(jí)超過(guò)平均灰度值到255數(shù)據(jù)點(diǎn)變換1(即黑色),而另一些低于平均灰度值的數(shù)據(jù)點(diǎn)則變換到1(即白色)。具體作法如下:圖像分為nn的方塊,對(duì)每一個(gè)子塊計(jì)算其平均灰度值,然后將方塊中每個(gè)像素點(diǎn)的灰度值與平均灰度值進(jìn)行比較,若大于平均灰度值,則將該像素點(diǎn)灰度值置為255;反之則置為0。一般采用88的分塊大小的動(dòng)態(tài)閾值二值化方法能取得的效果最佳。(3)圖像對(duì)比度圖像對(duì)比度是指圖像上兩點(diǎn)問(wèn)信號(hào)的差異。在一幅灰階圖像上,信號(hào)的差異是通過(guò)灰度(或亮度)的明暗來(lái)體現(xiàn)的,高對(duì)比度意思是圖像上兩個(gè)不同觀察點(diǎn)一個(gè)非常暗,另一個(gè)非常亮,而低對(duì)比度表示兩點(diǎn)的相對(duì)亮度差別較小,當(dāng)在提高對(duì)比度時(shí),圖像中的暗色調(diào)變得更暗,亮色區(qū)域變得更亮,而人眼在辯認(rèn)一件事物時(shí),更多地是從色彩的差錯(cuò)對(duì)比中得出結(jié)論,因此更大的對(duì)比度會(huì)帶來(lái)更為醒目的效果。對(duì)比度的改變,往往使暗色調(diào)損失細(xì)節(jié),因此,在幾乎所有位圖處理軟件中,都將明暗度(Brightness)調(diào)整功能與對(duì)比度調(diào)整功能集中放在一起以便于使用。適當(dāng)?shù)剡M(jìn)行一些明暗調(diào)整,會(huì)讓整個(gè)圖像顯得更加自然。在Delphi程序設(shè)計(jì)中,一個(gè)簡(jiǎn)化的方法是:區(qū)間調(diào)節(jié)即首先設(shè)定一個(gè)閾值,通常是128;然后判斷像素點(diǎn)的R,G,B值,凡是大于128的,增加一個(gè)值,小于128的,減少一個(gè)值。(4)圖像平移初始坐標(biāo)為(x0,y0)的點(diǎn)經(jīng)過(guò)平移(tx,ty)(以向右,向下為正方向)后,坐標(biāo)變?yōu)椋▁1,y1)。這兩點(diǎn)之間的關(guān)系是x1=x0+tx;y1=y0+:它的逆變換:由于我們想知道的是平移后的圖像中每個(gè)像素的顏色。很顯然,該點(diǎn)是原圖中的某一點(diǎn)經(jīng)過(guò)平移后得到的,這兩點(diǎn)的顏色肯定是一樣的,所以只要知道了原圖那點(diǎn)的RGB值即可。那么到底新圖中的左上角點(diǎn)對(duì)應(yīng)原圖中的哪一點(diǎn)呢?將左上角點(diǎn)的坐標(biāo)(0,0)代入逆變換,得到x0=tx;y0=ty;所以新圖中的(0,0)點(diǎn)的顏色和原圖中(tx,ty)的一樣。也就是通過(guò)平移后的像素點(diǎn)的位置返回去求出原始點(diǎn)的像素位置,這樣就存在一個(gè)問(wèn)題:如果新圖中有一點(diǎn)(x1,y1),如果變化得到的(x0,y0)不在原圖中則把該點(diǎn)的RGB值統(tǒng)一設(shè)成白色(255,255,255),平移后的圖像沒(méi)有縮放,移出的部分被截?cái)?。?)圖像的旋轉(zhuǎn)圖像的旋轉(zhuǎn)其實(shí)就是圖像上像素點(diǎn)的坐標(biāo)變換,假如旋轉(zhuǎn)前某一點(diǎn)的坐標(biāo)位[x,y,1],旋轉(zhuǎn)后的坐標(biāo)為,在二維平面上點(diǎn)繞原點(diǎn)順時(shí)針旋轉(zhuǎn)角,則其變換矩陣為:坐標(biāo)的變換公式:旋轉(zhuǎn)前的圖像上的點(diǎn)如果用上述變換矩陣,則有可能多個(gè)點(diǎn)映射到同一個(gè)點(diǎn),為此我們采用坐標(biāo)的反變換公式,先求出旋轉(zhuǎn)后的圖像的點(diǎn)對(duì)應(yīng)的旋轉(zhuǎn)前的圖像上的點(diǎn),此時(shí)只需把旋轉(zhuǎn)前的點(diǎn)的像素值賦給旋轉(zhuǎn)后的相應(yīng)的點(diǎn),這種方法可以保證旋轉(zhuǎn)后的每一個(gè)點(diǎn)都能被賦值。反變換公式如下:此時(shí)的旋轉(zhuǎn)的中心點(diǎn)在圖像的原點(diǎn),也就是客戶區(qū)坐標(biāo)的左上角,如果要求旋轉(zhuǎn)的中心點(diǎn)為圖像的中心,則反變換公式修改如下:其中icenter和jcenter分別是旋轉(zhuǎn)前圖像的寬度和高度的一半,此時(shí)在內(nèi)存中動(dòng)態(tài)創(chuàng)建兩個(gè)位圖對(duì)象TempBmp和NewBmp,一個(gè)用于存放旋轉(zhuǎn)前的位圖(TempBmp),另一個(gè)則是存放旋轉(zhuǎn)后的位圖(NewBmp),位圖格式為24位真彩色。(6)圖像鏡像所謂的鏡像顯示,就是好像一幅圖像放在鏡頭里面,形成兩幅絕對(duì)對(duì)稱的圖像,具體操作時(shí)具有水平鏡向和垂直鏡像之分,這其中包括兩幅圖像的顯示過(guò)程,即正面圖像和反面圖像,正面圖像的顯示方法非常簡(jiǎn)單,關(guān)鍵之處是反面圖像的顯示過(guò)程,這其中涉及圖像的變形操作;實(shí)現(xiàn)圖像變形的一種簡(jiǎn)單方法是重新安排像素位置,比如左面和右面的像素條一一對(duì)換,即可得到水平方向的反面圖像,同樣通過(guò)上下像素條的對(duì)換則可得到垂直方向的反面圖像。為了得到更美觀的鏡像顯示效果,具體操作時(shí)不能先顯示一幅正常圖像,然后再顯示反面圖像,而需要兩個(gè)圖像時(shí)從交叉點(diǎn)向外顯示,這樣將形成特殊的屏幕效果。(7)圖像扭曲圖像扭曲的原理為將位圖圖像中的每一個(gè)像素點(diǎn)按照一定的半徑進(jìn)行逆時(shí)針旋轉(zhuǎn)到新的位置,旋轉(zhuǎn)的角度由該點(diǎn)的原始坐標(biāo)以及圖像的原始大小決定,整體效果就好像被扭曲了一樣。(8)圖像波浪效果與圖像的扭曲類似,在處理此類問(wèn)題的時(shí)候一般用反向求取法,即假如對(duì)一幅經(jīng)過(guò)波浪處理過(guò)的圖像上的一個(gè)像素點(diǎn)Pixels[i, j],通過(guò)坐標(biāo)的反變換,我們可以求出這個(gè)點(diǎn)所對(duì)應(yīng)的是原始位圖上的哪一個(gè)點(diǎn),求出原始圖上該點(diǎn)的坐標(biāo),例如波浪處理過(guò)的圖像上的一點(diǎn)為Pixels[XSrc,YSrc],而經(jīng)過(guò)坐標(biāo)反變換后得到對(duì)應(yīng)的點(diǎn)為Pixels[i,j],則只需Pixels[i, j]=Pixels[XSrc,YSrc],就實(shí)現(xiàn)像素點(diǎn)的顏色賦值。(9)顏色空間轉(zhuǎn)換對(duì)于任何3個(gè)單位化到[0,1]范圍內(nèi)得R、G、B值,其對(duì)應(yīng)的HSL模型中的H、S、L可由下面的計(jì)算: 公式(10)HSL轉(zhuǎn)換RGB,要先把S、L單位化,R、G、B也在[0,1]之間。當(dāng)H在[00