明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

用VB設(shè)計(jì)圖像濾鏡

[摘要]作者:任毅 PhotoShop圖像處理軟件最引人之處莫過于它的濾鏡功能,如果你掌握了一些VB的知識,那么你也能夠設(shè)計(jì)出圖像處理大師級的濾鏡效果!   ∈紫饶惚仨毩私釼B中圖像處理的一些基本知識。在VB中有兩個(gè)操作像素的基本方法:PSet和Point。PSet生成像素;Point則讀取像素值。...
作者:任毅

PhotoShop圖像處理軟件最引人之處莫過于它的濾鏡功能,如果你掌握了一些VB的知識,那么你也能夠設(shè)計(jì)出圖像處理大師級的濾鏡效果。

    首先你必須了解VB中圖像處理的一些基本知識。在VB中有兩個(gè)操作像素的基本方法:PSet和Point。PSet生成像素;Point則讀取像素值。并且顯示器上所能顯示的所有顏色都可以用RGB值來表示,VB中提供了RGB()函數(shù),有三個(gè)變量RGB(Red,Green,Blue),如RGB(255,0,0)表示紅色,RGB(255,255,0)表示黃色等。 VB中沒有提供將一個(gè)像素點(diǎn)的顏色返回成RGB值的函數(shù),但我們可以用以下方法獲得某一點(diǎn)的RGB值:

    Pi& = Picture.Point(X, Y)

    Red = Pi& Mod 256

    Green = ((pi& And &HFF00) / 256&) Mod 256&

    Blue = (pi1& And &HFF0000) / 65536

    有了以上知識,再通過一些濾鏡算法便可以產(chǎn)生一些很不錯(cuò)的濾鏡效果。在此以浮雕、木刻、油畫和燈光共四個(gè)濾鏡效果為例。

    具體操作步驟如下:

    新建一個(gè)窗體 Form1,在圖體上建立一個(gè)Picture1圖像框,將其AutoSize的值設(shè)為 Ture,然后用Picture1的LoadPicture()命令調(diào)入一幅圖像,再通過各種事件調(diào)用過濾過程(這里以Picture1_Click()事件來調(diào)用)。

  以下為具體代碼:

    Private Sub Form_Load()

     Form1.AutoRedraw = True

     Form1.ScaleMode = 3

     Picture1.AutoRedraw = True

     Picture1.ScaleMode = 3

     Picture1.Picture = LoadPicture(圖像文件全途徑名)

    End Sub

  浮雕
浮雕的算法是在相鄰像素的差值上加上一個(gè)常數(shù),使黑暗區(qū)域增加一些亮度,我們可以取同一行、同一列或?qū)蔷上的相鄰像素間的差值加上一個(gè)常數(shù)。

   Private Sub Picture1_Click()

    Dim pi1&, pi2&

    Dim x, y

    Dim A, B As Integer

    Dim Red, Green, Blue As Integer

   A = 1

    B = 1

    xx = Picture1.ScaleWidth

    yy = Picture1.ScaleHeight

    For x = 1 To xx - 2

     For y = 1 To yy - 2

     pi1& = Picture1.Point(x, y)

    pi2& = Picture1.Point(x + A, y + B)

    Red = Abs((pi1& Mod 256) - (pi2& Mod 256) + 128)

    Green = Abs((((pi1& And &HFF00) / 256&) Mod 256&) - (((pi2& And &HFF00) / 256&) Mod 256&) + 128)

    Blue = Abs(((pi1& And &HFF0000) / 65536) - ((pi2& And &HFF0000) / 65536) + 128)

    Picture1.PSet (x, y), RGB(Red, Green, Blue)

    Next y

    Next x

    Picture1.Refresh

    End Sub

  油畫

    油畫濾鏡的算法是:用當(dāng)前點(diǎn)四周一定范圍內(nèi)任一點(diǎn)的顏色來代替當(dāng)前點(diǎn)的顏色。

   Private Sub Picture1_Click()

   Dim pi&

    Dim x, y

   Dim A, B As Integer

   Dim Red, Green, Blue As Integer

   xx = Picture1.ScaleWidth

   yy = Picture1.ScaleHeight

   For x = 2 To xx - 3

    For y = 2 To yy - 3

   A = Rnd * 3 - 1

  B = Rnd * 3 - 1

   pi = Picture1.Point(x + A, y + B)

    Red = (pi& Mod 256)

    Green = (((pi& And &HFF00) / 256&) Mod 256&)

    Blue = ((pi& And &HFF0000) / 65536)

    Picture1.PSet (x, y), RGB(Red, Green, Blue)

    Next y

    DoEvents

    Next x

    Picture1.Refresh

   End Sub

  木刻(圖三)

    這個(gè)濾鏡的算法相對簡單一點(diǎn)。只需判斷當(dāng)前點(diǎn)是淺色還是深色(即三顏色元素的平均值是否大于128),淺色用白色RGB(255,255,255)代替;深色用黑色RGB(0,0,0)代替。

   Private Sub Picture1_Click()

    Dim pi&

    Dim x, y

    Dim A, B As Integer

    Dim Red, Green, Blue As Integer

    A = 1

    B = 1

    xx = Picture1.ScaleWidth

    yy = Picture1.ScaleHeight

    For x = 0 To xx

    For y = 0 To yy

    pi = Picture1.Point(x, y)

   Red = (pi& Mod 256)

   Green = (((pi& And &HFF00) / 256&) Mod 256&)

   Blue = ((pi& And &HFF0000) / 65536)

   If (Red + Green + Blue) / 3 < 128 Then

   Picture1.PSet (x, y), RGB(0, 0, 0)

   Else

   Picture1.PSet (x, y), RGB(255, 255, 255)

   End If

   Next y

   Next x

   Picture1.Refresh

   End Sub

  燈光

    燈光濾鏡的算法很多,這里介紹一種小口徑燈光濾鏡,具體算法是取一點(diǎn)為光源(這里以30,40為例),從光線末端開始向光源點(diǎn)逐漸增加亮度(向白色接近)。代碼為:

   Private Sub Picture1_Click()

    Dim pi1&, pi2&

    Dim x, y

    Dim A, B As Integer

    Dim Red, Green, Blue As Integer

    A = 30

    B = 40

    xx = Picture1.ScaleWidth

    yy = Picture1.ScaleHeight

    For x = 1 To xx

    For y = 1 To yy

    pi1 = Picture1.Point(x, y)

   If Sqr((A - x) * (A - x) + (B - y) * (B - y)) - 40 < 0 Then

   Red = ((pi1& Mod 256) + 200 * (1 - (Sqr((A - x) * (A - x) + (B - y) * (B - y)) + 1) / 40))

   Green = ((((pi1& And &HFF00) / 256&) Mod 256&) + 200 * (1 - (Sqr((A - x) * (A - x) + (B - y) * (B - y)) + 1) / 40))

   Blue = (((pi1& And &HFF0000) / 65536) + 200 * (1 - (Sqr((A - x) * (A - x) + (B - y) * (B - y)) + 1) / 40))

   If Red < 0 Then Red = 0

   If Red > 255 Then Red = 255

   If Green < 0 Then Green = 0

   If Green > 255 Then Green = 255

   If Blue < 0 Then Blue = 0

   If Blue > 255 Then Blue = 255

   Picture1.PSet (x, y), RGB(Red, Green, Blue)

   End If

   Next y

   Next x

   Picture1.Refresh

   End Sub