65.9K
CodeProject 正在变化。 阅读更多。
Home

DIB 到 System.Bitmap

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.95/5 (16投票s)

2006年11月6日

viewsIcon

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 
}
© . All rights reserved.