一、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;
}
關(guān)于這個(gè)問(wèn)題啤它,不管是在國(guó)外還是國(guó)內(nèi)的博客網(wǎng)站上广辰,好多人都遇到這樣的問(wèn)題,我在最近的公司的項(xiàng)目中,在使用松下的一款掃描儀時(shí),遇到了同樣的問(wèn)題,在WPF中使用此方法時(shí)蠕趁,返回的狀態(tài)碼為18,根據(jù)msdn的API解釋18為GdiplusNotInitialized辛馆,即GDI+未被初始化俺陋,關(guān)于狀態(tài)碼的枚舉如下:
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;
詳細(xì)可以查看此地址:https://msdn.microsoft.com/en-us/library/ms534175.aspx里面有更為詳盡的說(shuō)明。
看到這里昙篙,稍微了解點(diǎn)WPF和WinForm底層的人就會(huì)知道為什么在WPF中會(huì)出現(xiàn)這樣的問(wèn)題腊状,WPF的底層是基于DirectX的,而WinForm是基于GDI+的苔可,兩者有著本質(zhì)的區(qū)別缴挖,所以在WPF中才會(huì)報(bào)出未初始化Gdiplus的問(wèn)題,在msdn的API中焚辅,已經(jīng)提供了解決方案映屋,如何初始化GDI+,以及如何關(guān)閉GDI+,地址:https://msdn.microsoft.com/en-us/library/ms534077.aspxmsdn中提供了C++的示例同蜻,對(duì)于我這種小白來(lái)說(shuō)棚点,不知道該咋在C#里面調(diào)用。
于是另辟蹊經(jīng)湾蔓,新建了一個(gè)與項(xiàng)目無(wú)關(guān)的WinForm項(xiàng)目瘫析,在WPF項(xiàng)目中添加引用,在掃描前初始化WinForm項(xiàng)目中的一個(gè)窗體卵蛉,它實(shí)際是只起了一個(gè)初始化Gdiplus的作用,但這卻解決了我的問(wèn)題么库,達(dá)到了事半功倍的效果傻丝。
開(kāi)發(fā)過(guò)程中诉儒,或許我們會(huì)遇到各種各樣的問(wèn)題葡缰,當(dāng)然大多數(shù)的問(wèn)題,前人已經(jīng)解決的差不多了,但是不一定會(huì)適合我們泛释,在時(shí)間不允許的情況下滤愕,我們不妨去選擇自己最熟悉的,最直接的解決方案怜校。適合自己的才是最好的间影!