c# - 在 C# 中使用 BitmapData 和指针快速修改位图

标签 c# performance bitmapdata lockbits

我正在从一些相机(RAW 数据数组)捕获数据。

然后我根据调色板将这些数据映射到 RGB 值。

我需要尽快映射它,所以我使用 BitmapDdata 并使用指针编辑不安全代码段中的像素。

public void dataAcquired(int[] data)
{
    Bitmap bmp = new Bitmap(width, height); 
    BitmapData data = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

    for (int i = 0; i < data.Length; i++)
    {
        int x = i % bmp.Width;
        int y = i / bmp.Width;
        Rgb rgb = mapColors[data[i]];

        unsafe
        {
            byte* ptr = (byte*)data.Scan0;
            ptr[(x * 3) + y * data.Stride] = rgb.b;
            ptr[(x * 3) + y * data.Stride + 1] = rgb.g;
            ptr[(x * 3) + y * data.Stride + 2] = rgb.r;
        }
    }
    bmp.UnlockBits(data);
}

我正在为每个传入的帧执行此操作。它工作正常,但对于 320x240 像素的每一帧仍然需要大约 30 毫秒。

有没有可能让它变得更快?也许我只能在内存中锁定/解锁数据一次,但我对此不确定。

最佳答案

不是为每个像素计算 x 和 y,您可以使它们成为循环计数器,如下所示:

for( y = 0;  y < bmp.Height;  y++ )
    for( x = 0;  x < bmp.Width;  x++ )

更好的是,完全放弃 x 和 y,只继续递增 ptr 指针,而不是每个像素三次重新计算 ptr 指针的偏移量。

试试这个(警告:我还没有检查过。)

public void dataAcquired()
{
    Bitmap bmp = new Bitmap(width, height); 
    BitmapData data = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
    unsafe
    {
        int i = 0;
        byte* ptr = (byte*)data.Scan0;
        for( int y = 0;  y < bmp.Height;  y++ )
        {
            byte* ptr2 = ptr;
            for( int x = 0;  x < bmp.Width;  x++ )
            {
                Rgb rgb = mapColors[data[i++]];
                *(ptr2++) = rgb.b;
                *(ptr2++) = rgb.g;
                *(ptr2++) = rgb.r;
            }
            ptr += data.Stride;
        }
    }
    bmp.UnlockBits(data);
}

关于c# - 在 C# 中使用 BitmapData 和指针快速修改位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28323448/

相关文章:

c# - 如何更改我的应用程序 Tile Graphic

php - URL 缩短器算法

java - 如果包含在特定的结尾列表中,则删除单词结尾

python - MongoDB Update-Upsert Performance Barrier(性能跌落悬崖)

actionscript-3 - 尝试使用 BitmapData 捕获舞台区域

flash - 如何使用 BitmapData.fillRect()?

actionscript-3 - 如何使用Flash BitmapData在不损失质量的情况下放大图像?

c# - 托管 C# 代码中的致命执行引擎错误

c# - 我可以在没有安装 Visual Studio 的 Windows 服务器上构建 .NET Core 应用程序吗?

c# - 如何在 C# 中执行每次迭代延迟 1 分钟的无限循环?