开发者

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
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜