使用增量自定义进度UI在Windows C#上扫描文档?

时间:2017-06-02 04:38:50

标签: c# scanning twain wia twaindotnet

如何在C#上逐步扫描Windows上的文档,同时获取回调以显示图像的各个部分,并更新我自己的自定义进度UI?

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

  • WIA,WIA Script Automation(windows)
  • TWAIN(windows,linux)
  • ImageKit和ImageCaptureCore(MacOS)
  • SANE(linux)
  • ISIS(窗户,昂贵的商业广告)。

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

我有一个简单的C#应用​​程序,它使用Windows WIA Script Automation来扫描文档。 (参见code on github)但是,在扫描期间,UI被弹出进度对话框劫持。

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

有没有办法用WIA进行非阻塞扫描,或者获得进度回调?

我必须使用TWAIN吗?

1 个答案:

答案 0 :(得分:1)

在Windows上看起来有两种非阻塞流式扫描选项:

WIA COM

值得注意的是,WIA具有高级“脚本自动化”界面和低级COM接口。使用低级别WIA COM使用IWiaTransfer和IWiaTransferCallback提供基于流的数据传输方法。

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

<强>吐温

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

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

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

我的incremental_scanning branch of twaindotnet能够在原始用户界面中逐渐显示图像像素。但是,它仍会阻止每个增量传输块的UI线程。目前尚不清楚是否可以将此阻止移动到后台线程。

youtube video of incremental scan progress