2016-09-11 1 views
1

Проведя час, пытаясь решить эту проблему, я решил как вопрос.VB, возвращающий переполнение с небольшими номерами

Я использую VB.Net 2010 в проекте, связанном с изображением. На этом этапе мне нужно сравнить цвет пикселей двух изображений, чтобы определить, насколько они похожи. Для этого я разработал следующий код:

  ''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) 

При выполнении этого кода, переполнение происходит в valr = Math.Abs(act.GetPixel(x, y).R - map.GetPixel(x, y).R) части. Никакой другой проблемы не возникает.

ответ

1

Проблема заключается в том, что GetPixel возвращает Color и Color.R возвращает Byte. Когда вы вычитаете один байт из другого, результатом является байт, но байты без знака и не могут удерживать отрицательное значение. Если второе значение больше первого, вы получаете исключение OverflowException перед вызовом метода Math.Abs.

Чтобы избежать этого, вы можете использовать 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

Смежные вопросы