【问题标题】:Equivalent of setPixels(int [] pixels, int offset, int stride, int x, int y, int width, int height) in C# .Net?等效于 C# .Net 中的 setPixels(int [] pixels, int offset, int stride, int x, int y, int width, int height)?
【发布时间】:2021-08-20 15:56:01
【问题描述】:

我正在尝试将一些 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#。有什么建议吗?

【问题讨论】:

  • 你见过Bitmap.SetPixel 吗?如果要设置多个像素,见fast work with bitmaps
  • 另外,WriteableBitmap.WritePixels 以获得更现代的选择。
  • @JonasH 我确实看到了 Bitmap.SetPixel 但不知道如何使用它。经过进一步思考:` for (int Xcount = 0; Xcount
  • 但我不确定应该放 pixels[Xcount] 还是 pixels[Ycount]

标签: c# android-studio bitmap android-bitmap


【解决方案1】:

最简单的解决办法是替换

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();  
        }
    }

【讨论】:

  • 通过Marshal类复制数据,您可以完美使用LockBits而没有不安全的操作。
猜你喜欢
  • 2014-07-05
  • 2012-12-14
  • 1970-01-01
  • 2012-04-02
  • 1970-01-01
  • 2018-01-13
  • 2013-11-20
  • 2013-01-26
  • 1970-01-01
相关资源
最近更新 更多