Поделиться через


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

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

Важные API

Чтобы проверить приложение, необходимо сначала перечислить доступные сканеры, объявив новый объект 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, будь то Default, AutoConfigured, Flatbed или Feeder, необходимо сначала создать объект 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. Сканирование из автоматически настроенного источника, неструктурированного или веб-канала

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

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

В этом примере приложение сначала проверяет, может ли сканер автоматически настраиваться, а затем сканирует. Чтобы указать средство проверки плоских или лентяных каналов, просто замените autoConfigured на Flatbed или Feeder.

    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);
        ...
    }

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

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

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