一、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. Pipeline inbound

    精进篇:netty源码死磕7  巧夺天工--Pipeline入站流程详解 1. Pipeline的入站流程 在讲解入站处理流程前,先脑补和铺垫一下两个知识点: (1)如何向Pipeline添加一个Ha ...

  2. 7.Insert Methods-官方文档摘录

    总结 列举insert插入方法 MongoDB provides the following methods for inserting documents into a collection: db ...

  3. Python 一键同步windows和linux数据(基于pscp.exe)

    outline 项目中需要把 windows server 上的数据同步到 linux server,方法很多,这里记录下自己采用的一种比较简单的方法. 准备工作 首先确保你 windows serv ...

  4. java jacob调用打印,word,excel横向打印

    public static boolean printOfficeFile(File f) { if (f != null && f.exists()) { String fileNa ...

  5. JDK源代码学习系列05----LinkedList

                                             JDK源代码学习系列05----LinkedList 1.LinkedList简单介绍 LinkedList是基于双向 ...

  6. sql server自动化运维脚本

    数据库运维中盛传一个小段子,我误删除了数据库,改怎么办?有备份还原备份,没有备份就准备简历!听起来有趣但发生在谁身上,谁都笑不起来.接触了很多的客户发现90%客户的运维策略都不是很完善.本篇就分享一些 ...

  7. (4.8)SET ANSI_NULLS ON、SET QUOTED_IDENTIFIER ON

    T-SQL支持在与空值进行比较时,允许比较运算符返回 TRUE 或 FALSE. 通过设置 ANSI_NULLS OFF 可将此选项激活.当 ANSI_NULLS 为 OFF 时,如果 ColumnA ...

  8. Android 成功 使用GPS获取当前地理位置(解决getLastKnownLocation 返回 null)

    最近遇到一个比较棘手的问题:使用GPS定位无法获取当前的地理位置,即getLastKnownLocation方法始终返回null.   后来一篇博文 getLastKnownLocation()返回n ...

  9. 一个很牛的计算pi的c程序!

    C语言是面向过程的一种高级程序设计语言,它在世界范围内使用很广泛,而且很流行.很多大型的应用软件,基本上是用C语言所编写的.在对操作系统以及系统使用程序.需要对硬件进行操作的场合,C语言较其他的高级语 ...

  10. Mysql数据表字段设置了默认值,插入数据后默认字段的值却为null,不是默认值

    我将mysql的数据表的某个字段设置了默认值为1,当向该表插入数据的时候该字段的值不是默认值,而是null. 我的错误原因: 对数据库的操作我使用了持久化工具mybatis,插入数据的时候插入的是整个 ...