4

関数C#をVB.NETに渡す必要がありますが、C#には次のようなものがあります。

unsafe
{
    byte* pSmall = (byte*)(void*)smallData.Scan0;
    byte* pBig = (byte*)(void*)bigData.Scan0;

    int smallOffset = smallStride - smallBmp.Width * 3;
    int bigOffset = bigStride - bigBmp.Width * 3;

    bool matchFound = true;
    ....
}

いくつかのブログで、「安全でない」はVB.Netには存在しないと読んだ。問題は、代わりに何を使用できるかということunsafeです。

4

2 に答える 2

4

あなたが読んだブログは、VB.NET で安全でないコードを使用する方法がないという点で正しいです。ビットマップ ファイルを操作 (おそらくピクセル データを読み取る) したいようです。C# では、安全でないコードを使用して、メソッドよりもパフォーマンスを大幅に向上させることができますGetPixelVB.NET では、代わりにLockBitsを調べることができます。

このページに使い方の例があります。

Public g_RowSizeBytes As Integer
Public g_PixBytes() As Byte

Private m_BitmapData As BitmapData

' Lock the bitmap's data.
Public Sub LockBitmap(ByVal bm As Bitmap)
    ' Lock the bitmap data.
    Dim bounds As Rectangle = New Rectangle( _
        0, 0, bm.Width, bm.Height)
    m_BitmapData = bm.LockBits(bounds, _
        Imaging.ImageLockMode.ReadWrite, _
        Imaging.PixelFormat.Format24bppRgb)
    g_RowSizeBytes = m_BitmapData.Stride

    ' Allocate room for the data.
    Dim total_size As Integer = m_BitmapData.Stride * _
        m_BitmapData.Height
    ReDim g_PixBytes(total_size)

    ' Copy the data into the g_PixBytes array.
    Marshal.Copy(m_BitmapData.Scan0, g_PixBytes, _
        0, total_size)
End Sub

このページには、ビットマップのロックを解除する方法も示されています。

于 2012-12-20T00:48:51.913 に答える
0

それは私が作業バージョンであると私が思うものです:

Dim pSmall As Pointer(Of Byte) = CType(CType(smallData.Scan0, 
    Pointer(Of System.Void)), Pointer(Of Byte))

Dim pBig As Pointer(Of Byte) = CType(CType(bigData.Scan0, 
    Pointer(Of System.Void)), Pointer(Of Byte))

Dim smallOffset As Integer = smallStride - smallBmp.Width * 3
Dim bigOffset As Integer = bigStride - bigBmp.Width * 3

Dim matchFound As Boolean = True
于 2015-06-04T18:33:53.527 に答える