C++에서 TWAIN을 사용하여 스캔의 DPI를 설정하는 방법
-
06-07-2019 - |
문제
C++에서 TWAIN을 사용하고 있으며 사용자가 스캔 대화 상자에 표시되지 않고 대신 페이지가 설정된 기본값으로 스캔되어 저장되도록 DPI를 수동으로 설정하려고 합니다.DPI를 수동으로 설정해야 하는데 제대로 작동하지 않는 것 같습니다.ICAP_XRESOLUTION 및 ICAP_YRESOLUTION을 사용하여 기능 설정을 시도했습니다.이미지 정보를 보면 ICAP를 사용하여 설정한 것과 상관없이 항상 동일한 해상도가 표시됩니다.스캔한 이미지의 해상도를 설정하는 다른 방법이 있습니까? 아니면 문서 어디에서도 찾을 수 없는 추가 단계만 수행해야 합니까?
감사해요
해결책
ICAP_XResolution과 ICAP_YRESULOTION을 사용하여 스캐너의 스캔 해상도를 설정하고 적어도 여러 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;
}
값은 Twain에 의해 정의 된 부동 소수점 형식 인 Tw_fix32 유형이어야합니다 (이상하지만 참).
나는 그것이 당신을 위해 효과가 있기를 바랍니다!
다른 팁
그런 식으로 작동해야합니다.
하지만 불행하게도 우리는 완벽한 세상에 살고 있지 않습니다.TWAIN 드라이버는 가장 버그가 많은 드라이버 중 하나입니다.대부분의 운전자가 TWAIN을 사용하여 스캐닝 프로세스를 제어하는 것은 항상 큰 골치거리였습니다. 절대 스캔 대화 상자 없이 테스트되었습니다.
내가 아는 한, 두 대의 드라이버를 위한 테스트 스위트도 없기 때문에 각각은 조금씩 다르게 동작할 것입니다.
나는 90년대에 OCR 애플리케이션을 작성했고 이러한 문제도 처리해야 했습니다.결국 나는 지원되는 스캐너 목록과 스캐너 모듈을 갖게 되었습니다. 많이 각 드라이버에 대한 해킹 및 해결 방법.
예를 들어 ICAP_XRESOLUTION을 사용하십시오.TWAIN 문서에는 해상도를 32비트 부동 소수점으로 보내야 한다고 나와 있습니다.대신 정수를 사용하여 설정하려고 했습니까?또는 float로 보내지만 정수의 비트 표현을 float에 넣거나 그 반대의 경우도 마찬가지입니다.이 모든 것은 함께 일하는 운전자에게 효과적일 수 있습니다.아니면 전혀 작동하지 않을 수도 있습니다.
그 이후로 상황이 많이 바뀌었는지 의심스럽습니다.그러니 세상에 있는 기계의 적어도 절반에서 작동하게 되기를 바랍니다.