【正文】
轉(zhuǎn)的角度要是90的整數(shù)倍。 實例實現(xiàn)39。通常,對于要求很高的數(shù)字圖像處理,一般都是通過Visual C++來實現(xiàn),在Visual Basic中,如果要進行大規(guī)模的圖像處理,可以調(diào)用通過C++編譯的動態(tài)鏈接庫來實現(xiàn)。很多時候為了實現(xiàn)某個功能,或者實現(xiàn)代碼的管理,自己開發(fā)一個控件是一個很好的選擇。在圖169中,選擇“AciveX 控件”,然后單擊【打開】按鈕,創(chuàng)建后界面如圖1610所示。(2)添加屬性和方法為了能夠讓用戶能夠使用該控件,總是需要為該控件添加一些屬性和方法,下面介紹為控件添加屬性和方法。該函數(shù)用于設(shè)定屬性TextFile的值Public Property Let TextFile(ByVal New_TextFile As String) m_TextFile = New_TextFile Call RefreshEnd Property 39。【生成 】,其中“工程1”為創(chuàng)建的自定義控件工程的名稱,用戶可以通過工程屬性修改。這是一個非常有用的函數(shù),通過它我們可以用DIB替代DDB。Private Declare Function GetObject Lib gdi32 Alias GetObjectA (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long(6)GetObjectType函數(shù)判斷由指定句柄引用的GDI對象的類型Private Declare Function GetObjectType Lib gdi32 (ByVal hgdiobj As Long) As Long(7)SelectObject函數(shù)用于選擇對象。選定的對象會在設(shè)備場景的繪圖操作中使用。Private Declare Function DeleteObject Lib gdi32 (ByVal hObject As Long) As Long(9)BitBlt函數(shù)將一幅位圖從一個設(shè)備場景復(fù)制到另一個。這個函數(shù)會在設(shè)備場景中定義一個目標矩形,并在位圖中定義一個源圖像。對于VB窗體和控件,倘若在API繪圖過程中使用這個函數(shù),建議恢復(fù)原來的StretchBlt模式。3.常用圖像處理原理本系統(tǒng)實現(xiàn)了很多的圖像處理的功能,但是每種圖像處理都有一定的理論基礎(chǔ),下面介紹一些常用的圖像處理的原理。YUV和RGB之間有著如下的對應(yīng)關(guān)系: 利用上式,可以求出:Y=+0587G+根據(jù)R,G,B的值求出Y值后,將R,G,B值都賦值成Y,就能表示出灰度圖來,這就是24位真彩色圖轉(zhuǎn)灰度圖的原理。閾值的選擇主要可以分為兩類:全局閾值和局部閾值。因此,在對灰度圖像進行二值化的過程中,如果選用全局閾值法顯然是不合適的。一般采用88的分塊大小的動態(tài)閾值二值化方法能取得的效果最佳。適當(dāng)?shù)剡M行一些明暗調(diào)整,會讓整個圖像顯得更加自然。很顯然,該點是原圖中的某一點經(jīng)過平移后得到的,這兩點的顏色肯定是一樣的,所以只要知道了原圖那點的RGB值即可。反變換公式如下:此時的旋轉(zhuǎn)的中心點在圖像的原點,也就是客戶區(qū)坐標的左上角,如果要求旋轉(zhuǎn)的中心點為圖像的中心,則反變換公式修改如下:其中icenter和jcenter分別是旋轉(zhuǎn)前圖像的寬度和高度的一半,此時在內(nèi)存中動態(tài)創(chuàng)建兩個位圖對象TempBmp和NewBmp,一個用于存放旋轉(zhuǎn)前的位圖(TempBmp),另一個則是存放旋轉(zhuǎn)后的位圖(NewBmp),位圖格式為24位真彩色。(8)圖像波浪效果與圖像的扭曲類似,在處理此類問題的時候一般用反向求取法,即假如對一幅經(jīng)過波浪處理過的圖像上的一個像素點Pixels[i, j],通過坐標的反變換,我們可以求出這個點所對應(yīng)的是原始位圖上的哪一個點,求出原始圖上該點的坐標,例如波浪處理過的圖像上的一點為Pixels[XSrc,YSrc],而經(jīng)過坐標反變換后得到對應(yīng)的點為Pixels[i,j],則只需Pixels[i, j]=Pixels[XSrc,YSrc],就實現(xiàn)像素點的顏色賦值。因此要消除模糊,必須增強圖像中頻率高的空間頻率成分,即圖像的銳化(或細微層次強調(diào))。微分運算可用來求信號的變化率,因而具有加強高頻分量的作用。卷積是實現(xiàn)銳化的一個很好的變通。要求得正確的圖像信息則必須消除噪聲。圖像平滑亦分為空間域處理和頻譜域處理兩種。一般的鄰域有四點鄰域和八點鄰域,八點鄰域效果要好于四點鄰域,和銳化一樣,采用模板來編制程序。下面的實例是用33的窗口進行中值濾波,讀者也可以自己設(shè)置窗口大小。(14)邊緣檢測我們給出一個模板和一幅圖像,進行模板操作后的結(jié)果如下:不難發(fā)現(xiàn)原圖中左邊暗,右邊亮,中間存在著一條明顯的邊界,第三四列比其他列的灰度值高很多,人眼觀察時,就能發(fā)現(xiàn)一條很明顯的亮邊,其他區(qū)域都很暗,這樣就起到了邊沿檢測的目的。梯度是有方向的,和邊沿的方向總是正交(垂直)的,例如,對于圖像的轉(zhuǎn)置圖像,邊是水平方向的,可以用梯度是垂直方向的模板 檢測它的邊沿。有兩個,一個是檢測水平邊沿的即,一個是檢測垂直平邊沿的即。③ 高斯拉普拉斯算子由于噪聲點(灰度與周圍點相差很大的點)對邊沿檢測有一定的影響,所以效果更好的邊沿檢測器是高斯拉普拉斯(LOG)算子。要注意的是,我們處理的雖然是二值圖,但實際上是256級灰度圖,不過只用到了0和255兩種顏色。1.fMain窗體首先要來學(xué)習(xí)系統(tǒng)的主窗體的核心代碼。在該類中利用了大量的API函數(shù),在編程原理中已經(jīng)有介紹,這里就不再介紹了。—創(chuàng)建位圖頭 With m_tBIH .biSize = Len(m_tBIH) .biPlanes = 1 .biBitCount = 32 .biWidth = NewWidth .biHeight = NewHeight .biSizeImage = (4 * NewWidth) * NewHeight End With 39?!O(shè)置背景顏色 Call SetRect(tRect, 0, 0, NewWidth, NewHeight) hBrush = CreateSolidBrush(BackColor) Call FillRect(m_hDC, tRect, hBrush) Call DeleteObject(hBrush) Else Call End If End If 39。39。創(chuàng)建DIB lhDC = CreateCompatibleDC(0) If (lhDC 0) Then lhOldBmp = SelectObject(lhDC, ) 39?!@得調(diào)色板列表 Call GetDIBColorTable(lhDC,0,nColors,ByVal (nColors)) ReDim aData(1 To 40 + 4 * (2 ^ )) With tBIH .biSize = 40 .biPlanes = 1 .biBitCount = .biWidth = .biHeight = End With Call CopyMemory(aData(1), tBIH, 40) Call GetDIBColorTable(lhDC, 0, nColors, aData(41)) Call GetDIBits(lhDC, , 0, , ByVal (, , ), aData(1), DIB_ RGB_COLORS) End If 39。 刪除設(shè)備描述表 Call DeleteDC(clp_hDC) End If End If 39。4.cDIBFilter類模塊cDIBFilter類主要實現(xiàn)了各種常用濾鏡的實現(xiàn)。(1)Blur濾鏡39。代碼省略,詳細代碼請參見光盤 (3)Contrast濾鏡39。代碼省略,詳細代碼請參見光盤 (7)Negative濾鏡39。代碼省略,詳細代碼請參見光盤 (11)Relieve濾鏡39。代碼省略,詳細代碼請參見光盤 (15)Scanlines濾鏡39。代碼省略,詳細代碼請參見光盤 (19)Texturize濾鏡 39。6.cDIBSave類模塊cDIBSave類用于保存圖像數(shù)據(jù)?!@得圖像數(shù)據(jù)大小 Walg = (( * BPP + 31) \ 32) * 4 ReDim aData(Walg 1, 1) 39?!獎?chuàng)建保存圖像數(shù)據(jù)數(shù)組 ReDim aBI(1 To 40 + IIf(BPP = 8, 4 * (2 ^ BPP), 0)) Call CopyMemory(aBI(1), tBIH, 40) 39。 Palette based (Get palette indexes) aData() = () Case 24 39。該類的代碼省略,請讀者參考光盤詳細代碼。該模塊的代碼省略,請讀者參考光盤詳細代碼。帶預(yù)覽功能的文件選擇對話框界面請參考21小節(jié)。(1)RGBtoHSL函數(shù),該函數(shù)將RGB轉(zhuǎn)化成HSLPublic Sub RGBtoHSL(ByVal R As Byte, ByVal G As Byte, ByVal B As Byte, H As Single, S As Single, L As Single) Dim Max As Single Dim Min As Single Dim delta As Single Dim rR As Single, rG As Single, rB As Single 39?!噬J? Else If (L = ) Then S = (Max Min) / (Max + Min) Else S = (Max Min) / (2 Max Min) End If 39。 (1)PutINI函數(shù)39。該模塊的代碼省略,請讀者參考光盤詳細代碼。通過滾輪來放大或者縮小圖像。向上滾動 Call (0) 39。(1)mnuCrop菜單單擊事件,讀者可以參考ucCanvas控件的設(shè)計,該控件中設(shè)計了幾個彈出式的菜單,分別為“Crop”、“Copy”、和“Remove Frame”。—獲得選取的坐標 Call (x1, y1, x2, y2) 39?!狢opy菜單 39?!∠x取 Call Call End SelectEnd Sub當(dāng)通過系統(tǒng)打開一副圖像后,通過工具欄或者菜單“Edit224。此時,鼠標會出現(xiàn)手的形狀 在ucCanvas控件中,有大量的函數(shù)和代碼,由于篇幅限制,請讀者參照本書光盤源代碼學(xué)習(xí)。圖1617 ucInfo控件19.ucProgress控件ucProgress控件用于顯示正在處理圖像的進程。其運行界面如圖1618所示。Open”,會彈出圖像選擇框,如圖1619所示。首先定義一個該窗體的實例Dim fDlg As New fDialogEx39。*.png。22.為圖像選擇材質(zhì)的窗體本系統(tǒng)中,有一種濾鏡效果就是為圖像增加各種材質(zhì)效果,因此在實現(xiàn)該功能值錢,需要選擇一種材質(zhì)圖片。Texturize”,可以彈出該窗體,其界面如圖1622所示。 圖1622 材質(zhì)選擇對話框 圖1623 改變圖像大小對話框用戶如果選擇“Maintain aspect ratio”,則表示高度和寬度按照原始比例進行縮放。fProperties窗體的代碼省略,請讀者參考光盤詳細代碼。 圖1624 顯示圖像信息 圖1625 圖像打印設(shè)置窗體