提供一个实现几种图象滤镜的类
' Author: wgscd(自由奔腾)
'Date: 2005-05-20
Imports System
Imports System.Drawing
Imports System.Math
Namespace wgscd
Public Class 滤镜
Public row As Integer
Public image As image
Public bitmap As bitmap
'-----------------------------------
'原理是取原来RGB的分量的平均值
Public Function 黑白(ByVal Fimage As bitmap) As bitmap
Dim bb As Bitmap = Fimage
Dim i, j, r, g, b As Integer
Dim col As Color
For i = 0 To bb.Width - 1
For j = 0 To bb.Height - 1
r = bb.GetPixel(i, j).R
g = bb.GetPixel(i, j).G
b = bb.GetPixel(i, j).B
col = Color.FromArgb((r + g + b) / 3, (r + g + b) / 3, (r + g + b) / 3)
bb.SetPixel(i, j, col)
Next
row = i
Next
Return bb
End Function
'-------------------------------
'木刻
'这个滤镜的算法相对简单一点。只需判断当前点是浅色还是深色(即三颜色元素的平均值是否大于128),浅色用白色RGB(255,255,255)代替;深色用黑色RGB(0,0,0)代替。
Public Function 木刻(ByVal Fimage As bitmap) As bitmap
Dim bb As Bitmap = Fimage
Dim i, j, r, g, b As Integer
Dim col As Color
For i = 0 To bb.Width - 1
For j = 0 To bb.Height - 1
r = bb.GetPixel(i, j).R
g = bb.GetPixel(i, j).G
b = bb.GetPixel(i, j).B
If (r + g + b) / 3 > 128 Then
col = Color.FromArgb(255, 255, 255)
Else
col = Color.FromArgb(0, 0, 0)
End If
bb.SetPixel(i, j, col)
Next
row = i
Next
Return bb
End Function
'-----------------------------------------
'雕刻
' 将相邻的两个像素相减,得到的差加上127作为新的值,127可以改的,嘿嘿!
Public Function 雕刻(ByVal Fimage As bitmap) As bitmap
Dim bb As Bitmap = Fimage
Dim i, j, r, g, b As Integer
Dim col As Color
For i = 0 To bb.Width - 1
For j = 0 To bb.Height - 1
r = bb.GetPixel(i, j).R
g = bb.GetPixel(i, j).G
b = bb.GetPixel(i, j).B
If (r + g + b) / 3 > 128 Then
col = Color.FromArgb(255, 255, 255)
Else
col = Color.FromArgb(0, 0, 0)
End If
bb.SetPixel(i, j, col)
Next
row = i
Next
Return bb
End Function
'-----------------------------------------
'油画
' 油画滤镜的算法是:用当前点四周一定范围内任一点的颜色来代替当前点的颜色。
Public Function 油画(ByVal Fimage As bitmap, ByVal height As Integer) As bitmap
Dim bb As Bitmap = Fimage
Dim i, j, r, g, b, rndc As Integer
If height > bitmap.Width Or height < 0 Then
MsgBox("bad height !") '强度太大 ,height为强度。
Exit Function
End If
Dim col As Color
For i = 0 To bb.Width - 1
For j = 0 To bb.Height - 1
r = bb.GetPixel(i, j).R
g = bb.GetPixel(i, j).G
b = bb.GetPixel(i, j).B
rndc = Rnd() * height * (-1) ^ CInt((Rnd() * 3))
If rndc + i > bb.Width - 1 Or rndc + i < 0 Then
rndc = 0
End If
If rndc + j > bb.Height - 1 Or rndc + j < 0 Then
rndc = 0
End If
col = bb.GetPixel(rndc + i, rndc + j)
bb.SetPixel(i, j, col)
Next
row = i
Next
Return bb
End Function
'--------------------------------------
'灯光滤镜的算法很多,这里介绍一种小口径灯光滤镜,具体算法是取一点为光源(这里以30,40为例),从光线末端开始向光源点逐渐增加亮度(向白色接近
Public Function 灯光(ByVal Fimage As bitmap) As bitmap
Dim bb As Bitmap = Fimage
Dim col As Color
Dim pi1, pi2 As Integer
Dim x, y
Dim A, B As Integer
Dim Red, Green, Blue As Integer
A = 30
B = 40
Dim xx = bb.Width
Dim yy = bb.Height
For x = 0 To xx - 1
For y = 0 To yy - 1
pi1 = Color.White.B 'note this code
If Sqrt((A - x) * (A - x) + (B - y) * (B - y)) - 40 < 0 Then
Red = ((pi1 Mod 256) + 200 * (1 - (Sqrt((A - x) * (A - x) + (B - y) * (B - y)) + 1) / 40))
Green = ((((pi1 And &HFF00) / 256) Mod 256) + 200 * (1 - (Sqrt((A - x) * (A - x) + (B - y) * (B - y)) + 1) / 40))
Blue = (((pi1 And &HFF0000) / 65536) + 200 * (1 - (Sqrt((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
bb.SetPixel(x, y, Color.FromArgb(Red, Green, Blue))
End If
Next y
Next x
Return bb
End Function
'------------------------------------------
Public Function 灰度(ByVal Fimage As bitmap) As bitmap
Dim bb As Bitmap = Fimage
Dim i, j, r, g, b As Integer
Dim col As Color
For i = 0 To bb.Width - 1
For j = 0 To bb.Height - 1
r = (bb.GetPixel(i, j).R / 64) * 64
g = (bb.GetPixel(i, j).G / 64) * 64
b = (bb.GetPixel(i, j).B / 64) * 64
If r < 0 Then
r = 0
End If
If r > 255 Then
r = 255
End If
If g < 0 Then
g = 0
End If
If g > 255 Then
g = 255
End If
If b < 0 Then
b = 0
End If
If b > 255 Then
b = 255
End If
col = Color.FromArgb((r + g + b) / 3, (r + g + b) / 3, (r + g + b) / 3)
bb.SetPixel(i, j, col)
Next
row = i
Next
Return bb
End Function
End Class
End Namespace