如何在C#上逐步扫描Windows上的文档,同时获取回调以显示图像的各个部分,并更新我自己的自定义进度UI?
看起来扫描仪API选项包括:
我对WIA脚本自动化的尝试:
我有一个简单的C#应用程序,它使用Windows WIA Script Automation来扫描文档。 (参见code on github)但是,在扫描期间,UI被弹出进度对话框劫持。
当前代码使用WIA脚本CommonDialog.showTransfer
(see here)进行扫描,该脚本显示弹出进度条对话框。我知道我可以使用Item.Transfer
,但是,它会阻止整个持续时间并且不提供回调,因此我可以更新自己的自定义进度UI(或取消传输)。
有没有办法用WIA进行非阻塞扫描,或者获得进度回调?
我必须使用TWAIN吗?
答案 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线程。目前尚不清楚是否可以将此阻止移动到后台线程。