9

http://www.codeproject.com/KB/dotnet/twaindotnet.aspxのコードで遊んでいます

フィーダー内のすべてのドキュメントがスキャンされた後にのみtwainが制御を返すため、問題が発生しています。これにより、20以上のドキュメントをスキャンすると、メモリ使用量が高くなります。

フィーダーから一度に1つのドキュメントだけをスキャンし、画像を保存して、ループでAPIを再度呼び出すことを考えました。

cap_xfercountを1に設定していますが、これは役に立たないようです。

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

フィーダーから1つのドキュメントだけをスキャンするには、何をする必要がありますか?任意の提案をいただければ幸いです。

4

3 に答える 3

6

twaindotnet プロジェクトに詳しくなくて申し訳ありませんが、TWAIN によるドキュメント スキャンの経験は豊富にあります。

最初の注意: すべてのドキュメント フィーダーが単一ページ モードでフィードできるわけではありません。いくつかの重要なスキャナ ファミリは、一度開始するとフィーダ内のすべてを常にスキャンします。また、かなりの数の TWAIN ドライバーは、標準が何を言おうとも、XFERCOUNT=1 を尊重しません。

スキャナに「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 にする必要があります。アプリケーション Source の自動フィード プロセスを有効にするには、この機能を TRUE に設定します。無効にするには FALSE に設定します。 各転送の完了後、TW_PENDINGXFERS を確認します。Source に転送するイメージが他にもあるかどうかを判断するためにカウントします。-1 は、転送するイメージがまだあることを意味しますが、正確な数は不明です。CAP_FEEDERLOADED は、ソースのフィーダーがロードされているかどうかを示します。(この機能が TRUE の場合は常に、自動フィード プロセスが続行されます。)

于 2009-08-11T16:23:47.577 に答える
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);

そして、トウェインウィンドウメッセージが送信されたとき

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 に答える