Сканирование документов в Windows C# с добавочным пользовательским интерфейсом прогресса?

Как я могу постепенно сканировать документ в Windows из C#, получая при этом обратные вызовы, чтобы показать фрагменты изображения по мере их поступления, и обновить свой собственный пользовательский интерфейс прогресса?

Похоже, параметры API сканера включают в себя:

  • WIA, WIA Script Automation (windows)
  • TWAIN (Windows, Linux)
  • ImageKit и ImageCaptureCore (MacOS)
  • SANE (Linux)
  • ИГИЛ (окна, дорогой коммерческий).

Моя попытка на WIA Script Automation:

У меня есть простое приложение C#, которое использует Windows WIA Script Automation для сканирования документа. (см. код на github) Однако во время сканирования пользовательский интерфейс был захвачен всплывающим диалоговым окном прогресса.

Текущий код сканируется с использованием сценариев WIA CommonDialog.showTransfer ( см. здесь), который показывает всплывающее диалоговое окно индикатора выполнения. Я понимаю, что могу вместо этого использовать Item.Transfer однако он блокируется на весь период и не предлагает обратного вызова, поэтому я могу обновить свой собственный пользовательский интерфейс выполнения (или отменить передачу).

Есть ли способ сделать неблокирующее сканирование с помощью WIA или получить обратные вызовы прогресса?

Должен ли я использовать TWAIN?

1 ответ

Похоже, есть два варианта неблокирующего потокового сканирования в Windows:

WIA COM

Важно отметить, что WIA имеет как высокоуровневый интерфейс "автоматизации сценариев", так и низкоуровневый интерфейс COM. Использование WIA COM низкого уровня обеспечивает потоковый метод передачи данных с использованием IWiaTransfer и IWiaTransferCallback.

К сожалению, обертки C# WIA, которые я могу найти, используют интерфейс автоматизации сценариев, который не предоставляет интерфейс потокового сканирования.

двое

На стр. 4-20 спецификации Twain, озаглавленной " Передача в режиме буферизованной памяти", объясняется, как использовать буфер фиксированного размера для пошаговой передачи данных сканирования с помощью команд. DAT_SETUPMEMXFER а также DAT_IMAGEMEMXFER, Это все еще блокирует для каждого инкрементного буфера памяти, но после каждого буфера это позволяет приложению показать частичные входящие данные и продолжить передачу или отменить их.

Я попробовал twain-cs и twain-dsm, предоставленные twain.org, но они не видят мой сканер. Я также хотел бы избежать необходимости установки LGPL twaindsm.dll.

Оболочка twaindotnet обеспечивает некоторую поддержку Twain, которая работает и не требует встроенной DLL-библиотеки TwainDSM. К сожалению, он (пока) не поддерживает буферизованную передачу памяти. Поэтому я его продлил.

Моя ветвь incremental_scanning twaindotnet способна постепенно показывать пиксели изображения по мере их поступления прямо в собственном пользовательском интерфейсе. Тем не менее, он по-прежнему блокирует поток пользовательского интерфейса для каждого добавочного блока передачи. Не ясно, может ли эта блокировка быть перемещена в фоновый поток или нет.

YouTube видео о прогрессе сканирования

Другие вопросы по тегам