一、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, ref pBmp);

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

{

Bitmap bmtemp = (Bitmap)mi.Invoke(null, new
object[] { 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();

}

return byres;

}

else

return
null;

}

关于这个问题,不管是在国外还是国内的博客网站上,好多人都遇到这样的问题,我在最近的公司的项目中,在使用松下的一款扫描仪时,遇到了同样的问题,在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的作用,但这却解决了我的问题,达到了事半功倍的效果。

二、小结

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

Dib to Bitmap doesn't work in WPF的更多相关文章

  1. C#中Image , Bitmap 和 BitmapData

    先说Image,Image 就是个图像,不能实例化,提供了位图和源文件操作的函数.本篇文章他就是来打酱油的,这里提供一个Bitmap转成BitmapSource的方法. [DllImport(&quo ...

  2. WPF中实现验证码

    原文:WPF中实现验证码 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37591671/article/details/79563449 W ...

  3. windows gdi+ Bitmap 总结

    windows gdi+ 是对 windows gdi 的一个c++封装,同时增加了一些扩展功能,如反走样,样条曲线,变换矩阵,图像编解码等. gdi+ 相对于 gdi 也存在一些不足之处,如 执行效 ...

  4. Microsoft Win32 to Microsoft .NET Framework API Map

    Microsoft Win32 to Microsoft .NET Framework API Map .NET Development (General) Technical Articles   ...

  5. BMP图像数据格式详解

    一.简介 BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式.Windows系统内部各图像绘制操作都是以B ...

  6. .NET 下各种Resource的读取方式

    1) Embedded Resource (Build Action 设置为 Embedded Resource) 在运行时使用GetManifestResourceStream读取 Image.Fr ...

  7. NeHe OpenGL教程 第三十八课:资源文件

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  8. BMP文件格式分析

    前两天要做一个读取bmp文件的小程序,顺便查找了一些关于BMP格式的文章,现在post上来. 简介 BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运 ...

  9. c#操作剪切板

    C#定义了一个类System.Windows.Forms.Clipboard来简化剪切板操作,这个类有一个静态方法,主要有: Clear 清除剪切板中的所有数据: ContainsData,Conta ...

随机推荐

  1. 程序运行时 0xC0000005: 读取位置 0x00000000 时发生访问冲突 ,可能是 com 组件引入各种问题

    在使用com组件事,可能引入很多不是问题的问题,比如CString 定义出运行时出错等等,这些问题解决的办法就是初始化组件 然后释放组件, 在使用组件时,如果仅仅用在按钮事件或者别的mfc 对话框类里 ...

  2. pycharm中选择python interpreter

    pycharm中选择python interpreter pycharm中有两处地方需要选择python解释器: 一处是调试配置(edit configurations)处,这里选择python解释器 ...

  3. .net ASPxTreeList 使用手记

    ASPxTreeList在使用ASPxGridViewExporter控件做导出时,如果指定文件名是中文时会乱码可以用以下方法解决: grvExporter为ASPxGridViewExporter控 ...

  4. Python爬虫之-Requests

    Requests模块 Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了. 它是为另一个时代.另一个互联网所创建的.它需要巨量的 ...

  5. 深入理解CNI

    1.为什么会有CNI? CNI是Container Network Interface的缩写,简单地说,就是一个标准的,通用的接口.已知我们现在有各种各样的容器平台:docker,kubernetes ...

  6. SAP 后台job

    SAP 如何定义后台job 有两种方 1是se38执行可执行程序后,菜单栏‘程序’--->'后台执行',输入输出设备,ENTER两次后,选择开始时间(立刻执行,或定义日期时间,也可周期执行..) ...

  7. 【教程】Microsoft Visual Studio 2015 安装Android SDK

    http://blog.sina.com.cn/s/blog_51f9ffaa0102vuhy.html Hi,大家好,自vs2015发布后,有很多小伙伴尝试使用VS2015开发安卓,由于是新手,一折 ...

  8. 常用的Issue解决方案(EF框架)

    1.提交出错:ObjectStateManager 中已存在具有同一键的对象.    ObjectStateManager 无法跟踪具有相同键的多个对象. 遇到此问题,首先要确定的是主键是否赋值,以及 ...

  9. 微信小程序组件icon

    基础内容icon:官方文档 Demo Code Page({ data: { iconSize: [20, 30, 40, 50, 60, 70], iconColor: [ 'red', 'oran ...

  10. Python框架之Tornado (源码之褪去模板外衣)

    上一篇介绍了客户端请求在tornado框架中的生命周期,其本质就是利用epoll和socket来获取并处理请求.在上一篇的内容中,我们只是给客户端返回了简单的字符串,如:“Hello World”,而 ...