吐温问题:是否可以只从馈线扫描一个文件?

我正在使用http://www.codeproject.com/KB/dotnet/twaindotnet.aspx中的代码

我遇到了问题,因为twain只有在扫描进纸器中的所有文件后才会返回控制权。 如果我扫描20个或更多文档,这会导致高内存使用量。

我想过从进纸器一次只扫描一个文件并保存图像并再次循环调用api。

我将cap_xfercount设置为1,但这似乎没有帮助:

TwCapability cap = new TwCapability(TwCap.XferCount, 1); rc = DScap(appid, srcds, TwDG.Control, TwDAT.Capability, TwMSG.Set, cap); 

从进纸器扫描一个文件我需要做什么? 任何建议赞赏。

对不起,我不熟悉twaindotnet项目,但我对通过TWAIN进​​行文档扫描有很多经验。

首先注意:并非所有文件馈送器都能以单页模式进行馈送; 一些重要的扫描仪系列在启动后始终会扫描进纸器中的所 而且,不管标准是什么,相当多的TWAIN驱动程序都不会尊重XFERCOUNT = 1。

如果您尝试通过强制扫描程序扫描“单页作业”来解决问题,则您将被限制为恰好支持该扫描程序的(不确定的)扫描程序集。 TWAIN标准不需要此function。 (但是 – CAP_AUTOSCAN = FALSE,XFERCOUNT = 1将是尝试的组合。)

有一个更好的解决方案(时间和耐心允许) – 听起来你想要做的是处理和处理每个图像到达时,而不是将它们全部收集在内存中。 弄清楚如何让TWAIN库在每个图像到达时将其写入(或写入文件),而不是将它们堆叠在内存中,并且您将拥有适用于所有文档馈送扫描仪的解决方案。 对于大多数扫描仪来说,扫描速度也会快得多……

这是一个支线问题。 您是否尝试将启用馈线的function设置为false?

编辑:

看起来像CAP_AUTOFEED是要走的路。 根据TWAIN 2.0规范 :

CAP_AUTOFEED说明如果为TRUE,则在获取从每个页面协商捕获的帧数后,源将自动从文档进纸器馈送下一页。 CAP_FEEDERENABLED必须为TRUE才能使用此function。 应用程序将function设置为TRUE以启用Source的自动提要过程, 或将FALSE设置为禁用它。 完成每次转帐后,请检查TW_PENDINGXFERS。 计数以确定源是否有更多要传输的图像。 A -1表示有更多图像要传输,但确切的数字是未知的。 CAP_FEEDERLOADED指示是否已加载Source的进纸器。 (只要此function为TRUE,自动送纸过程就会继续。)

可操作性的顺序很重要,请参阅此文档www.twain.org/docs/CapOrderForWeb 。

编辑:

这些是解决方案中的一些代码片段

设置自动送纸

 capFeederEnabled = _twEntities.GetCapability(TwCap.FeederEnabled, (short)1); TwRC rc = DScap(_applicationId, _sourceId, TwDG.Control, TwDAT.Capability, TwMSG.Set, capFeederEnabled); TwCapability cap = _twEntities.GetCapability(TwCap.XferCount, 1); rc = DScap(_applicationId, _sourceId, TwDG.Control, TwDAT.Capability, TwMSG.Set, cap); 

然后当发送吐温窗口消息时

 rc = DSixfer(_applicationId, _sourceId, TwDG.Image, TwDAT.ImageNativeXfer, TwMSG.Get, ref hbitmap); rc = DSpxfer(_applicationId, _sourceId, TwDG.Control, TwDAT.PendingXfers, TwMSG.EndXfer, pxfr); 

最后重置扫描仪以下一个文档

 rc = DSpxfer(_applicationId, _sourceId, TwDG.Control, TwDAT.PendingXfers, TwMSG.Reset, pxfr);