2012-11-19 62 views
0

我正在从外部系统以BGR值序列的形式接收图像,然后是空字节。该序列看起来有点像...图像格式转换异常缓慢

[B,G,R,0,B,G,R,0,...,B,G,R,0]其中每个BGR0是一个图像。

我需要这在.NET位图,所以我可以在其上执行一些操作,并拿出了下面的函数可以这样做:

private Bitmap fillBitmap(byte[] data, int width, int height) 
    { 
     Bitmap map = new Bitmap(width, height); 
     for (int i = 0; i < data.Length; i += 4) 
     { 
      int y = ((i/4)/width); 
      int x = ((i/4) - (y * width)); 
      int b = data[i]; 
      int g = data[i + 1]; 
      int r = data[i + 2]; 
      Color pixel = Color.FromArgb(r, g, b); 
      map.SetPixel(x, y, pixel); 
     } 
     return map; 
    } 

这通常是除了确定我的大部分图片是1920x1200 ...所以我有一个迭代超过200万次的循环。即便如此,200万次的迭代也不会对任何现代处理器造成严重的影响。

但由于某种原因,这个循环可能需要5-15秒的时间才能运行在我的服务器上一个非常强壮的至强处理器上。并行化循环将是微不足道的,但我怀疑有更好的方法来解决这个问题。任何帮助将不胜感激!

+0

SetPixel是非常缓慢,在这里看到更多的信息http://stackoverflow.com/questions/7768711/setpixel-is-too-slow-is-there-a-faster-way-to-draw-to-bitmap – Ragnagord

回答

2

Bitmap.LockBits Method的描述说,

你可以改变对setPixel方法的图像的颜色,虽然LockBits方法提供了大规模的变化更好的性能。

另一种方法,我猜可能是使用Bitmap(Stream) Constructor,在您创建一个匹配位图文件格式的Stream之后。

0

检查一下FastBitmap的实现,它将帮助您设置可以从中生成图像的阵列。

0

对GetPixel和SetPixel的调用会对本机函数进行互操作。每次调用其中一个函数时,Bitmap图像被锁定,相应的像素/字节将被修改,然后图像最终解锁。您可以想象重复执行此操作效率非常低。

正如其他人建议使用LockBits方法,虽然你将不得不使用不安全的代码,我想象。现在,如果这是允许的,使用它。它允许直接访问非托管内存缓冲区中的位图像素。