2012-08-02 2 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.G가 0보다 결과 이하 렌더링 것이고,없는는 byte에 저장 될 수있는 tmpColor.R보다 큰 발생시 tmpColor이 추측가 될 것이다 System.Color로 정의된다고 가정 .

한 가지 가능한 솔루션이

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 초이므로 모두를 AndAlso으로 바꾸면 사소한 성능이 향상 될 수 있습니다.

이 두 항목을 조합하면 코드가 전체적으로 읽기 쉽도록 만들 수 있습니다.

+0

Color to Int 변환이 트릭을 만들었습니다. 고마워요 :) – Sourav

+0

_ 이것 봐요. http://codereview.stackexchange.com/questions/14244/code-conversion-from-python-to-vb-net – Sourav

관련 문제