C#字节*到VB.NET位图数据扫描线

C#字节*到VB.NET位图数据扫描线,c#,vb.net,pointers,byte,C#,Vb.net,Pointers,Byte,如何转换C代码 bmd是位图数据 byte* scanline = (byte*)bmd.Scan0 + (y * bmd.Stride); 到VB.NET 在线C#to VB.net转换器给了我这句话 Dim scanline As Pointer(Of Byte) = CType(bmd.Scan0, Pointer(Of Byte)) + (y * bmd.Stride) 但未定义“指针”类型。在里面 VB.Net 我的选项是什么?谢谢你的建议。VB.NET不支持指针。只要VB.NE

如何转换C代码

bmd是位图数据

 byte* scanline = (byte*)bmd.Scan0 + (y * bmd.Stride);
到VB.NET

在线C#to VB.net转换器给了我这句话

Dim scanline As Pointer(Of Byte) = CType(bmd.Scan0, Pointer(Of Byte)) + (y * bmd.Stride)
但未定义“指针”类型。在里面 VB.Net


我的选项是什么?谢谢你的建议。

VB.NET不支持指针。只要VB.NET是您的需求,替代方案的速度就慢得令人不快,您就可以使用Marshal类。不必如此,Visual Studio非常支持在解决方案中添加C类库并在VB.NET代码中使用其类。

VB.NET不支持指针。只要VB.NET是您的需求,替代方案的速度就慢得令人不快,您就可以使用Marshal类。不必如此,Visual Studio非常支持向解决方案中添加C类库并在VB.NET代码中使用其类。

封送处理是唯一的方法。我以前做过这件事,很成功,但这是一件好事


元帅是这里唯一的出路。我以前做过这件事,很成功,但这是一件好事


这是我得到的确切信息,但一次通过就失败了。关于数组超出范围的某些内容可能与y*bmd.Stride有关(但我不理解为什么会出现超出范围的错误,因为它应该只复制原始内存字节,而不使用任何数组!)


这是我得到的确切信息,但一次通过就失败了。关于数组超出范围的某些内容可能与y*bmd.Stride有关(但我不理解为什么会出现超出范围的错误,因为它应该只复制原始内存字节,而不使用任何数组!)


我该如何解决我的问题?我得到了这个atm Dim扫描线(bmd.Width*PIXLESIZE)作为字节运行时.InteropServices.Marshal.Copy(bmd.Scan0,扫描线,(y*bmd.Stride),bmd.Width*PIXLESIZE),但一次通过就失败了。我该如何确切地解决我的问题?我得到了这个atm Dim扫描线(bmd.Width*PIXLESIZE)作为字节运行时.InteropServices.Marshal.Copy(bmd.Scan0,扫描线,(y*bmd.Stride),bmd.Width*PIXLESIZE),但一次通过后就失败了。这是因为您将复制数组偏移量设置为“(y*bmd.Stride)”?我将其设置为0,循环工作正常。。。(只是这一部分,而不是代码的实际工作区域,缺少一些其他内容)。还可以使用位“bytes=(y*bmd.Stride)”并将扫描线声明为Dim扫描线(bytes-1),我认为Scan0是指向正确数据的指针,因此在原始C代码中(Scan0+(yStride))=下一行像素数据的开始。这意味着scan0+(0*Stride)与scan0+0(无变化)=第一行相同,也就是说Stride=5120。它变为scan0+5120=下一行等。。扫描线始终保持一条线的长度。表示图像的宽度乘以4(像素大小),因为一个像素是4字节的数据。我使用了注释行,但它没有正常工作,所以我尝试重新制作它bmd.WidthPixelSize始终是扫描线的大小,所以它不应该溢出/超出任何范围。也许我正在尝试执行类似于此运行时的操作。InteropServices.Marshal.Copy(bmd.Scan0+(y*bmd.Stride),扫描线,0,bmd.Width*PixSize)这可能吗?啊,我知道这只在Framework v4.0中可能,但我不想安装它=]Dim scanline((bmd.Width*PIXLESIZE)-1)作为Byte Dim scanlinea As IntPtr=New IntPtr(bmd.Scan0.ToInt32+(y*bmd.Stride))'将RGB值复制到阵列中。Runtime.InteropServices.Marshal.Copy(scanlinea,scanline,0,bmd.Width*PIXLESIZE)是否因为您将复制数组偏移量设置为“(y*bmd.Stride)”?我将其设置为0,循环工作正常。。。(只是这一部分,而不是代码的实际工作区域,缺少一些其他内容)。还可以使用位“bytes=(y*bmd.Stride)”并将扫描线声明为Dim扫描线(bytes-1),我认为Scan0是指向正确数据的指针,因此在原始C代码中(Scan0+(yStride))=下一行像素数据的开始。这意味着scan0+(0*Stride)与scan0+0(无变化)=第一行相同,也就是说Stride=5120。它变为scan0+5120=下一行等。。扫描线始终保持一条线的长度。表示图像的宽度乘以4(像素大小),因为一个像素是4字节的数据。我使用了注释行,但它没有正常工作,所以我尝试重新制作它bmd.WidthPixelSize始终是扫描线的大小,所以它不应该溢出/超出任何范围。也许我正在尝试执行类似于此运行时的操作。InteropServices.Marshal.Copy(bmd.Scan0+(y*bmd.Stride),扫描线,0,bmd.Width*PixSize)这可能吗?啊,我知道这只在Framework v4.0中可能,但我不想安装它=]Dim scanline((bmd.Width*PIXLESIZE)-1)作为Byte Dim scanlinea As IntPtr=New IntPtr(bmd.Scan0.ToInt32+(y*bmd.Stride))'将RGB值复制到阵列中。在我看来,Runtime.InteropServices.Marshal.Copy(scanlinea,scanline,0,bmd.Width*PIXLESIZE)非常有趣,.NET framework是一个巨大的系统,它由许多实现(如Delphi.NET/C#/VB)包装。。因此,它们都应该具有相同的功能。。我猜VB.NET试图尽可能地简单地表示基本语言。虽然所有语言都有相同的代码?也许我错了。。但我为所有语言安装了一个.NET framework=PSupport,用于编写不安全代码在移植到.NET的语言中并不常见。例如,F#、IronPython、IronRuby、JScript也没有。等等。给C#团队买一支雪茄。在我看来非常有趣,.NET framework是一个巨大的系统,它由许多实现包起来,比如Delphi.NET/C#/VB。。因此,它们都应该具有相同的功能。。我猜VB.NET试图尽可能地简单地表示基本语言。虽然是在总统府之下,
' 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)
  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