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

时间:2009-08-11 13:26:39

标签: c# twain

我正在使用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);

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

3 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:1)

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

编辑:

看起来CAP_AUTOFEED是可行的方法。根据{{​​3}}:

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

答案 2 :(得分:0)

可行性的顺序非常重要,请参阅此文档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);

然后当发送Twain窗口消息时

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);