Вопрос два: возможно ли отсканировать только один документ из устройства подачи? - PullRequest
9 голосов
/ 11 августа 2009

Я играю с кодом из http://www.codeproject.com/KB/dotnet/twaindotnet.aspx

У меня проблема, потому что twain возвращает управление только после сканирования всех документов в устройстве подачи. Это приводит к высокому использованию памяти, если я сканирую 20 или более документов.

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

Я устанавливаю cap_xfercount равным 1, но это, похоже, не помогает:

    TwCapability cap = new TwCapability(TwCap.XferCount, 1);
    rc = DScap(appid, srcds, TwDG.Control, TwDAT.Capability, TwMSG.Set, cap);

Что мне нужно сделать, чтобы отсканировать только один документ из устройства подачи? Любые предложения приветствуются.

Ответы [ 3 ]

6 голосов
/ 27 октября 2009

Извините, что я не знаком с проектом twaindotnet, но у меня большой опыт сканирования документов через TWAIN.

Первое примечание: не все устройства подачи документов могут подавать в одностраничном режиме; некоторые важные семейства сканеров всегда сканируют все в устройстве подачи после запуска. И многие драйверы TWAIN не будут соблюдать XFERCOUNT = 1, независимо от того, что говорит стандарт.

Если вы попытаетесь решить проблему, заставив сканер сканировать «задания на одну страницу», вы будете ограничены (неопределенным) набором сканеров, которые поддерживают это. Стандарт TWAIN просто не требует этой функции. (Но да - комбинация CAP_AUTOSCAN = FALSE и XFERCOUNT = 1 будет использоваться для попытки.)

Существует лучшее решение (если позволяет время и терпение) - Похоже, вы хотите обрабатывать и распоряжаться каждым изображением по мере его поступления, а не собирать их все в памяти. Выясните, как заставить библиотеку TWAIN передавать вам каждое изображение (или записывать его в файл) по мере его поступления, а не складывать их в память, и у вас будет решение, которое работает со всеми сканерами для подачи документов. И он будет сканировать немного быстрее с большинством сканеров тоже ...

1 голос
/ 11 августа 2009

Это проблема с фидером. Вы пытались установить для функции фидера значение false?

EDIT:

Похоже, CAP_AUTOFEED это путь. Согласно спецификации TWAIN 2.0 :

CAP_AUTOFEED Описание Если установлено значение ИСТИНА, источник будет автоматически подавать следующую страницу из устройства подачи документов после получения количества кадров, согласованных для захвата с каждой страницы. CAP_FEEDERENABLED должно быть ИСТИНА, чтобы использовать эту возможность. заявка Установите значение TRUE, чтобы включить процесс автоматической подачи источника, или FALSE, чтобы отключить его. После завершения каждой передачи проверяйте TW_PENDINGXFERS. Подсчитать, чтобы определить, является ли Источник имеет больше изображений для передачи. -1 означает, что есть еще изображения для передачи, но точный номер не известен. CAP_FEEDERLOADED указывает, загружен ли фидер источника. (Автоматическая подача процесс продолжается всякий раз, когда эта возможность ИСТИНА.)

0 голосов
/ 14 августа 2009

Порядок возможностей важен, смотрите этот документ www.twain.org / docs / CapOrderForWeb .

РЕДАКТИРОВАТЬ:

Вот некоторые фрагменты кода из решения

Настройка автоматической подачи

capFeederEnabled = _twEntities.GetCapability(TwCap.FeederEnabled, (short)1);
TwRC rc = DScap(_applicationId, _sourceId, TwDG.Control, TwDAT.Capability, TwMSG.Set, capFeederEnabled);

TwCapability cap = _twEntities.GetCapability(TwCap.XferCount, 1);
rc = DScap(_applicationId, _sourceId, TwDG.Control, TwDAT.Capability, TwMSG.Set, cap);

и затем, когда отправляется сообщение из окна Твена

rc = DSixfer(_applicationId, _sourceId, TwDG.Image, TwDAT.ImageNativeXfer, TwMSG.Get, ref hbitmap);
rc = DSpxfer(_applicationId, _sourceId, TwDG.Control, TwDAT.PendingXfers, TwMSG.EndXfer, pxfr);

наконец сбросить сканер для следующего документа

rc = DSpxfer(_applicationId, _sourceId, TwDG.Control, TwDAT.PendingXfers, TwMSG.Reset, pxfr);
...