问题描述
我正在尝试使用 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 像素的图像,但是 XResolution
和 YResolution
设置为 96,这导致保存的图像为 26.5"x34.375"。
谢谢
山姆
解决方法
我测试了 4 个不同的 Twain 驱动程序并得到以下结果:
- 其中一个不支持 300 DPI,因此在调用 L_TwainSetResolution() 时返回错误“Bad value”。但是,它返回了它支持的实际 DPI 的正确图像大小,即 100。
- 其他 3 个支持不同的 DPI 值,并在回调的 pBitmap 中返回正确的图像大小和 DPI 值。
我的代码和你的代码之间唯一的主要区别是我调用了 L_TwainEndSession()。如果您的代码不包含它,请确保每次调用 L_TwainInitSession/L_TwainInitSession2 时都调用一次。
如果这不是问题的原因,请尝试使用多个 Twain 驱动程序进行测试,看看问题是否特定于一个驱动程序。如果不是,请将您的代码放入一个小型测试程序中,并通过电子邮件发送至 support@leadtools.com,我们会为您检查。