C#LockBits性能(int [,]到byte [])

Kir*_*Kir 3 c# performance picturebox lockbits

Graphics g;
using (var bmp = new Bitmap(_frame, _height, PixelFormat.Format24bppRgb))
{
    var data = bmp.LockBits(new Rectangle(0, 0, _frame, _height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
    var bmpWidth = data.Stride;
    var bytes = bmpWidth * _height;
    var rgb = new byte[bytes];
    var ptr = data.Scan0;
    Marshal.Copy(ptr, rgb, 0, bytes);

    for (var i = 0; i < _frame; i++)
    {
        var i3 = (i << 1) + i;
        for (var j = 0; j < _height; j++)
        {
            var ij = j * bmpWidth + i3;
            var val = (byte)(_values[i, j]);
            rgb[ij] = val;
            rgb[ij + 1] = val;
            rgb[ij + 2] = val;
        }
    }

    Marshal.Copy(rgb, 0, ptr, bytes);
    bmp.UnlockBits(data);

    g = _box.CreateGraphics();
    g.InterpolationMode = InterpolationMode.NearestNeighbor;
    g.DrawImage(bmp, 0, 0, _box.Width, _box.Height);
}
g.Dispose();
Run Code Online (Sandbox Code Playgroud)

我使用此代码转换PictureBox中的RGB值(灰度)数组,但速度很慢.请告诉我我的错误.目前,处理了441 000个项目的数组为35毫秒.我需要同时处理400万的数组.

Guf*_*ffa 5

您可以跳过第一个Array.Copy将数据从图像复制到数组的位置,因为您将覆盖数组中的所有数据.

这将削减25%的时间,但如果你想要更快,你将不得不使用一个不安全的代码块,以便你可以使用指针.这样,您可以在访问数组时绕过范围检查,并且可以将数据直接写入图像数据而不是复制它.