一、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窗體,卻不可以,後來又改成第一種情景,才解決的這個問題,請大神們幫忙解答。謝謝!