這裏是我得到確切但一個階段後失敗。關於數組越界的事情可能與y * bmd.Stride有關(但我不明白爲什麼出現越界錯誤,因爲它應該只是複製原始內存字節而沒有使用數組!)
Public Function findImages(ByVal bmd As BitmapData) As List(Of Point)
Dim results As New List(Of Point)()
foundRects = New List(Of Rectangle)()
For y As Integer = 0 To bmd.Height - 1
'oringinal code
'Dim scanline As Pointer(Of Byte) = CType(bmd.Scan0, Pointer(Of Byte)) + (y * bmd.Stride)
'mess is here
' gets address of the first line
'Dim ptr As IntPtr = bmd.Scan0
'Dim bytes As Integer = (y * bmd.Stride)
'If bytes = 0 Then bytes = bmd.Stride
Dim scanline(bmd.Width * PIXLESIZE) As Byte
'Copy the RGB values into the array.
Runtime.InteropServices.Marshal.Copy(bmd.Scan0, scanline, (y * bmd.Stride), bmd.Width * PIXLESIZE)
' --------------------------------
For x As Integer = 0 To bmd.Width - 1
Dim xo As Integer = x * PIXLESIZE
Dim buff As Byte() = {scanline(xo), scanline(xo + 1), scanline(xo + 2), &HFF}
Dim val As Integer = BitConverter.ToInt32(buff, 0)
' Pixle value from subimage in desktop image
If pixels.ContainsKey(val) AndAlso notFound(x, y) Then
Dim loc As Point = DirectCast(pixels(val), Point)
Dim sx As Integer = x - loc.X
Dim sy As Integer = y - loc.Y
' Subimage occurs in desktop image
If imageThere(bmd, sx, sy) Then
Dim p As New Point(x - loc.X, y - loc.Y)
results.Add(p)
foundRects.Add(New Rectangle(x, y, bmImage.Width, bmImage.Height))
End If
End If
Next
Next
Return results
End Function
我該如何解決我的問題?我得到這個atm昏暗的掃描線(bmd.Width * PIXLESIZE)作爲字節 Runtime.InteropServices.Marshal.Copy(bmd.Scan0,scanline,(y * bmd.Stride),bmd.Width * PIXLESIZE),但它失敗後通過。 – SSpoke 2010-11-24 16:34:17