将32位位图保存为C#中的1位.bmp文件

在C#中将32位位图转换并保存为1位(黑/白).bmp文件的最简单方法是什么?

这段代码将完成工作:

using System.Drawing.Imaging; using System.Runtime.InteropServices; ... public static Bitmap BitmapTo1Bpp(Bitmap img) { int w = img.Width; int h = img.Height; Bitmap bmp = new Bitmap(w, h, PixelFormat.Format1bppIndexed); BitmapData data = bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format1bppIndexed); byte[] scan = new byte[(w + 7) / 8]; for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { if (x % 8 == 0) scan[x / 8] = 0; Color c = img.GetPixel(x, y); if (c.GetBrightness() >= 0.5) scan[x / 8] |= (byte)(0x80 >> (x % 8)); } Marshal.Copy(scan, 0, (IntPtr)((long)data.Scan0 + data.Stride * y), scan.Length); } bmp.UnlockBits(data); return bmp; } 

如有必要,您可以使用不安全的代码替换GetPixel()方法来加快速度。

使用Clone()实现此目的的最简单方法

 using System.Drawing.Imaging; var original = //your source image; var rectangle = new Rectangle(0, 0, original.Width, original.Height); var bmp1bpp = original.Clone(rectangle, PixelFormat.Format1bppIndexed); 

作为否认,这可能不是最快的方法,有更快的方法来做到这一点