Сканирование документов в 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 способна постепенно показывать пиксели изображения по мере их поступления прямо в собственном пользовательском интерфейсе. Тем не менее, он по-прежнему блокирует поток пользовательского интерфейса для каждого добавочного блока передачи. Не ясно, может ли эта блокировка быть перемещена в фоновый поток или нет.