VB 实现photoshop魔棒工具 代码
VB 实现photoshop魔棒工具,建立选区并读出选区的像素数?
[解决办法]
帮楼主顶起来。。。
[解决办法]
路过,帮顶
[解决办法]
种子填充算法。下面代码仅供参考。
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的好像发过代码