2014-10-02 16 views
5

Tôi có dữ liệu pixel thô từ một máy ảnh ở định dạng RGB8 mà tôi cần chuyển đổi thành Bitmap. Tuy nhiên, chỉ có Bitmap PixelFormat dường như hỗ trợ các định dạng RGB 16, 24, 32 và 48.Chuyển đổi byte RGB8 [] thành Bitmap

Tôi đã cố sử dụng PixelFormat.Format8bppIndexed nhưng hình ảnh bị đổi màu và đảo ngược.

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

Có cách nào khác để chuyển đổi loại dữ liệu này chính xác không?

+0

bài viết hữu ích: [này] (http://msdn.microsoft.com/en-us/library/ windows/desktop/ee719797 (v = vs.85) .aspx) và [this] (http://msdn.microsoft.com/en-us/library/ms969901.aspx) –

+0

Tò mò: Loại/kiểu máy ảnh sản xuất định dạng đó? Ngoài ra: [this] (http://www.theimagingsource.com/en_US/support/documentation/icimagingcontrol-activex/PixelformatRGB8.htm) nguồn nói rằng nó là một định dạng đơn sắc 8bit. – TaW

+0

Một trích dẫn khác từ [nguồn này] (http://www.theimagingsource.com/en_US/support/documentation/icimagingcontrol-activex/PixelformatRGB8.htm): _RGB là từ dưới lên, dòng đầu tiên có chỉ mục (dòng-1_ – TaW

Trả lời

2

Điều này tạo bảng màu xám 8 bit tuyến tính trong hình ảnh của bạn.

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; 

Bạn vẫn sẽ cần phải đảo ngược dòng quét, có lẽ như thế này:

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: xin lưu ý việc chỉnh sửa 1 lần trong điều kiện vòng lặp! – TaW

Các vấn đề liên quan