0

我正在尝试使用 Leadtools API 版本 21 自动扫描一些文档,同时从代码设置一些属性(不想显示 TWAIN 对话框)。例如,我使用 将扫描 DPI 设置为 300 L_TwainSetResolution(),但我在位图回调中获得的图像始终具有 96x96 的分辨率。
这是我所做的 sudo 代码(它在辅助线程中运行,并且解锁已在主线程中完成):

void CheckRetCode(int rc)
{
    if (SUCCESS != rc)
    {
        L_TCHAR errMsg[1024];

        memset(errMsg, 0, sizeof(errMsg));
        L_GetFriendlyErrorMessage(rc, errMsg, 1024, L_FALSE);

        throw TLeadException(errMsg, rc);
    }
}
L_INT EXT_CALLBACK GetBmpCB(HTWAINSESSION hS, pBITMAPHANDLE pBitmap, L_VOID* pUserData)
{
    // in here pBitmap->XResolution and pBitmap->YResolution are always 96
    // but I have clearly set them to 300
    
    // process image here
    
    L_FreeBitmap(pBitmap); // free the image
    return SUCCESS;
} 
void OnThreadExecute(void)
{
    HTWAINSESSION hSession = nullptr;
    APPLICATIONDATA appData;
    L_INT nRet;
    L_TCHAR pszTwnSourceName[1024];
    LTWAINSOURCE sInfo;
    TW_FIX32 XRes = L_TwainFloatToFix32(300.0);
    TW_FIX32 YRes = L_TwainFloatToFix32(300.0);
    BITMAPHANDLE tBmp;

    memset(&tBmp, 0, sizeof(BITMAPHANDLE));
    tBmp.uStructSize = sizeof(BITMAPHANDLE);
    memset(&appData, 0, sizeof(APPLICATIONDATA));
    appData.uStructSize = sizeof(APPLICATIONDATA);
    appData.hWnd = hWnd;// hWnd is valid handle of my main window
    appData.uLanguage = TWLG_ENGLISH_USA;
    appData.uCountry = TWCY_USA;
    wcscpy(appData.szManufacturerName, L"MyCompanyName");
    wcscpy(appData.szAppProductFamily, L"MyProductName");
    wcscpy(appData.szAppName, appData.szAppProductFamily);
    wcscpy(appData.szVersionInfo, L"Version 0.1.0.1");
    nRet = L_TwainInitSession2(&hSession, &appData, LTWAIN_INIT_MULTI_THREADED);
    CheckRetCode(nRet);here
    memset(pszTwnSourceName, 0, sizeof(pszTwnSourceName));
    wcscpy(pszTwnSourceName, L"EPSON Artisan837/PX830"); 
    sInfo.uStructSize = sizeof(LTWAINSOURCE);
    sInfo.pszTwainSourceName = pszTwnSourceName;
    CheckRetCode(L_TwainSelectSource(hSession, &sInfo));
    CheckRetCode(L_TwainStartCapsNeg(hSession));
    CheckRetCode(L_TwainSetImageUnit(hSession, TWUN_INCHES)); 
    CheckRetCode(L_TwainEnableDuplex(hSession, FALSE));
    CheckRetCode(L_TwainSetResolution(hSession, &XRes, &YRes)); // setting the res to 300 x 300
    CheckRetCode(L_TwainEndCapsNeg(hSession));
    L_TwainAcquire(hSession, &tBmp, sizeof(BITMAPHANDLE), GetBmpCB, 0, NULL, NULL);
    if(tBmp.Flags.Allocated)
        L_FreeBitmap(&tBmp);
}

顺便说一句,扫描的图像具有正确的像素数。如果我扫描 8.5x11 的页面,我会得到一个 2550x3300 像素的图像,但设置为 96 XResolutionYResolution这会导致保存的图像为 26.5"x34.375"。

谢谢
山姆

4

1 回答 1

0

我用 4 个不同的 Twain 驱动程序进行了测试,得到了以下结果:

  1. 其中一个不支持 300 DPI,因此在调用 L_TwainSetResolution() 时返回错误“Bad value”。但是,它返回了它支持的实际 DPI 的正确图像大小,即 100。
  2. 其他 3 个支持不同的 DPI 值,并在回调的 pBitmap 中返回正确的图像大小和 DPI 值。

我的代码和你的代码之间唯一的主要区别是我调用了 L_TwainEndSession()。如果您的代码不包含它,请确保每次调用 L_TwainInitSession/L_TwainInitSession2 时调用一次。

如果这不是问题的原因,请尝试使用多个 Twain 驱动程序进行测试,看看问题是否特定于一个驱动程序。如果不是,请将您的代码放入一个小型测试程序并通过电子邮件发送至 support@leadtools.com,我们会为您检查。

于 2021-01-10T13:36:12.660 回答