Vb.net 皮肤检测代码始终显示“;算术溢出“;

Vb.net 皮肤检测代码始终显示“;算术溢出“;,vb.net,image-processing,Vb.net,Image Processing,为什么这个简单的皮肤检测代码总是返回消息=算术运算导致溢出。 xMax = bmp.Width - 1 : yMax = bmp.Height - 1 For y = 0 To yMax For x = 0 To xMax tmpColor = fixColor(bmp.GetPixel(x, y)) If (((tmpColor.R > 95) And (tmpColor.G > 40) And (tmpColor.B > 20) And

为什么这个简单的皮肤检测代码总是返回消息=算术运算导致溢出。

xMax = bmp.Width - 1 : yMax = bmp.Height - 1
For y = 0 To yMax
    For x = 0 To xMax
       tmpColor = fixColor(bmp.GetPixel(x, y))
       If (((tmpColor.R > 95) And (tmpColor.G > 40) And (tmpColor.B > 20) And (tmpColor.R - tmpColor.G > 15) And (tmpColor.R > tmpColor.G) And (tmpColor.R > tmpColor.B)) Or _
                ((tmpColor.R > 220) And (tmpColor.G > 210) And (tmpColor.B > 170) And (tmpColor.R - tmpColor.G <= 15) And (tmpColor.R > tmpColor.B) And (tmpColor.G > tmpColor.B))) Then bmp.SetPixel(x, y, Color.Black)
    Next x
Next y
xMax=bmp.Width-1:yMax=bmp.Height-1
对于y=0到yMax
对于x=0到xMax
tmpColor=fixColor(bmp.GetPixel(x,y))
如果((tmpColor.R>95)和(tmpColor.G>40)和(tmpColor.B>20)和(tmpColor.R-tmpColor.G>15)和(tmpColor.R>tmpColor.G)和(tmpColor.R>tmpColor.B))或_
((tmpColor.R>220)和(tmpColor.G>210)和(tmpColor.B>170)和(tmpColor.R-tmpColor.G tmpColor.B)和(tmpColor.G>tmpColor.B)),然后bmp.SetPixel(x,y,Color.Black)
下一个x
下一个y

假设
tmpColor
被定义为
System.Color
,一个有根据的猜测是,当此错误发生时
tmpColor.G
大于
tmpColor.R
,这将使结果小于零,并且无法存储到
字节中

一个可能的解决办法是这样做

Dim r as integer = tmpColor.R
Dim g as integer = tmpColor.G
Dim b as integer = tmpColor.B
然后在计算中使用这些新值。这将使代码更干净一些(如果在if语句中进行转换,则代码会更干净)

另一种选择是根据该减法重新排序测试,并使用运算符:

(tmpColor.R - tmpColor.G > 15) And (tmpColor.R > tmpColor.G)
'To
(tmpColor.R > tmpColor.G) AndAlso (tmpColor.R - tmpColor.G > 15)
AndAlso
是VB.Net的短路逻辑and运算符,它将导致表达式的计算在第一个
False
时停止。由于您只使用了
s,因此将它们全部替换为
可能会看到性能的轻微提高

总的来说,这两项的组合可能会使代码更具可读性。

看看这个plz