3

C ++でTWAINを使用しており、DPIを手動で設定して、ユーザーがスキャンダイアログに表示されないようにしようとしていますが、代わりにページは設定されたデフォルトでスキャンされ、保存されます。DPIを手動で設定する必要がありますが、機能しないようです。ICAP_XRESOLUTIONとICAP_YRESOLUTIONを使用して機能を設定してみました。画像の情報を見ると、ICAPを使用して何を設定しても、常に同じ解像度が表示されます。スキャンした画像の解像度を設定する別の方法はありますか、それともドキュメントに見つからない追加の手順を実行する必要がありますか?

ありがとう

4

2 に答える 2

6

ICAP_XRESOLUTIONとICAP_YRESOLUTIONを使用してスキャナーのスキャン解像度を設定しましたが、少なくとも多くのHPスキャナーで機能します。

コードスニペット:

float x_res = 1200;
cap.Cap = ICAP_XRESOLUTION;
cap.ConType = TWON_ONEVALUE;
cap.hContainer = GlobalAlloc(GHND, sizeof(TW_ONEVALUE));
if(cap.hContainer)
{
    val_p = (pTW_ONEVALUE)GlobalLock(cap.hContainer);
    val_p->ItemType = TWTY_FIX32;
    TW_FIX32 fix32_val = FloatToFIX32(x_res);
    val_p->Item = *((pTW_INT32) &fix32_val);
    GlobalUnlock(cap.hContainer);
    ret_code = SetCapability(cap);
    GlobalFree(cap.hContainer);
}

TW_FIX32 FloatToFIX32(float i_float)
{
    TW_FIX32 Fix32_value;
    TW_INT32 value = (TW_INT32) (i_float * 65536.0 + 0.5);
    Fix32_value.Whole = LOWORD(value >> 16);
    Fix32_value.Frac = LOWORD(value & 0x0000ffffL);
    return Fix32_value;
}

値はTW_FIX32型である必要があります。これは、twainによって定義された浮動小数点形式です(奇妙ですがtrue)。

私はそれがあなたのために働くことを願っています!

于 2009-06-18T14:29:10.307 に答える
0

それはうまくいくはずです。

残念ながら、私たちは完璧な世界に住んでいるわけではありません。TWAIN ドライバーは、最もバグの多いドライバーの 1 つです。ほとんどのドライバはスキャン ダイアログなしでテストされたことがないため、TWAIN を使用してスキャン プロセスを制御することは常に大きな頭痛の種でした。

私の知る限り、twain ドライバー用のテスト スイートも存在しないため、それぞれの動作はわずかに異なります。

私は 1990 年代に OCR アプリケーションを書き、これらの問題にも対処しなければなりませんでした。私がたどり着いたのは、サポートされているスキャナーのリストと、さまざまなドライバーごとに多くのハックと回避策を備えたスキャナー モジュールです。

たとえば、ICAP_XRESOLUTION を見てみましょう。TWAIN のドキュメントには、解像度を 32 ビット浮動小数点として送信する必要があると書かれています。代わりに整数を使用して設定しようとしましたか? または、フロートとして送信し、整数のビット表現をフロートに入れるか、その逆を行います。これはすべて、使用しているドライバーで機能する可能性があります。または、まったく機能しませんでした。

それ以来、状況が大きく変わったとは思えません。運が良ければ、世の中にあるマシンの少なくとも半分で動作します。

于 2009-06-18T14:07:32.020 に答える