C# 生成8位灰度图bmp

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();
            }
        }

猜你喜欢

转载自blog.csdn.net/zh_98/article/details/78227638
今日推荐