将 RGB8 的 byte[] 转换为位图(Bitmap)。

6

我有来自相机的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;
}

有没有其他方式可以正确地转换这种数据类型?

好奇:是什么型号的相机可以产生这种格式?此外:此链接表明这是一种8位单色格式。 - TaW
来自此来源的另一条引用:RGB是自下而上的,第一行的索引为(lines-1)。 - TaW
Format8bppIndexed是您的情况下正确的格式。此外,您需要创建一个ColorPalette,将像素值0映射到RGB(0,0,0)... 255映射到RGB(255,255,255)。请参见Image.Palette属性。 - Alex F
@AlexFarber 我不确定我理解了。你能提供一个例子吗? - Barry Tormey
@Taw 单色。灰度。 - Barry Tormey
显示剩余3条评论
1个回答

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

@Barry:请注意循环条件中的一次性更正! - TaW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接