2017-06-02 73 views
0

如何从C#中逐渐扫描Windows上的文档,同时获取回调以显示它们进来时的图像碎片,并更新我自己的自定义进度UI?带有增量式自定义进度UI的Windows C#文档扫描?

它看起来像扫描仪API选项包括:

  • WIA,WIA脚本自动化(窗口)
  • TWAIN(在Windows,Linux)
  • ImageKit和ImageCaptureCore(MacOS的)
  • SANE( linux)
  • ISIS(窗口,昂贵的商业)。

我的WIA脚本自动化的尝试:

我有一个使用Windows WIA脚本自动化扫描文档一个简单的C#应用​​程序。 (请参阅code on github)但是,在扫描期间,UI会被弹出的进度对话框劫持。

当前代码使用WIA脚本CommonDialog.showTransfersee here)进行扫描,显示弹出进度条对话框。我知道我可以改为使用Item.Transfer,但是,它阻止整个持续时间,并且不提供回调,因此我可以更新自己的自定义进度UI(或取消传输)。

有什么办法可以通过WIA进行无阻塞扫描,或获取进度回调吗?

我必须使用TWAIN吗?

回答

1

它看起来像有在Windows无阻塞流扫描两种选择:

WIA COM

需要注意的是WIA既具有高层次的“脚本自动化”的界面,这是非常重要的一个低级的COM接口。使用低级别的WIA COM,使用IWiaTransfer和IWiaTransferCallback提供基于数据流的数据传输方法。

不幸的是,我能找到的C#WIA包装器使用脚本自动化界面,它不提供流式扫描界面。

吐温

页的Twain Specification 4-20,标题为缓冲存储器模式传送,解释了如何使用一个固定大小的缓冲器递增地传送使用的命令和DAT_SETUPMEMXFERDAT_IMAGEMEMXFER扫描数据。这对每个增量内存缓冲区仍然阻塞,但在每个缓冲区之后,它允许应用程序显示部分传入数据,并继续传输或取消它。

我试过twain.org提供的twain-cs和twain-dsm,但他们没有看到我的扫描仪。我也想避免必须安装LGPL twaindsm.dll。

twaindotnet包装提供了一些Twain支持,它的工作原理并不需要原生TwainDSM DLL。不幸的是,它不支持缓冲内存传输。因此,我扩展了它。

我的incremental_scanning branch of twaindotnet能够在图像像素到达时以增量方式显示图像像素,就在本地UI中。但是,它仍会阻塞每个增量传输块的UI线程。目前还不清楚这个阻塞是否可以移动到后台线程。

youtube video of incremental scan progress

+0

您的项目如何设置增量预览?我将UseIncrementalMemoryXfer设置为true,结果没有改变。 – Dia

+0

你在用什么扫描仪?你指的是什么“结果”?这是你自己的应用程序,还是其中一个测试应用程序? –

+0

更新:我正在使用penpower卡A8扫描仪,并且我正在使用您的WPF测试应用程序。我将'UseIncrementalMemoryXfer'设置为true。如果我选择默认twain设备,则生成的图像始终为黑白色,并且在扫描完成后仅触发一次“TransferImage”事件。如果我选择扫描仪的WIA模式,TransferImage事件将逐步触发,但结果图像中缺少蓝色。 – Dia