【问题标题】:How do I set the DPI of a scan using TWAIN in C++如何在 C++ 中使用 TWAIN 设置扫描的 DPI
【发布时间】:2010-11-04 00:01:22
【问题描述】:

我在 C++ 中使用 TWAIN,我正在尝试手动设置 DPI,以便用户不会显示在扫描对话框中,而是页面仅使用设置的默认值进行扫描并为他们存储。我需要手动设置 DPI,但我似乎无法让它工作。我尝试使用 ICAP_XRESOLUTION 和 ICAP_YRESOLUTION 设置功能。当我查看图像的信息时,无论我使用 ICAP 将其设置为什么,它总是显示相同的分辨率。是否有另一种方法来设置扫描图像的分辨率,或者只是需要完成一个我在任何地方的文档中都找不到的额外步骤?

谢谢

【问题讨论】:

    标签: c++ twain image-scanner


    【解决方案1】:

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

    我希望它对你有用!

    【讨论】:

    • FloatToFIX32 是否有任何原因会作为未识别的标识符返回?
    • 你先生是个英雄,我希望这能登上谷歌的首页,因为这几乎没有任何记录。在提到它的地方没有详细提及。
    • 成为英雄真好 :) 我必须承认我不记得在哪里找到它了,应该是 7 或 8 年前。
    • 好吧,我写 TWAIN 工具包是为了谋生,所以我不是一个普通人 - 但是这个“几乎没有任何地方记录”是什么? TWAIN 规范说 ICAP_XRESOLUTION 采用 FIX32 值。您可以通过发送 MSG_SET 来设置功能。请参阅“从您的应用程序控制 TWAIN 会话”,它提供了用于设置功能的 C 代码。 Dani 的代码几乎与 TWAIN 规范中的代码相同,而 FloatToFIX32 是规范中的verbatim。 TWAIN 一个写得很糟糕的规范,没有论据,但是......你肯定没有在没有阅读规范的情况下尝试对 TWAIN API 进行编程吗?
    • @Dani van der Meer,我已经尝试过您的代码,但在复制粘贴后它不适用于我的“Plustek OpticSlim 500”...我只想补充:一些驱动程序需要设置DPI 在“EnableSource”之前,而不是之后。我使用了来自 codeproject 的著名 TWAIN 演示,并且不得不为我的扫描仪重构 Acquire 方法。希望它能帮助其他潜入 TWAIN 的可怜人......
    【解决方案2】:

    它应该可以正常工作。

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

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

    我在 90 年代写了一个 OCR 应用程序,并且还必须处理这些问题。我最终得到了一份受支持的扫描仪列表和一个扫描仪模块,其中包含很多针对每个不同驱动程序的黑客和解决方法。

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

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

    【讨论】:

    • 我已经尝试了以上所有方法,int,float,int into float。它只是似乎不想玩得很好。我注意到总的来说它是一个相当有问题的驱动程序。从第一天起,我就不得不与 TWAIN 抗争,才能让很多事情发挥作用。这是唯一的一个,但我一直无法找到解决方法。我只是假设存在一个我只是想念的东西
    • 您应该可以毫无问题地让 twain 驱动程序使用内置 GUI 传递图像。我认为除此之外的所有功能都是实验性的。
    • 哦-顺便说一句。你知道有多少主流应用程序不使用内置的 TWAIN GUI。让我猜猜:没有……知道为什么会这样吗?
    • 是的,我想使用 GUI,它肯定会让这变得更容易。这样做的整个目标是一个点击系统,尽管它涉及最少的屏幕交互。
    • 我早在 1994 年就编写了免费软件 EZTwain,自 1999 年以来一直在销售商业版本。我的大多数客户在运行扫描仪时都会隐藏 UI,无法设置分辨率的情况非常罕见问题。我同意 TWAIN 驱动程序在 No-UI 模式下存在缺陷且测试不佳,但我的经验不支持 Nils 的悲观主义。抱歉,如果这听起来很商业化,那不是故意的。我已经编写 TWAIN 代码 10 年了,我只是对这个主题有点痴迷......很高兴回答问题!
    猜你喜欢
    • 2019-06-11
    • 2017-11-25
    • 1970-01-01
    • 2019-07-09
    • 2023-03-14
    • 2016-04-27
    • 2012-03-05
    • 2012-12-14
    相关资源
    最近更新 更多