用VB設(shè)計(jì)圖像濾鏡
發(fā)表時(shí)間:2024-02-17 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]作者:任毅 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