internal static Image DIBtoImage(IntPtr dib_data) { BITMAPINFOHEADER bmi; int ncolors; int imagesize; int palettesize; Bitmap bmp; BitmapData bits; ColorPalette pal; int[] palette; bmi = (BITMAPINFOHEADER)Marshal.PtrToStructure(dib_data, typeof(BITMAPINFOHEADER)); ncolors = (int)bmi.biClrUsed; if (ncolors == 0) { if (bmi.biBitCount != 24) { ncolors = (int)(1 << bmi.biBitCount); } } palettesize = ncolors * 4; imagesize = (int)bmi.biSizeImage; if (imagesize == 0) { imagesize = (int)(((((bmi.biWidth * bmi.biBitCount) + 31) & ~31) >> 3) * bmi.biHeight); } switch(bmi.biBitCount) { case 1: { // Monochrome bmp = new Bitmap(bmi.biWidth, bmi.biHeight, PixelFormat.Format1bppIndexed); bits = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, PixelFormat.Format1bppIndexed); palette = new int[2]; break; } case 4: { // 4bpp bmp = new Bitmap(bmi.biWidth, bmi.biHeight, PixelFormat.Format4bppIndexed); bits = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, PixelFormat.Format4bppIndexed); palette = new int[16]; break; } case 8: { // 8bpp bmp = new Bitmap(bmi.biWidth, bmi.biHeight, PixelFormat.Format8bppIndexed); bits = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed); palette = new int[256]; break; } case 24: { // 32bpp bmp = new Bitmap(bmi.biWidth, bmi.biHeight, PixelFormat.Format32bppArgb); bits = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); palette = null; break; } default: { throw new Exception("Unexpected number of bits:" + bmi.biBitCount.ToString()); } } if (bmi.biBitCount != 24) { pal = bmp.Palette; // Managed palette Marshal.Copy((IntPtr)((int)dib_data + Marshal.SizeOf(typeof(BITMAPINFOHEADER))), palette, 0, palette.Length); for (int i = 0; i < ncolors; i++) { pal.Entries[i] = Color.FromArgb(palette[i]); } } Marshal.Copy(bits.Scan0 bmp.UnlockBits(bits); return bmp; } ncolors; i++) { pal.Entries[i] = Color.FromArgb(palette[i]); } } Marshal.Copy(bits.Scan0 bmp.UnlockBits(bits); return bmp; }