2014-10-02 17 views
5

Bir fotoğraf makinesinden gelen ve bir Bitmap dönüştürmem gereken RGB8 biçiminde ham piksel verileri var. Ancak, Bitmap PixelFormat sadece RGB 16, 24, 32 ve 48 biçimlerini destekliyor gibi görünüyor.RGB8 bayt [] öğesini Bitmap'e dönüştürün

PixelFormat.Format8bppIndexed'u kullanmayı denedim, ancak görüntü rengi bozuk ve ters çevrilmiş görünüyor.

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; 
} 

Bu veri türünü doğru şekilde dönüştürmenin başka bir yolu var mı?

+0

Faydalı makaleler: [bu] (http://msdn.microsoft.com/en-us/library/ windows/desktop/ee719797 (v = vs85) .aspx) ve [this] (http://msdn.microsoft.com/en-us/library/ms969901.aspx) –

+0

Meraklı: Ne tür bir model/model kamera üretiyor bu format? Ayrıca: [this] (http://www.theimagingsource.com/en_US/support/documentation/icimagingcontrol-activex/PixelformatRGB8.htm) kaynak 8 bitlik bir tek renkli format olduğunu söylüyor. – TaW

+0

[bu kaynak] 'dan başka bir alıntı (http://www.theimagingsource.com/en_US/support/documentation/icimagingcontrol-activex/PixelformatRGB8.htm): _RGB aşağıdan yukarıya, ilk satırın dizini (satır-1_ – TaW

cevap

2

Bu, görüntünüzde doğrusal 8 bit gri tonlamalı bir palet oluşturur.

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; 

Hala belki bu gibi tarama çizgileri ters gerekecektir:

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: döngü koşulunda 1-off düzeltmeye dikkat edin! – TaW

İlgili konular