微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

扫描图像始终为 96 DPI

如何解决扫描图像始终为 96 DPI

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

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

        memset(errMsg,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,sizeof(BITMAPHANDLE));
    tBmp.uStructSize = sizeof(BITMAPHANDLE);
    memset(&appData,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,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,NULL,NULL);
    if(tBmp.Flags.Allocated)
        L_FreeBitmap(&tBmp);
}

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

谢谢
山姆

解决方法

我测试了 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,我们会为您检查。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。