Сканирование из приложения

В этом разделе описывается, как сканировать содержимое из приложения с помощью планшета, канала или автоматически настроенного источника сканирования.

Важные API

Важно!

API Windows.Devices.Scanners входят в семейство настольных устройств. Приложения могут использовать эти API только в настольной версии Windows 10.

Перед сканированием из приложения необходимо составить список доступных сканеров, объявив новый объект DeviceInformation и получив тип DeviceClass. В список включаются только сканеры, установленные локально с драйверами WIA. Приложению будут доступны только такие сканеры.

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

Перечисление доступных сканеров

Windows не определяет сканеры автоматически. Чтобы ваше приложение могло взаимодействовать со сканером, необходимо выполнить следующие шаги. В данном примере перечисление сканеров выполняется с использованием пространства имен Windows.Devices.Enumeration.

  1. Сначала добавьте эти операторы использования в ваш файл определения классов.
    using Windows.Devices.Enumeration;
    using Windows.Devices.Scanners;
  1. Затем примените наблюдатель устройства для запуска перечисления сканеров. Узнать больше об этом можно в разделе Перечисление устройств.
    void InitDeviceWatcher()
    {
       // Create a Device Watcher class for type Image Scanner for enumerating scanners
       scannerWatcher = DeviceInformation.CreateWatcher(DeviceClass.ImageScanner);

       scannerWatcher.Added += OnScannerAdded;
       scannerWatcher.Removed += OnScannerRemoved;
       scannerWatcher.EnumerationCompleted += OnScannerEnumerationComplete;
    }
  1. Создайте обработчик для события добавления сканера.
    private async void OnScannerAdded(DeviceWatcher sender,  DeviceInformation deviceInfo)
    {
       await
       MainPage.Current.Dispatcher.RunAsync(
             Windows.UI.Core.CoreDispatcherPriority.Normal,
             () =>
             {
                MainPage.Current.NotifyUser(String.Format("Scanner with device id {0} has been added", deviceInfo.Id), NotifyType.StatusMessage);

                // search the device list for a device with a matching device id
                ScannerDataItem match = FindInList(deviceInfo.Id);

                // If we found a match then mark it as verified and return
                if (match != null)
                {
                   match.Matched = true;
                   return;
                }

                // Add the new element to the end of the list of devices
                AppendToList(deviceInfo);
             }
       );
    }

Сканирование

  1. Получение объекта ImageScanner

Для каждого типа перечисления ImageScannerScanSource будь то По умолчанию, Автоопределение, Планшет или Податчик, необходимо сначала создать объект ImageScanner, вызвав метод ImageScanner.FromIdAsync, как показано ниже.

   ImageScanner myScanner = await ImageScanner.FromIdAsync(deviceId);
  1. Обычное сканирование

Чтобы выбрать сканер и сканировать с определенного источника с параметрами по умолчанию, приложение использует пространство имен Windows.Devices.Scanners. Никакие параметры сканирования не меняются. Возможные режимы сканирования: автовыбор, планшет, податчик бумаги При этом типе сканирования в большинстве случаев результаты успешны, даже если источник определен неправильно — например, планшет вместо податчика оригиналов.

Примечание Если пользователь помещает документ для сканирования в подающем канале, сканер будет выполнять сканирование с планшета. Если пользователь попытается сканировать из пустого податчика, задание сканирования не создаст ни одного отсканированного файла.  

    var result = await myScanner.ScanFilesToFolderAsync(ImageScannerScanSource.Default,
        folder).AsTask(cancellationToken.Token, progress);
  1. Сканирование с автоматическим определением источника с планшетного сканера или со сканера с модулем автоподачи оригиналов

Вы можете использовать в вашем приложении функцию Автоматическое сканирование устройства, чтобы сканирование выполнялось с оптимальными параметрами. В этом случае, исходя из сканируемого содержимого, устройство само сможет определить наилучшие параметры сканирования, например цветовой режим и разрешение. Устройство выбирает параметры сканирования в процессе выполнения для каждого нового задания сканирования.

Примечание Не все сканеры поддерживают эту функцию, поэтому приложение должно проверка, поддерживает ли сканер эту функцию, прежде чем использовать этот параметр.

В этом примере приложение сначала проверяет, поддерживает ли сканер возможность автовыбора, а затем сканирует. Чтобы указать планшетный сканер или сканер с модулем подачи, просто замените Автоопределение на Планшет или Податчик, соответственно.

    if (myScanner.IsScanSourceSupported(ImageScannerScanSource.AutoConfigured))
    {
        ...
        // Scan API call to start scanning with Auto-Configured settings.
        var result = await myScanner.ScanFilesToFolderAsync(
            ImageScannerScanSource.AutoConfigured, folder).AsTask(cancellationToken.Token, progress);
        ...
    }

Предварительный просмотр при сканировании

Вы можете добавить код для предварительного просмотра результата сканирования перед запуском сканирования в папку. В следующем примере приложение проверяет, поддерживает ли сканер с параметром Планшет предварительный просмотр, а затем создает окно предварительного просмотра сканирования.

if (myScanner.IsPreviewSupported(ImageScannerScanSource.Flatbed))
{
    rootPage.NotifyUser("Scanning", NotifyType.StatusMessage);
                // Scan API call to get preview from the flatbed.
                var result = await myScanner.ScanPreviewToStreamAsync(
                    ImageScannerScanSource.Flatbed, stream);

Отмена сканирования

Вы можете предоставить пользователям возможность отмены задания сканирования до его окончания.

void CancelScanning()
{
    if (ModelDataContext.ScenarioRunning)
    {
        if (cancellationToken != null)
        {
            cancellationToken.Cancel();
        }                
        DisplayImage.Source = null;
        ModelDataContext.ScenarioRunning = false;
        ModelDataContext.ClearFileList();
    }
}

Сканирование с индикатором выполнения

  1. Создайте объект System.Threading.CancellationTokenSource.
cancellationToken = new CancellationTokenSource();
  1. Настройте обработчик события хода выполнения и получите индикатор выполнения сканирования.
    rootPage.NotifyUser("Scanning", NotifyType.StatusMessage);
    var progress = new Progress<UInt32>(ScanProgress);

Сканирование в библиотеку изображений

Пользователи могут динамически выбирать папку для сканирования с помощью класса FolderPicker, но, чтобы они могли сохранять результаты сканирования в библиотеке изображений, необходимо объявить возможность Библиотека изображений в манифесте. Дополнительные сведения о возможностях приложения см. в разделе Объявление возможностей приложения.