一、Dib to Bitmap doesn't work in WPF
代碼如下:
protected byte[] BitmapFromDIB(IntPtr pDIB,IntPtr pPix)
{
MethodInfo mi =typeof(Bitmap).GetMethod("FromGDIplus",BindingFlags.Static |BindingFlags.NonPublic);
if(mi ==null)
return null;
IntPtr pBmp =IntPtr.Zero;
int?status = GdipCreateBitmapFromGdiDib(pDIB, pPix,refpBmp);
if((status == 0) && (pBmp !=IntPtr.Zero))
{
Bitmap bmtemp = (Bitmap)mi.Invoke(null,newobject[] { pBmp});
byte[] byres =null;
if(bmi.biBitCount == 1)
{
ImageConverter ic =new ImageConverter();
byres = ic.ConvertTo(bmtemp,typeof(byte[])) as byte[];
}
else
{
MemoryStream ms =new MemoryStream();
bmtemp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
byres = ms.ToArray();
}
returnbyres;
}
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.aspxmsdn中提供了C++的示例,對于我這種小白來說,不知道該咋在C#里面調用。
于是另辟蹊經,新建了一個與項目無關的WinForm項目,在WPF項目中添加引用,在掃描前初始化WinForm項目中的一個窗體,它實際是只起了一個初始化Gdiplus的作用,但這卻解決了我的問題,達到了事半功倍的效果。
開發過程中,或許我們會遇到各種各樣的問題,當然大多數的問題,前人已經解決的差不多了,但是不一定會適合我們,在時間不允許的情況下,我們不妨去選擇自己最熟悉的,最直接的解決方案。適合自己的才是最好的!