将原始像素数组转换为灰度位图图像

5

我有一个原始像素数据的数组。我希望将其转换为8bpp位图。

public static Bitmap ByteToGrayBitmap(byte[] rawBytes, int width, int height) 
{ 
    Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format8bppIndexed);
    BitmapData  bitmapData = bitmap.LockBits(new Rectangle(0, 0, width, height),
                                    ImageLockMode.WriteOnly, bitmap.PixelFormat);

    Marshal.Copy(rawBytes, 0, bitmapData .Scan0, rawBytes.Length);
    bitmap.UnlockBits(bitmapData);

    return bitmap;
}

位图看起来像彩色图像而不是灰度图像。


1
我已经编辑了你的标题。请参考“问题的标题应该包含“标签”吗?”,在那里达成共识是“不应该”。 - John Saunders
2个回答

5

你的图片需要一个8位灰度调色板。

在返回之前添加以下内容:

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

return bmp;

2

在返回位图之前,请尝试添加以下内容:

for (int c = 0; c < bitmap.Palette.Entries.Length; c++)
    bitmap.Palette.Entries[c] = Color.FromArgb(c, c, c);

它将创建一个典型的灰度调色板。

2
请参考以下TaW的答案。无法直接修改调色板属性。需要获取调色板属性,将条目设置为灰度,然后再设置调色板属性。 - ewd
@ewd 你说得对,Palette 属性返回的是一个副本而不是引用。我会至少更新代码。谢谢! - bokibeg

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