2012-11-19 81 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方法,雖然你將不得不使用不安全的代碼,我想象。現在,如果這是允許的,使用它。它允許直接訪問非託管內存緩衝區中的位圖像素。