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 定义的浮点格式(奇怪但真实)。

我希望这个对你有用!

于 2009-06-18T14:29:10.307 回答
0

它应该以这种方式工作。

但不幸的是,我们并不是生活在一个完美的世界里。TWAIN 驱动程序是最容易出错的驱动程序之一。使用 TWAIN 控制扫描过程一直是一个令人头疼的问题,因为大多数驱动程序从未在没有扫描对话框的情况下进行过测试。

据我所知,也没有适用于 twain-drivers 的测试套件,因此它们每个人的行为都会略有不同。

我在 90 年代写了一个 OCR 应用程序,也不得不处理这些问题。我最终得到了一个受支持的扫描仪列表和一个扫描仪模块,其中包含针对每个不同驱动程序的大量技巧和解决方法。

以 ICAP_XRESOLUTION 为例: TWAIN 文档说您必须将分辨率作为 32 位浮点数发送。您是否尝试过使用整数来设置它?或者将其作为浮点数发送,但将整数的位表示放入浮点数中,反之亦然。所有这些都适用于您正在使用的驱动程序。或者它根本无法工作。

我怀疑从那以后情况发生了很大变化。祝你好运,让它在至少一半的机器上工作。

于 2009-06-18T14:07:32.020 回答