Как установить DPI сканирования с использованием TWAIN в C++
Я использую TWAIN в C++, и я пытаюсь установить DPI вручную, чтобы пользователь не отображался в диалоговом окне сканирования, а вместо этого страница просто сканирует с установленными значениями по умолчанию и сохраняется для них. Мне нужно установить DPI вручную, но я не могу заставить его работать. Я попытался установить возможность, используя ICAP_XRESOLUTION и ICAP_YRESOLUTION. Когда я смотрю на информацию об изображении, оно всегда показывает одно и то же разрешение, независимо от того, какое значение я установил, используя ICAP. Есть ли другой способ установить разрешение отсканированного изображения или нужно сделать еще один дополнительный шаг, которого я нигде не могу найти в документации?
Спасибо
2 ответа
Я использую 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 (странно, но верно).
Я надеюсь, что это работает для вас!
Это должно работать так, как надо.
Но, к сожалению, мы не живем в идеальном мире. Драйверы TWAIN являются одними из самых глючных. Управление процессом сканирования с помощью TWAIN всегда было большой головной болью, потому что большинство драйверов никогда не тестировались без диалога сканирования.
Насколько я знаю, для twain-драйверов также нет тест-комплекта, поэтому каждый из них будет вести себя немного по-разному.
Я написал приложение для оптического распознавания символов еще в 90-х годах, и мне пришлось решать эти проблемы. В итоге у меня был список поддерживаемых сканеров и модуль сканера с множеством хаков и обходных путей для каждого отдельного драйвера.
Возьмем, к примеру, ICAP_XRESOLUTION: документация TWAIN гласит, что вы должны отправить разрешение в виде 32-разрядного числа с плавающей запятой. Вы пытались установить его, используя целое число вместо этого? Или отправьте его как число с плавающей точкой, но поместите битовое представление целого числа в число с плавающей точкой, или наоборот. Все это может работать для водителя, с которым вы работаете. Или это не могло работать вообще.
Я сомневаюсь, что ситуация сильно изменилась с тех пор. Так что удачи в том, чтобы он работал как минимум на половине машин, которые там есть.