Dib to Bitmap doesn't work in WPF

一、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的作用,但这却解决了我的问题,达到了事半功倍的效果。

二、小结

开发过程中,或许我们会遇到各种各样的问题,当然大多数的问题,前人已经解决的差不多了,但是不一定会适合我们,在时间不允许的情况下,我们不妨去选择自己最熟悉的,最直接的解决方案。适合自己的才是最好的!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.在C/C++中实现本地方法 生成C/C++头文件之后,你就需要写头文件对应的本地方法。注意:所有的本地方法的第...
    JayQiu阅读 7,061评论 0 3
  • 目录 什么是WPF? WPF的历史? 为什么要用WPF及WPF作用 WPF与winForm区别? 什么是WPF? ...
    灬52赫兹灬阅读 11,162评论 2 11
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,132评论 18 399
  • 参考资料 目录 Bitmap BitmapFactory Bitmap加载方法 Bitmap | Drawable...
    玄策阅读 7,768评论 0 7
  • 2021期待与你一起共事,点击查看岗位[https://www.jianshu.com/p/6f4d67fa406...
    闲庭阅读 16,845评论 0 75