1

如何从 C# 增量扫描 Windows 上的文档,同时获取回调以显示图像的片段,并更新我自己的自定义进度 UI?

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

  • WIA、WIA 脚本自动化 (windows)
  • TWAIN(Windows、Linux)
  • ImageKit 和 ImageCaptureCore (MacOS)
  • 理智(Linux)
  • ISIS(窗户,昂贵的商业)。

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

我有一个简单的 C# 应用程序,它使用 Windows WIA 脚本自动化来扫描文档。(参见github 上的代码)但是,在扫描期间,UI 被弹出进度对话框劫持。

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

有什么方法可以使用 WIA 进行非阻塞扫描,或者获取进度回调?

我必须使用 TWAIN 吗?

4

1 回答 1

1

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

威亚通讯

需要注意的是,WIA 既有高级的“脚本自动化”接口,也有低级的 COM 接口。使用低级 WIA COM 提供了一种使用 IWiaTransfer 和IWiaTransferCallback的基于流的数据传输方法。

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

吐温

Twain 规范的第 4-20 页,标题为Buffered Memory Mode Transfer,解释了如何使用固定大小的缓冲区通过命令DAT_SETUPMEMXFERDAT_IMAGEMEMXFER. 这仍然会阻塞每个增量内存缓冲区,但在每个缓冲区之后,它允许应用程序显示部分传入数据,并继续传输或取消它。

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

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

的 twaindotnet 的 incremental_scanning 分支能够在图像像素到达时增量显示它们,就在本机 UI 中。但是,它仍然会为每个增量传输块阻塞 UI 线程。目前尚不清楚此阻塞是否可以移动到后台线程。

增量扫描进度的 youtube 视频

于 2017-06-02T16:18:51.937 回答