Convert Byte* to VBNet

15/03/2009 - 08:58 von Ulrich Höltje | Report spam
Hallo, NG

Ich möchte folgende C# Function...

public static bool Invert(Bitmap b)
{
// GDI+ still lies to us - the return format is BGR, NOT RGB.
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width,
b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;

unsafe
{

byte * p = (byte *)(void *)Scan0;

int nOffset = stride - b.Width*3;
int nWidth = b.Width * 3;

for(int y=0;y<b.Height;++y)
{
for(int x=0; x < nWidth; ++x )
{
p[0] = (byte)(255-p[0]);
++p;
}
p += nOffset;
}
}
b.UnlockBits(bmData);
return true;
}

...nach VBNet Konvertieren.

Sharpdevelop konvertiert den ' byte* ' pointer so:
Dim p As Byte* = CByte(CType(Scan0, void*))

VBNet bemàngelt "end of" -Anweisung erwartet.

Wer kann mir helfen?

Gruß aus Hameln
Ulrich
 

Lesen sie die antworten

#1 Peter Fleischer
15/03/2009 - 09:50 | Warnen spam
"Ulrich Höltje" schrieb im Newsbeitrag
news:gpica3$eeq$01$
Hallo, NG

Ich möchte folgende C# Function...

public static bool Invert(Bitmap b)
...
unsafe
...
...nach VBNet Konvertieren.



Hi Ulrich,
unsafe und die direkte Adressrechnung wird duch VB nicht unterstützt. Man
kann den Umweg über ein Marshaling gehen. Besser ist es aber, die
betreffenden Routinen gleich in C zu schreiben und aus VB aufzurufen.

Ein Beispiel, wie man das konkrete Problem nur in VB.NET lösen kann, ist
nachfolgend dargestellt. Das Marshaling über eine Struktur bremst die
Anwendung aber sehr stark aus:

Option Infer On ' Only VB9
Option Strict On

Imports System.Drawing.Imaging

Imports System.Runtime.InteropServices

Public Class Form1

Dim pb As New PictureBox With {.Dock = DockStyle.Fill, _
.SizeMode = PictureBoxSizeMode.StretchImage}

Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Me.Controls.Add(pb)
Dim bmp As Bitmap = _
CType(Image.FromFile("C:\Me\Bilder\090314\pic_0284.jpg"), Bitmap)
Invert(bmp)
pb.Image = bmp
End Sub

Public Shared Function Invert(ByVal b As Drawing.Bitmap) As Boolean
' GDI+ still lies to us - the return format is BGR, NOT RGB.
Dim bmData As BitmapData = b.LockBits(New Rectangle(0, 0, b.Width, _
b.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb)

Dim stride As Integer = bmData.Stride
Dim Scan0 As System.IntPtr = bmData.Scan0
Dim p As IntPtr = Scan0
Dim nOffset As Integer = stride - b.Width * 3
Dim nWidth As Integer = b.Width * 3
For y = 0 To b.Height - 1
For x = 0 To nWidth - 1
Dim s As str = CType(Marshal.PtrToStructure(p, GetType(str)), str)
s.b = CType(255 - s.b, Byte)
Marshal.StructureToPtr(s, p, False)
p = New IntPtr(p.ToInt32 + 1)
Next
p = New IntPtr(p.ToInt32 + nOffset)
Next
b.UnlockBits(bmData)
Return True
End Function

Structure str
Public b As Byte
End Structure

End Class


Viele Grüsse
Peter

Ähnliche fragen