C# byte* to VB.NET BitmapData scanline
how do I convert C# code
bmd is BitmapData
byte* scanline = (byte*)bmd.Scan0 + (y * bmd.Stride);
to VB.NET?
Online C# to VB.net converter gave me this line
Dim scanline As Pointer(Of Byte) = CType(bmd.Scan0, Pointer(Of Byte)) + (y * bmd.Stride)
but Type 'Pointer' is not defined. in VB.Net?
What are my options开发者_如何转开发?, thanks for the advise.
Pointers are not supported in VB.NET. The alternatives are unpleasantly slow as long as VB.NET is your requirement, the Marshal class is all you got. It shouldn't have to be, adding a C# class library to your solution and using its classes in your VB.NET code is very well supported in Visual Studio.
Marshal is the only way here. I've done this before with much success, but it was anoying.
http://msdn.microsoft.com/en-us/library/system.drawing.imaging.bitmapdata.scan0.aspx
' Get the address of the first line.
Dim ptr As IntPtr = bmpData.Scan0
' Declare an array to hold the bytes of the bitmap.
' This code is specific to a bitmap with 24 bits per pixels.
Dim bytes As Integer = Math.Abs(bmpData.Stride) * bmp.Height
Dim rgbValues(bytes - 1) As Byte
' Copy the RGB values into the array.
System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes)
Here is what I got exactly but it fails after one pass. Something about the array being out of bounds probably something with the y*bmd.Stride (but i don't understand why a out of bounds error occurs there as it should just copy raw memory bytes no arrays are used!)
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
精彩评论