【正文】
l 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?!斎霔l件: RGB 參數(shù)在[0,1]范圍內(nèi) Max = pvMaximum(rR, rG, rB) Min = pvMinimum(rR, rG, rB) L = (Max + Min) / 2 39。計(jì)算飽和度 39?!遣噬J? If (Max = Min) Then S = 0 H = 0 39?!噬J? Else If (L = ) Then S = (Max Min) / (Max + Min) Else S = (Max Min) / (2 Max Min) End If 39?!?jì)算色度 delta = Max Min If (rR = Max) Then H = (rG rB) / delta ElseIf (rG = Max) Then H = 2 + (rB rR) / delta ElseIf (rB = Max) Then H = 4 + (rR rG) / delta End If End IfEnd Sub(2)HSLtoRGB函數(shù),該函數(shù)將HSL轉(zhuǎn)化成RGB。Public Sub HSLtoRGB(ByVal H As Single, ByVal S As Single, ByVal L As Single, R As Byte, G As Byte, B As Byte)39。代碼省略End Sub13 mINI模塊mINI類用于讀寫INI文件的數(shù)據(jù)。 (1)PutINI函數(shù)39。代碼省略,詳細(xì)代碼請(qǐng)參見光盤 (2)GetINI函數(shù)39。代碼省略,詳細(xì)代碼請(qǐng)參見光盤 14.mMisc模塊mMisc用于聲明一些系統(tǒng)中常用的函數(shù)。主要是進(jìn)行文件搜索的相關(guān)函數(shù),關(guān)于這些函數(shù),在本書文件搜索一張中有詳細(xì)說明。該模塊的代碼省略,請(qǐng)讀者參考光盤詳細(xì)代碼。15.mSettings模塊mSettings模塊用于讀寫注冊(cè)表信息。該類的代碼省略,請(qǐng)讀者參考光盤詳細(xì)代碼。16.mWheel模塊mWheel模塊用于對(duì)鼠標(biāo)的滾輪進(jìn)行編程。通過滾輪來放大或者縮小圖像。(1)HookWheel函數(shù)Public Sub HookWheel() 39?!?jiǎng)?chuàng)建回調(diào)函數(shù) m_OldWindowProc = SetWindowLong(, GWL_WNDPROC, AddressOf pvWindowProc)End Sub(2)pvWindowProc函數(shù),回調(diào)函數(shù);Private Function pvWindowProc(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Select Case wMsg Case WM_MOUSEWHEEL 39。如果是滾輪 With If (.) Then Select Case wParam Case Is 0 39。向上滾動(dòng) Call (0) 39。放大 Case Else Call (1) 39??s小 End Select End If End With End Select pvWindowProc = CallWindowProc(m_OldWindowProc, hWnd, wMsg, wParam, lParam)End Function17.ucCanvas控件ucCanvas為自定義開發(fā)控件,用來作為顯示和處理圖像的容器。該控件中定義了許多的事件、方法以及屬性。(1)mnuCrop菜單單擊事件,讀者可以參考ucCanvas控件的設(shè)計(jì),該控件中設(shè)計(jì)了幾個(gè)彈出式的菜單,分別為“Crop”、“Copy”、和“Remove Frame”。其中“Crop”表示剪切當(dāng)前被選擇的圖像區(qū)域、“Copy”表示復(fù)制被選擇的區(qū)域,而“Remove Frame”則表示取消選取。Private Sub mnuCrop_Click(Index As Integer) Dim TmpDIB As New cDIB Dim x1 As Long, y1 As Long Dim x2 As Long, y2 As Long Select Case Index Case 0 39。—Crop菜單 39。—獲得選取的坐標(biāo) Call (x1, y1, x2, y2) 39?!獮楸贿x擇的圖像創(chuàng)建臨時(shí)DIB Call (x2 x1, y2 y1) Call (, x1, y1) 39。—改變大小,然后將當(dāng)前圖像更改為被剪切的圖像 Call (x2 x1, y2 y1) Call () 39?!?jiǎng)h除選擇線 Call Call Call RaiseEvent Crop Case 1 39?!狢opy菜單 39?!@取坐標(biāo) Call (x1, y1, x2, y2) 39。—?jiǎng)?chuàng)建臨時(shí)DIB Call (x2 x1, y2 y1) Call (, x1, y1) 39?!獜?fù)制到剪貼板 Call Case 3 39?!∠x取 Call Call End SelectEnd Sub當(dāng)通過系統(tǒng)打開一副圖像后,通過工具欄或者菜單“Edit224。Crop Mode”可以使得當(dāng)前圖像處于裁減模式,可以用鼠標(biāo)直接在圖像上畫出螞蟻線,然后進(jìn)行剪切或者復(fù)制。如圖1616所示。 圖1616 對(duì)圖像進(jìn)行剪切或者復(fù)制編者手記默認(rèn)情況下,圖像處于“Scroll Mode”即移動(dòng)模式,當(dāng)顯示的圖像非常大,超過了顯示窗口的時(shí)候,可以左鍵按下鼠標(biāo),然后移動(dòng)鼠標(biāo)來查看圖像的各個(gè)部分。此時(shí),鼠標(biāo)會(huì)出現(xiàn)手的形狀 在ucCanvas控件中,有大量的函數(shù)和代碼,由于篇幅限制,請(qǐng)讀者參照本書光盤源代碼學(xué)習(xí)。18.cInfo控件ucInfo控件用于顯示當(dāng)前處理圖像的信息,如顯示當(dāng)前圖像的顯示比例、當(dāng)前圖像的路徑、當(dāng)前圖像的大小。其界面如圖1617所示。該控件 的代碼省略,請(qǐng)讀者參考光盤詳細(xì)代碼。圖1617 ucInfo控件19.ucProgress控件ucProgress控件用于顯示正在處理圖像的進(jìn)程。該類中使用了大量的API函數(shù)來進(jìn)行圖像處理進(jìn)程的管理。 該類的代碼省略,請(qǐng)讀者參考光盤詳細(xì)代碼。20.ucToolbar控件ucToolbar控件用于創(chuàng)建自定義的工具欄。其運(yùn)行界面如圖1618所示。該類中也使用了很多的API函數(shù)。該控件的代碼省略,請(qǐng)讀者參考光盤詳細(xì)代碼。圖1618 ucToolbar控件21.帶預(yù)覽功能的圖像選擇框 在介紹主窗體的時(shí)候,通過菜單“File224。Open”,會(huì)彈出圖像選擇框,如圖1619所示。為了實(shí)現(xiàn)預(yù)覽功能,本系統(tǒng)實(shí)現(xiàn)定義了一個(gè)預(yù)覽窗體,窗體的名稱為fDialogEx。其設(shè)計(jì)界面如圖1620所示。 圖1619 帶預(yù)覽功能的文件選擇對(duì)話框 圖1620 預(yù)覽窗體設(shè)計(jì)界面使用該擴(kuò)展對(duì)話框的語句是在主窗體的“mnuFile_Click”事件中,實(shí)現(xiàn)代碼如下:39。首先定義一個(gè)該窗體的實(shí)例Dim fDlg As New fDialogEx39。然后調(diào)用GetFileName來調(diào)用fDialogEx對(duì)話框?qū)嵗齭Ret = GetFileName(m_LastPath, Supported files|*.bmp。*.gif。*.jpg。*.png。*. tif|Bitmap files (*.bmp)|*.bmp|GIF files (*.gif)|*.gif|JPEG files (*.jpg)|*. jpg|PNG files (*.png)|*.png|TIFF files (*.tif)|*.tif, 0, Open, True, fDlg)通例,在圖像另存的時(shí)候,也會(huì)使用到該預(yù)覽對(duì)話框,如果保存成JPG格式,會(huì)讓用戶選擇保存的質(zhì)量,如圖1621所示。本系統(tǒng)能夠在各種常用的圖像格式之間進(jìn)行轉(zhuǎn)換。圖1621 質(zhì)量可調(diào)的保存對(duì)話框fDialogEx窗體的代碼省略,請(qǐng)讀者參考光盤詳細(xì)代碼。22.為圖像選擇材質(zhì)的窗體本系統(tǒng)中,有一種濾鏡效果就是為圖像增加各種材質(zhì)效果,因此在實(shí)現(xiàn)該功能值錢,需要選擇一種材質(zhì)圖片。選擇材質(zhì)的對(duì)話框名稱為fTexturize。在主界面中,通過菜單“Filter224。Special224。Texturize”,可以彈出該窗體,其界面如圖1622所示。 fTexturize窗體的代碼省略,請(qǐng)讀者參考光盤詳細(xì)代碼。22.更改圖像大小的窗體在主窗體中,通過菜單“Edit224。Resize”,可以彈出更改圖像大小的窗體,窗體名稱為fResize,其界面如圖1623所示。 圖1622 材質(zhì)選擇對(duì)話框 圖1623 改變圖像大小對(duì)話框用戶如果選擇“Maintain aspect ratio”,則表示高度和寬度按照原始比例進(jìn)行縮放。fResize窗體的代碼省略,請(qǐng)讀者參考光盤詳細(xì)代碼。23.顯示圖像信息的窗體在主主窗體中,單擊菜單【View224。Properties】,可以彈出顯示圖像信息的窗體,窗體名稱為fProperties,其運(yùn)行界面如圖1624所示。fProperties窗體的代碼省略,請(qǐng)讀者參考光盤詳細(xì)代碼。24.打印圖像的窗體在主窗體中,單擊菜單【File224。Print】,可以彈出打印圖像的窗體,如圖1625所示。該窗體名稱為fPrint。 圖1624 顯示圖像信息 圖1625 圖像打印設(shè)置窗體fPrint窗體的代碼省略,請(qǐng)讀者參考光盤詳細(xì)代碼。25.實(shí)現(xiàn)圖像全景的窗體 在主界面中,通過菜單“View224。Panoramic”可以進(jìn)入到圖像全景窗體。很多時(shí)候,需要將一個(gè)圖像放大到很多倍,比如進(jìn)行圖像裁減的時(shí)候,此時(shí)如果通過鼠標(biāo)或者鍵盤來移動(dòng)放大的圖像到想查看的區(qū)域,可能比較麻煩和費(fèi)時(shí),有了圖像全景的功能,就可以快速的定位到某個(gè)區(qū)域。全景運(yùn)行的界面如圖1626所示。圖1626 圖像全景視圖通過移動(dòng)上圖中的紅色方框(因?yàn)闀緸楹诎状蛴?,因此可能是灰色方框),就可以快速的查看到指定的圖像內(nèi)容。隨著圖像的進(jìn)一步放大,紅色的方框會(huì)越來越小。單擊圖1626中的“+”或者“”可以放大或者縮小圖像。 該窗體中使用了大量的API函數(shù)來實(shí)現(xiàn)該功能。該窗體代碼省略。26.濾鏡效果查看窗體本系統(tǒng)提供了很多的濾鏡效果,通過主窗體的“Filter”菜單和“Adjust”菜單,可以對(duì)圖像進(jìn)行多種圖像的濾鏡處理。為了方便用戶預(yù)覽濾鏡處理效果,系統(tǒng)中提供了濾鏡效果預(yù)覽對(duì)話框。該窗體名稱為fFilter,通過菜單“Adjust224。Filter Browser”可以顯示出該對(duì)話框,界面如圖1627所示。該濾鏡窗體,選擇不同的濾鏡,其界面會(huì)根據(jù)該濾鏡的需要,顯示不同的選項(xiàng)。通過“Filter”下拉列表框,可以選擇各種本系統(tǒng)提供的濾鏡,如圖1628所示。 圖1627 濾鏡預(yù)覽窗體 圖1628 濾鏡選擇框關(guān)于數(shù)字圖像處理系統(tǒng)的核心功能和代碼,就介紹到此。由于本系統(tǒng)比較龐大,而且有一定的難度,讀者需要配合本書、光盤源代碼以及微軟提供的MSDN幫助,才能夠完全掌握本系統(tǒng)的精華內(nèi)容。