DIB 到 System.Bitmap






4.95/5 (16投票s)
2006年11月6日

138431
一篇关于 DIB 到 Bitmap 转换的文章。
引言
本文描述了一种将 DIB 句柄中的图像检索到 System.Bitmap
对象的方法。
我正在为我的企业开发一个 TWAIN 扫描解决方案。我已经开发了扫描图像的代码。唯一的问题是,在扫描图像后,扫描的图像在内存中以 DIB 格式可用,而我只有指向 DIB 图像的 IntPtr
。
我的目的是从 DIB 句柄中检索扫描的图像,并在图片框中显示它。为此,我需要将 DIB 句柄转换为 Bitmap
对象。以下代码展示了我如何解决这个问题。
使用代码
这里是函数 BitmapFromDIB
的代码,它将从 DIB 句柄返回一个 Bitmap
对象。
此函数接受两个参数
pDIB
:它是扫描图像后返回的 DIB 的指针pPix
:它是指向DIBpixels
的指针
这里,我们使用了从 Gdiplus.dll 导出的函数 GdipCreateBitmapFromGdiDib
来获取指向 Bitmap
的指针。然后我们使用反射,并将此指针传递给 static internal
方法 Bitmap.FromGDIplus(IntPtr pGdiBitmap)
。
using System.Drawing;
using System.Reflection; // . . .
[DllImport("GdiPlus.dll",
CharSet=CharSet.Unicode, ExactSpelling=true)]
private static extern int GdipCreateBitmapFromGdiDib(IntPtr pBIH,
IntPtr pPix, out IntPtr pBitmap);
public static Bitmap BitmapFromDIB(IntPtr pDIB,IntPtr pPix)
{
MethodInfo mi = typeof(Bitmap).GetMethod("FromGDIplus",
BindingFlags.Static | BindingFlags.NonPublic);
if (mi == null)
return null; // (permission problem)
IntPtr pBmp = IntPtr.Zero;
int status = GdipCreateBitmapFromGdiDib(pDIB, pPix, out pBmp);
if ((status == 0) && (pBmp != IntPtr.Zero)) // success
return (Bitmap)mi.Invoke(null, new object[] {pBmp});
else
return null; // failure
}