C# 生成8位灰度圖bmp
阿新 • • 發佈:2019-02-13
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(); } }