2014-10-02 159 views
5

我有RGB8格式的相機的原始像素數據,我需要將其轉換爲Bitmap。但是,Bitmap PixelFormat似乎只支持RGB 16,24,32和48格式。將RGB8字節[]轉換爲位圖

我試圖使用PixelFormat.Format8bppIndexed,但圖像出現變色和倒置。

public static Bitmap CopyDataToBitmap(byte[] data) 
{ 
    var bmp = new Bitmap(640, 480, PixelFormat.Format8bppIndexed); 

    var bmpData = bmp.LockBits(
         new Rectangle(0, 0, bmp.Width, bmp.Height), 
         ImageLockMode.WriteOnly, bmp.PixelFormat); 

    Marshal.Copy(data, 0, bmpData.Scan0, data.Length); 

    bmp.UnlockBits(bmpData); 

    return bmp; 
} 

是否有任何其他方式正確地轉換此數據類型?

+0

有用的文章:[這裏](http://msdn.microsoft.com/en-us/library/ windows/desktop/ee719797(v = vs.85).aspx)和[this](http://msdn.microsoft.com/en-us/library/ms969901.aspx) – 2014-10-02 13:10:41

+0

好奇:相機生產哪種類型/型號那種格式?另外:[this](http://www.theimagingsource.com/en_US/support/documentation/icimagingcontrol-activex/PixelformatRGB8.htm)源表示它是一種8位單色格式。 – TaW 2014-10-02 13:33:37

+0

[This source]的另一個引用(http://www.theimagingsource.com/en_US/support/documentation/icimagingcontrol-activex/PixelformatRGB8.htm):_RGB是自下而上的,第一行有索引(lines-1_ – TaW 2014-10-02 13:41:34

回答

2

這會在圖像中創建一個線性8位灰度調色板。

bmp.UnlockBits(bmpData); 

var pal = bmp.Palette; 
for (int i = 0; i < 256; i++) pal.Entries[i] = Color.FromArgb(i, i, i); 
bmp.Palette = pal; 

return bmp; 

您仍然需要反轉掃描線,也許是這樣的:

for (int y = 0; y < bmp.Height; y++) 
    Marshal.Copy(data, y * bmp.Width, 
      bmpData.Scan0 + ((bmp.Height - 1 - y) * bmpData.Stride), bmpData.Stride); 
+0

@Barry:請注意循環條件下的1次糾正! – TaW 2014-10-02 18:53:44