将RGB8 byte []转换为Bitmap

Bar*_*mey 6 c# bitmap

我有来自RGB8格式相机的原始像素数据,我需要将其转换为Bitmap.但是,Bitmap PixelFormat似乎只支持RGB 16,24,32和48格式.

我试图使用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;
}
Run Code Online (Sandbox Code Playgroud)

有没有其他方法可以正确转换此数据类型?

TaW*_*TaW 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;
Run Code Online (Sandbox Code Playgroud)

您仍然需要反转扫描线,可能像这样:

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