Dib to Bitmap doesn't work in WPF

一、Dib to Bitmap doesn't work in WPF

代碼如下:

protectedbyte[] BitmapFromDIB(IntPtr pDIB, IntPtr pPix)

{

MethodInfo mi = typeof(Bitmap).GetMethod("FromGDIplus", BindingFlags.Static | BindingFlags.NonPublic);

 

if (mi == null)

returnnull;

 

IntPtr pBmp = IntPtr.Zero;

int status = GdipCreateBitmapFromGdiDib(pDIB, pPix, ref pBmp);

if ((status == 0) && (pBmp != IntPtr.Zero))

{

Bitmap bmtemp = (Bitmap)mi.Invoke(null, newobject[] { pBmp });

byte[] byres = null;

if (bmi.biBitCount == 1)

{

ImageConverter ic = newImageConverter();

byres = ic.ConvertTo(bmtemp, typeof(byte[])) asbyte[];

}

else

{

MemoryStream ms = newMemoryStream();

bmtemp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);

byres = ms.ToArray();

}

return byres;

}

else

returnnull;

}

關於這個問題,不管是在國外還是國內的博客網站上,好多人都遇到這樣的問題,我在最近的公司的項目中,在使用松下的一款掃描儀時,遇到了同樣的問題,在WPF中使用此方法時,返回的狀態碼爲18,根據msdn的API解釋18爲GdiplusNotInitialized,即GDI+未被初始化,關於狀態碼的枚舉如下:

typedef enum {

Ok                          = 0,

GenericError                = 1,

InvalidParameter            = 2,

OutOfMemory                 = 3,

ObjectBusy                  = 4,

InsufficientBuffer          = 5,

NotImplemented              = 6,

Win32Error                  = 7,

WrongState                  = 8,

Aborted                     = 9,

FileNotFound                = 10,

ValueOverflow               = 11,

AccessDenied                = 12,

UnknownImageFormat          = 13,

FontFamilyNotFound          = 14,

FontStyleNotFound           = 15,

NotTrueTypeFont             = 16,

UnsupportedGdiplusVersion   = 17,

GdiplusNotInitialized       = 18,

PropertyNotFound            = 19,

PropertyNotSupported        = 20,

ProfileNotFound             = 21

} Status;

 

詳細可以查看此地址:https://msdn.microsoft.com/en-us/library/ms534175.aspx 裏面有更爲詳盡的說明。

看到這裏,稍微瞭解點WPF和WinForm底層的人就會知道爲什麼在WPF中會出現這樣的問題,WPF的底層是基於DirectX的,而WinForm是基於GDI+的,兩者有着本質的區別,所以在WPF中才會報出未初始化Gdiplus的問題,在msdn的API中,已經提供瞭解決方案,如何初始化GDI+,以及如何關閉GDI+,地址:https://msdn.microsoft.com/en-us/library/ms534077.aspx msdn中提供了C++的示例,對於我這種小白來說,不知道該咋在C#裏面調用。

於是另闢蹊經,新建了一個與項目無關的WinForm項目,在WPF項目中添加引用,在掃描前初始化WinForm項目中的一個窗體,它實際是隻起了一個初始化Gdiplus的作用,但這卻解決了我的問題,達到了事半功倍的效果。

二、小結

開發過程中,或許我們會遇到各種各樣的問題,當然大多數的問題,前人已經解決的差不多了,但是不一定會適合我們,在時間不允許的情況下,我們不妨去選擇自己最熟悉的,最直接的解決方案。適合自己的纔是最好的!

如下疑問:

1.在一個winform項目中有一個Form1窗體,我在wpf項目中引用這個winform項目,實例化 Form1窗體;
2.在wpf項目中,直接實例化一個Form1窗體;
在以上兩種情景下,實例化的Form1窗體有何不同。

在一開始的時候,我想直接實例化一個WinForm窗體,卻不可以,後來又改成第一種情景,才解決的這個問題,請大神們幫忙解答。謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章