2010-11-23 5 views
1

Comment convertir le code C#C# octet * à VB.NET BitmapData scanline

bmd est BitmapData

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

à VB.NET?

en ligne C# convertisseur VB.net m'a donné cette ligne

Dim scanline As Pointer(Of Byte) = CType(bmd.Scan0, Pointer(Of Byte)) + (y * bmd.Stride) 

mais le type 'pointeur' est pas défini. dans VB.Net?

Quelles sont mes options ?, merci pour le conseil.

Répondre

1

Marshal est le seul moyen ici. Je l'ai déjà fait avec beaucoup de succès, mais c'était 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) 
+0

Comment résoudre exactement mon problème? J'ai obtenu cet atm Dim scanline (bmd.Width * PIXLESIZE) Comme Byte Runtime.InteropServices.Marshal.Copy (bmd.Scan0, scanline, (y * bmd.Stride), bmd.Width * PIXLESIZE) mais il échoue après un passer. – SSpoke

3

Les pointeurs ne sont pas pris en charge dans VB.NET. Les alternatives sont désagréablement lentes tant que VB.NET est votre exigence, la classe Marshal est tout ce que vous avez. Cela ne devrait pas être nécessaire, en ajoutant une bibliothèque de classes C# à votre solution et en utilisant ses classes dans votre code VB.NET est très bien supporté dans Visual Studio.

+0

très drôle comme je le vois, .NET framework est un énorme système qui est enveloppé par de nombreuses implémentations telles que Delphi.NET/C#/VB .. alors ils devraient tous avoir les mêmes fonctionnalités .. Je suppose que VB.NET essaie d'être aussi nue que possible pour représenter être langauge BASIC. bien que sous le capot toutes les langues font le même code? peut-être que je me trompe ici .. mais j'installe un framework .NET pour tous les langages = P – SSpoke

+0

La prise en charge de l'écriture de code non sécurisé n'est pas courante dans les langages portés sur .NET. F #, IronPython, IronRuby, JScript ne l'ont pas non plus par exemple. Etc. Acheter l'équipe C# un cigare. –

0

Voici ce que je suis exactement, mais il échoue après un passage. Quelque chose sur le tableau hors limites probablement quelque chose avec le y * bmd.Stride (mais je ne comprends pas pourquoi une erreur hors limites se produit comme il devrait juste copier la mémoire brute octets pas de tableaux sont utilisés!)

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

Est-ce parce que vous définissez le décalage du tableau de copie sur "(y * bmd.Stride)"? J'ai mis ceci à 0 et la boucle fonctionne bien ... (juste cette partie, pas la zone réelle de cheval de bataille de votre code, une partie de l'autre substance est manquante). Utilisez aussi le bit "bytes = (y * bmd.Stride)" et déclarez scanline comme Dim scanline (octets - 1) – Tom

+0

comme je le vois est que Scan0 est le pointeur vers les données correctes donc dans le code C# original (scan0 + (y * Stride)) = début de la prochaine ligne de données de pixel. signifiant scan0 + (0 * Stride) même que scan0 + 0 (pas de changement) = première ligne donc disons Stride = 5120. il devient scan0 + 5120 = ligne suivante etc .. la ligne de balayage tient toujours la longueur d'une ligne. ce qui signifie la largeur de l'image fois 4 (pixelsize), car un pixel est de 4 octets de données. J'ai utilisé les lignes commentées cela ne fonctionnait pas correctement donc j'ai essayé de le refaire bmd.Width * PixelSize est toujours la taille de scanline donc il ne devrait pas déborder/hors des limites quoi que ce soit – SSpoke

+0

Peut-être que je voulais faire quelque chose comme ce Runtime.InteropServices.Marshal.Copy (bmd.Scan0 + (y * bmd.Stride), scanline, 0, bmd.Width * PIXLESIZE) Est-ce possible? – SSpoke