在 C# .Net 中等效于 setPixels(int [] pixels, int offset, int stride, int x, int y, int width, int height)?

Equivalent of setPixels(int [] pixels, int offset, int stride, int x, int y, int width, int height) in C# .Net?

我正在尝试将一些 Java 代码转换为应用程序的 C#。我似乎无法在 C# .NET 中的 android.Graphics.Bitmap 中找到与 setPixels 方法完全等效的方法。

这里是 Java 代码:

    BitMatrix result =  some code ..... 

    int w = result.getWidth();
    int h = result.getHeight();
    int[] pixels = new int[w * h];

    for (int y = 0; y < h; y++) {

        int offset = y * w;

        for (int x = 0; x < w; x++) {
            pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
        }

    }

    Bitmap bitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    bitmap.setPixels(pixels, 0, 480, 0, 0, w, h);

这是我将其转换为 C# 的尝试:

    int w = result.Width;
    int h = result.Height;
    int[] pixels = new int[w * h];

    for (int y = 0; y < h; y++)
    {

        int offset = y * w;

        for (int x = 0; x < w; x++)
        {
            pixels[offset + x] = result[x, y] ? Color.Black.ToArgb() : Color.White.ToArgb();    
        }

    }

    Bitmap bitmap = new Bitmap(w, h);

    // how to convert the line below 

    bitmap.setPixels(pixels, 0, 480, 0, 0, w, h);
    

我应该如何将最后一行转换为 C#。有什么建议吗?

最简单的解决方案是更换

pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;

bitmap.SetPixel(x, y, result[x, y] ? Color.Black : Color.White);

这会很慢,因为它需要为每个像素集锁定一些。您还需要先创建位图。

一种更快的方法是使用不安全代码来获取指向位图数据的指针。参见 fast work with bitmaps。假设一个 Argb 颜色位图

    var bData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, bitmap.PixelFormat);
    byte* scan0 = (int*)bData.Scan0.ToPointer();

    for (int y = 0; y < bData.Height; ++y)
    {
        var rowPtr = scan0 + y * bData.Stride * 4; 
        for (int x = 0; x < bData.Width; ++x)
        {
             rowPtr[x] = result[x, y] ? Color.Black.ToArgb() : Color.White.ToArgb();  
        }
    }