Twain 问题:是不是可以仅从进纸器扫描一份文档?
Posted
技术标签:
【中文标题】Twain 问题:是不是可以仅从进纸器扫描一份文档?【英文标题】:Twain question: is it possible to scan just one document from feeder?Twain 问题:是否可以仅从进纸器扫描一份文档? 【发布时间】:2010-11-18 14:57:09 【问题描述】:我在玩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);
我需要怎么做才能从进纸器中只扫描一份文档? 任何建议表示赞赏。
【问题讨论】:
您也应该查看code.google.com/p/twaindotnet;它基于 codeproject 代码。 【参考方案1】:很抱歉,我不熟悉 twaindotnet 项目,但我确实有很多通过 TWAIN 扫描文档的经验。
首先说明:并非所有文档进纸器都可以单页模式进纸;一旦启动,一些重要的扫描仪系列总是会扫描进纸器中的所有内容。而且,无论标准如何规定,很多 TWAIN 驱动程序都不会遵守 XFERCOUNT=1。
如果您试图通过强制扫描仪扫描“单页作业”来解决问题,您将受限于恰好支持该功能的(不确定的)一组扫描仪。 TWAIN 标准只是不需要此功能。 (但是是的 - CAP_AUTOSCAN=FALSE 和 XFERCOUNT=1 将是可以尝试的组合。)
有一个更好的解决方案(时间和耐心允许) - 听起来您想要做的是在每个图像到达时对其进行处理和处置,而不是将它们全部收集在内存中。弄清楚如何让您的 TWAIN 库在每个图像到达时将其交给您(或将其写入文件),而不是将它们堆叠在内存中,您将拥有一个适用于所有文档馈送扫描仪的解决方案。大多数扫描仪的扫描速度也会更快......
【讨论】:
【参考方案2】:这是一个馈线问题。您是否尝试过将启用馈线的功能设置为 false?
编辑:
看起来 CAP_AUTOFEED 是要走的路。根据TWAIN 2.0 specification:
CAP_AUTOFEED 描述 如果为 TRUE,则在从每页获取协商的捕获帧数后,源将自动从文档进纸器送入下一页。 CAP_FEEDERENABLED 必须为 TRUE 才能使用此功能。 应用 将功能设置为 TRUE 以启用源的自动馈送过程,或 FALSE 以禁用它。 每次传输完成后,检查 TW_PENDINGXFERS。计数以确定是否 源有更多图像要传输。 A -1 表示有更多图像要传输,但确切的 数量未知。 CAP_FEEDERLOADED 指示 Source 的 feeder 是否已加载。 (自动进给 只要此能力为 TRUE,过程就会继续。)
【讨论】:
是的,我做到了,它会尝试从平板扫描 我似乎无法关闭 caP-autofeed,也许扫描仪不支持此功能?我试过 cap = new TwCapability(TwCap.CAP_AUTOFEED, 0); rc = DScap(appid, srcds, TwDG.Control, TwDAT.Capability, TwMSG.Set, cap); rc 包含“失败” 嗯。有很多功能可以尝试。 CAP_AUTOSCAN = false 可以做到。如果那行不通,恐怕我还没有新的想法。【参考方案3】:电缆的顺序很重要,请参阅此文档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);
【讨论】:
以上是关于Twain 问题:是不是可以仅从进纸器扫描一份文档?的主要内容,如果未能解决你的问题,请参考以下文章