2011-12-22 146 views
3

下面的代码被用来创建一个8比特的位图如何直接定义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位彩色位图,然后不得不将其转换为灰度?

+1

如果它的索引那么它的托盘/查找表定义是否是灰度或不:所以在这里我们修改我们的位图文件的调色板。 – 2011-12-22 12:05:08

+0

但是我怎样才能创建一个8位灰度? – klijo 2011-12-22 12:09:17

+1

如果它是一个索引位图并且托盘中的所有颜色都是灰度,那么它是灰度位图吗? (我不知道,但如果答案是肯定的,那么我的评论就是正确的)。 – 2011-12-22 12:10:25

回答

1

如果你有一个调色板的位图,那么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

+0

很好,从那个线程我读,没有8位灰度位图格式的东西。它的调色板需要灰度。它是否正确 ? – klijo 2011-12-22 13:01:16

+1

这就是搜索谷歌似乎表明。 – 2011-12-22 13:02:10

+0

OP要求C#代码,您的解决方案是在VB中。 – Boggartfly 2016-11-12 02:41:52

5

我只是遇到了这个问题,并解决它,这帮助下:enter link description here

但我会把我的快速解决方案放在这里,希望它能帮助你。 :) 位图文件包含四个部分,一个是调色板,它决定如何显示颜色。当然

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; 
+0

比将数据写入8位图像的指针更安全的方法是将数据存入数组[使用LockBits和Marshal.Copy复制](https://stackoverflow.com/a /395685分之43967594)。 – Nyerguds 2018-02-03 13:50:48