读书人

VB 实现photoshop魔棒工具 代码,该如何

发布时间: 2012-01-08 22:48:50 作者: rapoo

VB 实现photoshop魔棒工具 代码
VB 实现photoshop魔棒工具,建立选区并读出选区的像素数?

[解决办法]
帮楼主顶起来。。。
[解决办法]
路过,帮顶
[解决办法]
种子填充算法。下面代码仅供参考。

VB code
Const STACK_SIZE = 1000000Dim stackX(0 To STACK_SIZE) As IntegerDim stackY(0 To STACK_SIZE) As IntegerDim stackI As LongPrivate Function seedfill(ByVal sx As Integer, ByVal sy As Integer, ByVal cc As Long, ByVal fc As Long, ByVal mc As Long, ByVal bc As Long) As BooleanDim min_cd2 As LongDim cd As LongDim cd1 As LongOn Error Resume Next    min_cd2 = ColorDistance(fc, bc) '前景与背景色差    stackI = 0    x1 = 32767: x2 = -1: y1 = 32767: y2 = -1    push sx, sy    Do        pop        If XX = -1 And YY = -1 Then Exit Do        c = Pic.Point(XX, YY)        cd = ColorDistance(c, fc)        If c <> cc And cd < min_cd2 * seeddis Then            Pic.PSet (XX, YY), cc            If XX < x1 Then x1 = XX            If XX > x2 Then x2 = XX            If YY < y1 Then y1 = YY            If YY > y2 Then y2 = YY            If YY - 1 >= 0 And sy - MAX_XYD <= YY - 1 And YY - 1 < sy + MAX_XYD Then                push XX, YY - 1                If stackI = 0 Then                    Pic.Cls                    seedfill = False                    Exit Function                End If            End If            If YY + 1 < BVIH And sy - MAX_XYD <= YY + 1 And YY + 1 < sy + MAX_XYD Then                push XX, YY + 1                If stackI = 0 Then                    Pic.Cls                    seedfill = False                    Exit Function                End If            End If            If XX - 1 >= 0 And sx - MAX_XYD <= XX - 1 And XX - 1 < sx + MAX_XYD Then                push XX - 1, YY                If stackI = 0 Then                    Pic.Cls                    seedfill = False                    Exit Function                End If            End If            If XX + 1 < BVIW And sx - MAX_XYD <= XX + 1 And XX + 1 < sx + MAX_XYD Then                push XX + 1, YY                If stackI = 0 Then                    Pic.Cls                    seedfill = False                    Exit Function                End If            End If        End If    Loop'   Pic.Line (x1, y1)-(x2, y2), &HFFFF&, B    If x2 = -1 Or y2 = -1 Then        seedfill = False    Else        seedfill = True    End IfEnd FunctionPrivate Sub push(ByVal px As Integer, ByVal py As Integer)On Error Resume Next    stackX(stackI) = px    stackY(stackI) = py    If stackI < STACK_SIZE Then        stackI = stackI + 1    Else        MsgBox "堆栈溢出!"        stackI = 0    End IfEnd SubPrivate Sub pop()On Error Resume Next    If stackI <= 0 Then        XX = -1        YY = -1        Exit Sub    End If    stackI = stackI - 1    XX = stackX(stackI)    YY = stackY(stackI)End SubPrivate Function ColorDistance(ByVal c1 As Long, ByVal c2 As Long) As LongDim cd As LongDim h1, s1, b1, h2, s2, b2 As SingleOn Error Resume Next    If c1 = -1 Or c2 = -1 Then        ColorDistance = 1000000        Exit Function    End If    c2hsb (c1)    h1 = hsbH / 360    s1 = hsbS    b1 = hsbB    c2hsb (c2)    h2 = hsbH / 360    s2 = hsbS    b2 = hsbB    cd = Abs(h1 - h2)    cd = cd + Abs(s1 - s2)    cd = cd + Abs(b1 - b2)    ColorDistance = cdEnd FunctionPrivate Function Minimum(ParamArray Vals())Dim n As Integer, MinValOn Error Resume Next    MinVal = Vals(0)    For n = 1 To UBound(Vals)        If Vals(n) < MinVal Then MinVal = Vals(n)    Next n    Minimum = MinValEnd FunctionPrivate Function Maximum(ParamArray Vals())Dim n As Integer, MaxValOn Error Resume Next    MaxVal = Vals(0)    For n = 1 To UBound(Vals)        If Vals(n) > MaxVal Then MaxVal = Vals(n)    Next n    Maximum = MaxValEnd FunctionPrivate Sub c2hsb(ByVal clr As Long)Dim MyR As Single, MyG As Single, MyB As SingleDim Max As Single, Min As SingleDim MyS As SingleDim Delta As Single, MyVal As SingleDim cc As String * 6Dim r1, g1, b1 As ByteOn Error Resume Next    cc = Right("000000" + Hex$(clr), 6)    b1 = Val("&H" + Left(cc, 2))    g1 = Val("&H" + Mid(cc, 3, 2))    r1 = Val("&H" + Right(cc, 2))    MyR = r1 / 255: MyG = g1 / 255: MyB = b1 / 255    Max = Maximum(MyR, MyG, MyB)    Min = Minimum(MyR, MyG, MyB)    hsbB = Int(Max * 100)    If Max <> 0 Then        MyS = (Max - Min) / Max * 100    Else        MyS = 0    End If    hsbS = MyS    If hsbS = 0 Then        hsbH = 0    Else        Delta = Max - Min        Select Case Max        Case MyR            MyVal = (MyG - MyB) / Delta        Case MyG            MyVal = 2 + (MyB - MyR) / Delta        Case MyB            MyVal = 4 + (MyR - MyG) / Delta        End Select        MyVal = MyVal * 60        If MyVal < 0 Then MyVal = MyVal + 360        hsbH = MyVal    End If'   Debug.Print "hsb="; hsbH; " "; hsbS; " "; hsbBEnd Sub 


[解决办法]
有些东西是没有现成可以拿到的,不过下面这个可以参考一下。
http://www.pscode.com/vb/scripts/ShowZip.asp?lngWId=1&lngCodeId=71241&strZipAccessCode=tp%2FF712417101


[解决办法]
论坛有位做vb版的Photoshop的好像发过代码

读书人网 >VB

热点推荐