9

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

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

4

3 回答 3

6

很抱歉我不熟悉 twaindotnet 项目,但我确实有很多通过 TWAIN 扫描文档的经验。

首先要注意:并非所有文档进纸器都可以单页模式进纸;一旦启动,一些重要的扫描仪系列总是会扫描进纸器中的所有内容。而且,无论标准如何规定,相当多的 TWAIN 驱动程序都不会遵守 XFERCOUNT=1。

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

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

于 2009-10-27T07:44:15.700 回答
1

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

编辑:

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

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

于 2009-08-11T16:23:47.577 回答
0

cababilities 的顺序很重要,请参阅此文档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 Window 消息时

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);
于 2009-08-14T10:41:55.077 回答