Bitmap CompressionBitmap(Bitmap bitmap) { Bitmap bmpDest = new Bitmap(bitmap.Width, bitmap.Height, PixelFormat.Format1bppIndexed); BitmapData bitDest = bmpDest.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadWrite, PixelFormat.Format1bppIndexed); BitmapData bitSour = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); unsafe { for (int y = 0; y < bitmap.Height; y++) { byte* dataIn = (byte*)bitSour.Scan0 + (y * bitSour.Stride); byte* dataOut = (byte*)bitDest.Scan0 + (y * bitDest.Stride); for (int x = 0; x < bitmap.Width; x++) { byte mask = (byte)(0x80 >> (x & 0x7)); bool light = (dataIn[0] + dataIn[1] + dataIn[2]) > 380 ? true : false; if (light) { dataOut[x >> 3] |= mask; } dataIn += 3; } } } bmpDest.UnlockBits(bitDest); bitmap.UnlockBits(bitSour); bitDest = null; bitSour = null; return bmpDest; } 注:此方法适用于24位图。