最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • C# Twain协议调用扫描仪,设置多图像输出模式(Multi image output)

    正文概述 掘金(SpringSun)   2021-01-28   728

    Twain

    随着扫描仪、数码相机和其他图像采集设备的引入,用户热切地发现了将图像整合到他们的文档和其他工作中的价值。然而,支持这种光栅数据的显示和操作成本很高,应用程序开发人员需要创建用户界面并内置设备控制各种各样可用的图像设备。 一旦他们的应用程序准备好支持给定的设备,他们就会面临一个令人沮丧的现实:设备不断地升级新的功能和特性。应用程序开发人员发现他们不断地修改他们的产品,以保持最新图像采集设备和软件应用程序的开发人员都认识到需要图像设备和应用程序之间的标准通信。一个标准有利于使用他们产品的用。它将允许更多的应用程序访问设备供应商的产品,而应用程序供应商可以访问来自这些设备的数据,而不需要关心提供这些数据的是哪种类型的设备或特定的设备。 TWAIN的开发正是出于对一致性和简化的需要。

    Twain 开发简介

    TWAIN定义了一个标准的软件协议和API(应用程序编程接口),用于在软件应用程序和图像采集设备(数据的来源)之间进行通信。 Twain的三个关键要素是:

    • Application software

    必须修改应用程序才能使用TWAIN。

    • Source Manager software

    该软件管理应用程序和源程序之间的交互。这段代码在TWAIN开发者的工具包中提供,每个TWAIN应用程序和源代码都应该免费提供。

    • Source software

    该软件控制图像采集设备,由设备开发人员按照TWAIN规范编写。传统的设备驱动程序现在包含在源软件中,不需要由应用程序提供。

    C# Twain协议调用扫描仪,设置多图像输出模式(Multi image output)

    关于这几要素是什么关系呢?通俗的说就是Twain是一个协议,这个协议不需要我们自己去实现和设备(我这里是扫描仪)的通讯,这个通讯是由一个叫做Data Source Manager的来提供,我们的应用程序只需要调用Data Source Manager对应的功能,然后由Data Source Manager去负责和支持Twain协议的设备通讯(准确的说应该是设备的驱动)。

    C# Twain协议调用扫描仪,设置多图像输出模式(Multi image output)

    这个Data Source Manager 在windows里面就是由twain_32.dll实现。

    C# Twain协议调用扫描仪,设置多图像输出模式(Multi image output)

    Twain通讯过程

    TWAIN元素之间的通信可以通过两个入口点实现。他们是DSM_Entry()和DS_Entry()。DSM指数据源管理器(也就是twain_32.dll),DS指数据源(驱动程序)。

    C# Twain协议调用扫描仪,设置多图像输出模式(Multi image output)

    应用程序的目标是从源获取数据。但是应用程序不能直接调用源。所有对数据、功能信息、错误信息等的请求都必须通过源管理器处理。

    Twain定义了大约140个操作。应用程序将它们发送到源管理器进行传输。应用程序指定哪个元素(源管理器或源)是每个请求操作的最终目的地。 应用程序通过源管理器唯一的入口点DSM_Entry()函数与源管理器通信。DSM_Entry函数的参数列表包含:

    • 一个标识符结构,提供关于发起函数调用的应用程序的信息。
    • 请求的目的地(源管理器或源)。
    • 描述请求操作的三元组(triplet)。三元组指: 操作的数据组(DG_) 操作的数据参数类型(DAT_) 操作的消息(MSG_)
    • 函数调用返回一个值(返回码),指示操作的成功或失败。
    TW_UINT16 TW_CALLINGSTYLE DSM_Entry
        (   pTW_IDENTITY pOrigin, // source of message
            pTW_IDENTITY pDest, // destination of message
            TW_UINT32 DG, // data group ID: DG_xxxx
            TW_UINT16 DAT, // data argument type: DAT_xxxx
            TW_UINT16 MSG, // message ID: MSG_xxxx
            TW_MEMREF pData // pointer to data
        );
    

    Twain状态

    应用程序、源管理器和源必须通信来管理数据的获取。这个过程必须以特定的顺序发生,这是合乎逻辑的。例如,在加载源管理器并准备好进行请求通信之前,应用程序无法成功地请求来自源的数据传输。为了保证序列的正确执行,TWAIN协议定义了在TWAIN会话中存在的七种状态。会话是应用程序通过源管理器连接到特定源的时间段。 应用程序连接到源管理器的期间是一个唯一的会话,Source Manager和Source的TWAIN元素都占据一个特定的状态。到新状态的转换是由应用程序或源请求的操作引起的,转换可以向前或向后进行。大多数转换都是单状态转换。 转换状态图如下:

    C# Twain协议调用扫描仪,设置多图像输出模式(Multi image output)

    State 1 to 2 -加载source manager 获取 DSM_Entry接口 State 2 to 3 - 打开source manager State 3 - 选择 Source State 3 to 4 - 打开 Source State 4 - 设置source的Capabilities State 4 to 5 - 请求从source获取数据 State 5 to 6 - 数据可以准备消息 State 6 to 7 - 开始数据传输 State 7 to 6 to 5 - 完成传输 State 5 to 1 - 断开连接

    C# 调用

    应用程序调用Source Manager,使用NTwain进行操作,在nuget里面添加引用。

    C# Twain协议调用扫描仪,设置多图像输出模式(Multi image output)

    对应的github地址,里面有源码和demo: github.com/soukoku/ntw… 添加引用后打开source manager,然后可以选择Source 或者加载默认Source。

    C# Twain协议调用扫描仪,设置多图像输出模式(Multi image output)

    打开Source后状态为4 则我们可以对设备进行设置,而设置这些功能存在于许多种类中,但都有默认值、当前值和可能的值 其他可选的可支持的值。这些种类可以在协议里面查到,也就是驱动里面对应的各种设置。在Twain协议里面把这些功能叫做Capabilities ,对应的NTwain包里面也封装了,比如设置扫描仪双面扫描

    _twain.CurrentSource.Capabilities.CapDuplexEnabled.SetValue(BoolType.True);
    

    C# Twain协议调用扫描仪,设置多图像输出模式(Multi image output)

    关于富士通fujitsu设置图像模式:多图像输出

    这里有个大坑,在使用NTwain设置的时候通过CapPixelType设置图像模式只能设置黑白灰度彩色三种,通过如下代码:

    _twain.CurrentSource.Capabilities.ICapPixelType.SetValue(PixelType.RGB)
    

    不能设置多图输出,在驱动里面找看到图片确实只支持这几种方式,然后我一直以为是我看掉了哪个功能,看完了Twain协议,然后去网上各种找没有这方面的资料,大部分都是很简单的介绍,纠结了一周没有搞清楚。然后搜到vintasoft 这个网站的时候看到一个提问才恍然大悟,原来这个设置Twain标准协议里面确实没有这个,我估计是富士通厂家自己搞的一个。因为上面Twain通讯过程说了各种操作只能通过DSM_Entry()函数,并且只要你传入的三元组的( TW_UINT16 DAT,// data argument type: DAT_xxxx) Id正确且支持就行了。

    C# Twain协议调用扫描仪,设置多图像输出模式(Multi image output)

    使用如下代码new一个多图像输出功能对象,然后像其它一样设置即可。

    new CapWrapper<MutilImageOutPutType>(dataSource, (CapabilityId)0x80f2, ValueExtensions.ConvertToEnum<MutilImageOutPutType>,
                        value => new TWOneValue
                        {
                            Item = (uint)value,
                            ItemType = ItemType.UInt16
                        });
    
    public enum MutilImageOutPutType : ushort
        {
            Disabled = 0,
            RGBAndBW = 1,
            BWAndRGB = 2,
            Enabled = 3,
            Auto = 4,
        }
    

    最后扫描获取图片

    C# Twain协议调用扫描仪,设置多图像输出模式(Multi image output)


    起源地下载网 » C# Twain协议调用扫描仪,设置多图像输出模式(Multi image output)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元