2012-08-02 28 views
0

爲什麼這個簡單的皮膚檢測代碼總是返回消息=算術運算導致溢出。皮膚檢測代碼總是顯示「算術溢出」

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 

回答

0

假設tmpColor被定義爲System.Color,一個受過教育的猜測是,當發生這種錯誤tmpColor.G大於tmpColor.R更大,這將使得結果小於零,並且不能存儲到一個byte

一個可行的辦法來做到這一點

Dim r as integer = tmpColor.R 
Dim g as integer = tmpColor.G 
Dim b as integer = tmpColor.B 

,然後你的計算中使用這些新的值。它會使代碼更清晰一些(並且如果要在該if語句中進行強制轉換,則更清潔)。

另一種選擇是重新排序依靠的是減法的測試,並使用AndAlso操作:

(tmpColor.R - tmpColor.G > 15) And (tmpColor.R > tmpColor.G) 
'To 
(tmpColor.R > tmpColor.G) AndAlso (tmpColor.R - tmpColor.G > 15) 

AndAlso是VB.Net的短路邏輯和操作,並會導致評價表達停止在第一個False。由於您使用的是And s,因此全部替換爲AndAlso的性能可能會有所提高。

這兩個項目的組合可能會使整個代碼更具可讀性。

+0

這種顏色轉換爲Int技巧。謝謝:) – Sourav 2012-08-02 06:15:07

+0

_看看這個plz_ http://codereview.stackexchange.com/questions/14244/code-conversion-from-python-to-vb-net – Sourav 2012-08-02 06:39:09