我如何定义一个8位灰度图像直接

本文关键字:8位 一个 灰度图像 定义 何定义 | 更新日期: 2023-09-27 18:18:31

下面的代码用于创建一个8位的位图

Bitmap b = new Bitmap(columns, rows, PixelFormat.Format8bppIndexed);
BitmapData bmd = b.LockBits(new Rectangle(0, 0, columns, rows), ImageLockMode.ReadWrite, b.PixelFormat);

但是当我保存它时,它被保存为8位彩色位图。是否有可能直接创建8位灰度位图而不创建8位彩色位图,然后将其转换为灰度?

我如何定义一个8位灰度图像直接

我刚好遇到这个问题,并在这个的帮助下解决了它。

但我将把我的快速解决方案放在这里,希望它能帮助你。
位图文件包含四个部分,一个是调色板,它决定如何显示颜色。下面我们修改位图文件的调色板:
myBMP = new Bitmap(_xSize, _ySize, _xSize, System.Drawing.Imaging.PixelFormat.Format8bppIndexed, _pImage);
//_pImage is the pointer for our image
//Change palatte of 8bit indexed BITMAP. Make r(i)=g(i)=b(i)
ColorPalette _palette = myBMP.Palette;
Color[] _entries = _palette.Entries;
for (int i = 0; i < 256; i++)
{
    Color b = new Color();
    b = Color.FromArgb((byte)i, (byte)i, (byte)i);
    _entries[i] = b;
}
myBMP.Palette = _palette;
return myBMP;

如果你有一个位图,有一个调色板,那么没有一个真正的概念,是否bmp是灰度或不是。只要调色板中的所有颜色都是灰度,那么bmp就是。

这段代码应该有帮助(它是VB的,但应该很容易翻译):

Private Function GetGrayScalePalette() As ColorPalette  
    Dim bmp As Bitmap = New Bitmap(1, 1, Imaging.PixelFormat.Format8bppIndexed)  
    Dim monoPalette As ColorPalette = bmp.Palette  
    Dim entries() As Color = monoPalette.Entries  
    Dim i As Integer 
    For i = 0 To 256 - 1 Step i + 1  
        entries(i) = Color.FromArgb(i, i, i)  
    Next 
    Return monoPalette  
End Function 

在这里找到:http://social.msdn.microsoft.com/Forums/en-us/vblanguage/thread/500f7827-06cf-4646-a4a1-e075c16bbb38