質問

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

ありがとう

役に立ちましたか?

解決

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で定義された浮動小数点形式です(奇妙ですが、真)。

それがあなたに役立つことを願っています!

他のヒント

正常に機能するはずです。

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

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

90年代にOCRアプリケーションを作成しましたが、これらの問題にも対処する必要がありました。結局、サポートされているスキャナーのリストと、異なるドライバーごとのハッキングと回避策の多くがあるスキャナーモジュールがありました。

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

その後、状況が大きく変わったとは思いません。そこにあるマシンの少なくとも半分で動作するように幸運を祈ります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top