对比算法 C# 指向 marshal.copy 的指针

本文关键字:copy 指针 marshal 指向 算法 | 更新日期: 2023-09-27 18:32:37

我试图使用Marshal.copy将此代码转换为 vb.net,但我无法让它工作

for (int y = 0; y < bitmapdata.Height; y++)
{
    byte* destPixels = (byte*)bitmapdata.Scan0 + (y * bitmapdata.Stride);
    for (int x = 0; x < bitmapdata.Width; x++)
    {
        destPixels[x * PixelSize] = contrast_lookup[destPixels[x * PixelSize]]; // B
        destPixels[x * PixelSize + 1] = contrast_lookup[destPixels[x * PixelSize + 1]]; // G
        destPixels[x * PixelSize + 2] = contrast_lookup[destPixels[x * PixelSize + 2]]; // R
        //destPixels[x * PixelSize + 3] = contrast_lookup[destPixels[x * PixelSize + 3]]; //A
    }
}

我的问题是这一行:

byte* destPixels = (byte*)bitmapdata.Scan0 + (y * bitmapdata.Stride);

对比算法 C# 指向 marshal.copy 的指针

假设您Scan0作为IntPtr那么对 C# 的朴素翻译很简单:

IntPtr destPixels = Scan0 + y*stride;

这里的玩家是:

  • Scan0 :指向第一条扫描线的指针,即像素数据的开头。
  • y:行号。
  • stride :一行像素中的字节数。
  • destPixels :指向第 y 行开头的指针。

但这是在假设您使用非托管内存进行destPixels 的情况下进行的。我不知道你是不是。如果使用的是托管内存,则转换会有所不同。如果需要更多帮助,需要告诉我们托管版本使用的类型。