算术操作导致溢出.在较高的代码下方

  • 本文关键字:代码 操作 溢出 vb.net
  • 更新时间 :
  • 英文 :

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Compare(PictureBox1.Image, PictureBox2.Image)
End Sub
Public Function Compare(ByVal img1_ As Image, ByVal img2_ As Image) As Double
    Dim pixelNb As Integer = img1_.Width * img1_.Height
    Dim percent As Double = 100
    Dim resized_img2_ As Bitmap = ResizeBitmap(CType(img2_, Bitmap), img1_.Width, img1_.Height)
    For i As Integer = 0 To img1_.Width - 1
        For j As Integer = 0 To img1_.Height - 1
            percent -= ColorCompare((CType(img1_, Bitmap)).GetPixel(i, j), (CType(resized_img2_, Bitmap)).GetPixel(i, j)) / pixelNb
        Next
    Next
    Return percent
End Function
Public Function ResizeBitmap(ByVal b As Bitmap, ByVal nWidth As Integer, ByVal nHeight As Integer) As Bitmap
    Dim result As Bitmap = New Bitmap(nWidth, nHeight)
    Using g As Graphics = Graphics.FromImage(CType(result, Image))
        g.DrawImage(b, 0, 0, nWidth, nHeight)
    End Using
    Return result
End Function
Public Function ColorCompare(ByVal c1 As Color, ByVal c2 As Color) As Double
    Return Double.Parse((Math.Abs(c1.B - c2.B) + Math.Abs(c1.R - c2.R) + Math.Abs(c1.G - c2.G)).ToString()) * 100 / (3 * 255)
End Function

在此行中给出错误

Return Double.Parse((Math.Abs(c1.B - c2.B) + Math.Abs(c1.R - c2.R) +
           Math.Abs(c1.G - c2.G)).ToString()) * 100 / (3 * 255)

c1.b返回字节。一个字节的值为0-255,未签名,因此不能保持负值。

Dim a As Byte = 200
Dim b As Byte = 201
Dim x  = a - b

导致相同的溢出误差。更改为整数避免了错误。由于它正在扩大(没有数据丢失(,因此似乎并不需要演员。

    Dim a As Byte = 200
        Dim b As Byte = 201
        Dim c As Integer = a
        Dim d As Integer = b
        Dim x = c - d 

将您的颜色字节更改为整数,然后重试。

Dim g, h, i, j, k, l As Integer
g = c1.B
h = c2.B
i = c1.R
j = c1.R
k = c1.G
l = c1.G
Dim result As Double = CDbl(Math.Abs(g - h) + Math.Abs(i - j) + Math.Abs(k - l)) * 100 / (3 * 255)
    Return result

最新更新