C# 生成8位灰度图bmp
public static void SaveBmp8(Bitmap bitmap,string savePath) {
int width = bitmap.Width;
int height = bitmap.Height;
short fiBitCount = 8;
int iLineByteCnt = (((width * fiBitCount) + 31) >> 5) << 2;
int dataSize = iLineByteCnt * height;
//byte[] fsbytes = new byte[14];//文件头
//byte[] fibytes = new byte[40];//信息头
byte[] pbytes = new byte[256*4];//调色板
byte[] bfType = new byte[2];
bfType[0] =(int)'B';
bfType[1] = (int)'M';
byte[] bfSize = BitConverter.GetBytes(dataSize+14+40+1024);
byte[] bfReserved = new byte[4] { 0, 0, 0, 0 };
byte[] biOffbits = BitConverter.GetBytes(1024 + 14 + 40);
byte[] biSize = BitConverter.GetBytes(40);
byte[] biWidth = BitConverter.GetBytes(width);
byte[] biHeight = BitConverter.GetBytes(-1*height);
byte[] biPlanes = new byte[] { 0,1};
byte[] biBitCount = BitConverter.GetBytes(fiBitCount);
byte[] biCompression = new byte[] {0,0,0,0 };
byte[] biSizeImage = new byte[] { 0,0,0,0};
byte[] biXYPelsPerMeter = new byte[] { 0,0,0,0,0,0,0,0};
byte[] biClrUsed = BitConverter.GetBytes(256);
byte[] biClrImportant = BitConverter.GetBytes(256);
//调色版
for (int i = 0; i < 256; i++) {
pbytes[i * 4] = (byte)i;
pbytes[i * 4+1] = (byte)i;
pbytes[i * 4+2] = (byte)i;
pbytes[i * 4+3] = 255;
}
byte[] data = new byte[dataSize];
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
Color color = bitmap.GetPixel(x, y);
int value = (color.R + color.G + color.B) / 3;
data[x +width* y] =(byte)value;
}
}
using (FileStream fileStream = File.OpenWrite(savePath)) {
fileStream.Write(bfType, 0, 2);
fileStream.Write(bfSize, 0, 4);
fileStream.Write(bfReserved, 0, 4);
fileStream.Write(biOffbits, 0, 4);
fileStream.Write(biSize, 0, 4);
fileStream.Write(biWidth, 0, 4);
fileStream.Write(biHeight, 0, 4);
fileStream.Write(biPlanes, 0, 2);
fileStream.Write(biBitCount, 0, 2);
fileStream.Write(biCompression, 0, 4);
fileStream.Write(biSizeImage, 0, 4);
fileStream.Write(biXYPelsPerMeter, 0, 8);
fileStream.Write(biClrUsed, 0, 4);
fileStream.Write(biClrImportant, 0, 4);
fileStream.Write(pbytes, 0, pbytes.Length);
fileStream.Write(data, 0, data.Length);
fileStream.Close();
fileStream.Dispose();
}
}