一个实现几种图象滤镜的类

提供一个实现几种图象滤镜的类

' 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值