Как установить DPI сканирования с помощью TWAIN в C++

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

Спасибо


person netadptr0719    schedule 18.06.2009    source источник


Ответы (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 (странно, но верно).

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

person Dani van der Meer    schedule 18.06.2009
comment
Есть ли причина, по которой FloatToFIX32 будет возвращать неопознанный идентификатор? - person netadptr0719; 18.06.2009
comment
Вы, сэр, герой, я надеюсь, что это попадет на первую страницу Google, потому что это почти нигде не задокументировано. Там, где это упоминается, это не упоминается очень подробно. - person netadptr0719; 18.06.2009
comment
Здорово быть героем :) Должен признаться, что не помню, где я его нашел, наверное, лет 7 или 8 назад. - person Dani van der Meer; 18.06.2009
comment
ОК, я пишу TWAIN-инструменты для заработка, так что я не нормальный человек - но что это задокументировано почти нигде? Спецификация TWAIN говорит, что ICAP_XRESOLUTION принимает значение FIX32. Вы устанавливаете возможности, отправляя сообщение MSG_SET. См. раздел Управление сеансом TWAIN из вашего приложения, в котором приведен код C для настройки возможности. Код Дани почти идентичен коду в спецификации TWAIN, а FloatToFIX32 дословно взят из спецификации. TWAIN является ужасно написанной спецификацией, без аргументов, но... вы же не пробовали программировать API TWAIN, не прочитав спецификацию? - person Spike0xff; 03.07.2009
comment
@ Дэни ван дер Меер, я попробовал ваш код, но он не работает для моего Plustek OpticSlim 500 после копирования и вставки ... Я просто хочу добавить: некоторые драйверы требуют установки DPI до EnableSource, а не ПОСЛЕ. Я использовал известную демонстрацию TWAIN из codeproject, и мне пришлось реорганизовать метод Acquire для моего сканера. Надеюсь, это поможет другим бедолагам, погружающимся в TWAIN... - person Andrew Florko; 16.09.2011

Это должно работать так.

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

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

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

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

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

person Nils Pipenbrinck    schedule 18.06.2009
comment
Я в значительной степени пробовал все вышеперечисленное, int, float, int в float. Он просто не хочет играть красиво. Я заметил, что в целом это довольно глючный драйвер. Мне пришлось бороться с TWAIN с самого первого дня, чтобы заставить что-либо работать. Это единственный, но я не смог найти работу. Я просто предположил, что существует один, который я просто пропустил или что-то в этом роде. - person netadptr0719; 18.06.2009
comment
у вас не должно возникнуть проблем с получением драйвера twain для доставки изображения с использованием встроенного графического интерфейса. Я считаю все функции, кроме этого, экспериментальными. - person Nils Pipenbrinck; 18.06.2009
comment
ОН - кстати. Сколько основных приложений вы знаете, которые не используют встроенный графический интерфейс TWAIN? Дайте угадаю: нет. Есть идеи, почему это так? - person Nils Pipenbrinck; 18.06.2009
comment
Да, я хотел бы использовать графический интерфейс, это, безусловно, сделало бы это намного проще. Вся цель этого — система «наведи и щелкни», которая требует минимального взаимодействия с экраном. - person netadptr0719; 18.06.2009
comment
Я написал бесплатное программное обеспечение EZTwain еще в 1994 году, а коммерческую версию продаю с 1999 года. Большинство моих клиентов используют сканеры с отключенным пользовательским интерфейсом, и невозможность установить разрешение является очень и очень редкой проблемой. Я согласен с тем, что драйверы TWAIN глючат и плохо протестированы в режиме No-UI, но мой опыт не подтверждает пессимизма Нильса. Извините, если это звучит коммерчески, это не должно быть. Я пишу код TWAIN уже 10 лет, я просто помешан на этом предмете... С удовольствием отвечу на вопросы! - person Spike0xff; 03.07.2009