Как установить DPI сканирования с использованием TWAIN в C ++ - PullRequest
3 голосов
/ 18 июня 2009

Я использую TWAIN в C ++ и пытаюсь установить DPI вручную, чтобы пользователь не отображался в диалоговом окне сканирования, а вместо этого страница просто сканирует с установленными значениями по умолчанию и сохраняется для них. Мне нужно установить DPI вручную, но я не могу заставить его работать. Я попытался установить возможность, используя ICAP_XRESOLUTION и ICAP_YRESOLUTION. Когда я смотрю на информацию об изображении, оно всегда показывает одно и то же разрешение, независимо от того, какое значение я установил, используя ICAP. Есть ли другой способ установить разрешение отсканированного изображения или необходимо выполнить еще один дополнительный шаг, которого я нигде не могу найти в документации?

Спасибо

Ответы [ 2 ]

6 голосов
/ 18 июня 2009

Я использую 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 (странно, но верно).

Я надеюсь, что это работает для вас!

0 голосов
/ 18 июня 2009

Должно работать так.

Но, к сожалению, мы не живем в идеальном мире. Драйверы TWAIN являются одними из самых глючных. Управление процессом сканирования с помощью TWAIN всегда было большой головной болью, потому что большинство драйверов никогда не тестировались без диалога сканирования.

Насколько я знаю, для twain-драйверов также нет набора тестов, поэтому каждый из них будет вести себя немного по-разному.

Я написал приложение для оптического распознавания символов еще в 90-х годах, и мне пришлось также заниматься этими вопросами. В итоге я получил список поддерживаемых сканеров и модуль сканера с лотами хаков и обходных путей для каждого отдельного драйвера.

Возьмем, к примеру, ICAP_XRESOLUTION: документация TWAIN гласит, что вы должны отправить разрешение в виде 32-разрядного числа с плавающей запятой. Вы пытались установить его, используя целое число вместо этого? Или отправьте его как число с плавающей точкой, но поместите битовое представление целого числа в число с плавающей точкой, или наоборот. Все это может работать для водителя, с которым вы работаете. Или это не могло работать вообще.

Я сомневаюсь, что ситуация сильно изменилась с тех пор. Так что удачи в том, чтобы он работал, по крайней мере, на половине машин, которые там есть.

...