如何将Bitmap转换为byte 更快?

我写了函数:

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] = cR; result[i, j, 1] = cG; result[i, j, 2] = cB; } } return result; } 

但转换1800×1800图像需要将近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 🙂

通过使用从Bitmap.LockBits返回的BitmapData对象,可以大大提高速度。 Google“C#Bitmap LockBits”提供了大量示例。

GetPixel非常痛苦,非常缓慢,因此(具有讽刺意味)它完全不适合处理单个像素。

我一直在想这个问题。

在.NET 4.0中,Microsoft引入了并行库。 基本上它的作用是有一个Parallel.For方法,它将自动生成许multithreading来帮助完成工作。 例如,如果你最初有一个For(int i = 0; i <3; i ++){code ...},一个parallel.For循环可能会创建3个线程,每个线程将有一个不同的值,我穿过内码。 所以我能建议的最好的东西是一个带有一个的Parallel.For循环

 Color c lock(obraz) { c = obraz.GetPixel(..) } ... 

获得像素时

如果你需要关于并行性的更多解释,在你花一些时间研究它之前我无法真正帮助你,因为它是一个巨大的研究领域。

我刚试过并行For
如果没有位图上的SyncLock ,它将无法工作。
它说对象正在使用中。
所以它几乎只是工作,连续大声笑……真是一团糟。

  For xx As Integer = 0 To 319 pq.ForAll(Sub(yy) Dim Depth = getDepthValue(Image, xx, yy) / 2047 Dim NewColor = Depth * 128 Dim Pixel = Color.FromArgb(NewColor, NewColor, NewColor) SyncLock Bmp2 Bmp2.SetPixel(xx, yy, Pixel) End SyncLock End Sub) Next 

如果你想知道,这是转换kinect的depth map -> bitmap
Kinect的深度范围是11位(0-2047),表示距离而不是颜色。