2016-09-11 7 views
1

この問題を解決しようと1時間を費やした後、私は質問として決めました。VBが小数でオーバーフローを返す

私は画像関連のプロジェクトでVB.Net 2010を使用しています。このステップでは、2つの画像のピクセルの色を比較して、どれほど類似しているかを判断する必要があります。このコードが実行されると、オーバーフローがvalr = Math.Abs(act.GetPixel(x, y).R - map.GetPixel(x, y).R)一部で発生し

  ''get both images as bitmaps 

      Dim act As New Bitmap("cam.bmp") 
      Dim map As New Bitmap(bmap) 

      ''declare the variable that counts the different pixels 

      Dim count As Integer = 0 

      ''declare the variables that represent the colors 

      Dim val As Long = 0 
      Dim valr As Long = 0 
      Dim valg As Long = 0 
      Dim valb As Long = 0 

      ''analize both images pixel by pixel 

      For x = 1 To act.Width - 1 Step 1 

       For y = 1 To act.Height - 1 Step 1 

        valr = 0 
        valg = 0 
        valb = 0 

        ''determine how different the pixels are 

        valr = Math.Abs(act.GetPixel(x, y).R - map.GetPixel(x, y).R) 
        valg = Math.Abs(act.GetPixel(x, y).G - map.GetPixel(x, y).G) 
        valb = Math.Abs(act.GetPixel(x, y).B - map.GetPixel(x, y).B) 

        val = Long.Parse(Int((valr + valg + valb)/3).ToString) 

        ''if enough different, add 1 to count 

        If val > 50 Then 

         count += 1 

        End If 

       Next 

      Next 

      ''show how many pixels are different in proportion 

      MsgBox((count/(act.Width * act.Height)).ToString) 

:これを行うには、私は次のコードを設計しました。その他の問題は発生しません。

答えて

1

GetPixelColorを返し、Color.RByteを返します。あるバイトを別のバイトから減算すると、結果はバイトになりますが、バイトは符号なしで負の値を保持できません。 2番目の値が最初の値より大きい場合、Math.Absメソッドが呼び出される前にOverflowExceptionが発生します。

これを避けるには、CIntを使用して、BytesをIntegerに変換してから減算します。

valr = Math.Abs(CInt(act.GetPixel(x, y).R) - CInt(map.GetPixel(x, y).R)) 
valg = Math.Abs(CInt(act.GetPixel(x, y).G) - CInt(map.GetPixel(x, y).G)) 
valb = Math.Abs(CInt(act.GetPixel(x, y).B) - CInt(map.GetPixel(x, y).B)) 
+0

ありがとうございました!私の問題は解決しました。 – Elemermelada

関連する問題