以下代码用于创建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位彩色位图,以后必须将其转换为灰度?
答案 0 :(得分:8)
我刚刚遇到了这个问题并在此帮助下解决了这个问题:enter link description here
但我会在这里提出我的快速解决方案,希望它可以帮到你。 :) BITMAP文件包含四个部分,一个是调色板,用于决定颜色的显示方式。所以我们在这里修改Bitmap文件的调色板:
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;
答案 1 :(得分: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