如何将Bitmap转换为byte [,,]更快?

Mik*_*onn 4 c# bitmap image-processing winforms

我写了函数:

    public static byte[, ,] Bitmap2Byte(Bitmap image)
    {
        int h = image.Height;
        int w = image.Width;

        byte[, ,] result= new byte[w, h, 3];

        for (int i = 0; i < w; i++)
        {
            for (int j = 0; j < h; j++)
            {
                Color c= image.GetPixel(i, j);
                result[i, j, 0] = c.R;
                result[i, j, 1] = c.G;
                result[i, j, 2] = c.B;
            }
        }

        return result;
    }
Run Code Online (Sandbox Code Playgroud)

但转换1800x1800图像需要将近6秒钟.我能更快地做到吗?

编辑:
好的,我发现了这个:http://msdn.microsoft.com/en-us/library/system.drawing.imaging.bitmapdata.aspx
有很好的例子.我唯一的问题是Marshal.Copy.我可以将数据直接复制到byte[,,]

编辑2: 好的,有时我得到奇怪的像素值,它们似乎没有遵循r0 g0 b0 r1 g1 b1规则.为什么?没关系.弄清楚了.

编辑3: 做到了.0,13s vs 5,35s :)

Mus*_*sis 17

您可以通过使用BitmapData从中返回的对象来大大加快速度Bitmap.LockBits.Google"C#Bitmap LockBits"提供了大量示例.

GetPixel 是痛苦的,痛苦的慢,使它(具有讽刺意味)完全不适合操纵个别像素.

  • @Gabe:我不同意.最慢的方法是将每个像素值手写在一张纸上,然后将其邮寄给居住在西伯利亚的开发人员. (7认同)