Fazer scan a partir da sua app

Este tópico descreve como digitalizar conteúdo da sua aplicação usando um scanner plano, alimentador ou uma fonte de digitalização auto-configurada.

APIs importantes

Para digitalizar a partir da sua aplicação, o utilizador deve primeiro listar os scanners disponíveis, declarando um novo objeto DeviceInformation e obtendo o tipo DeviceClass. Apenas os scanners instalados localmente com drivers WIA são listados e estão disponíveis para seu aplicativo.

Depois de a sua aplicação listar os scanners disponíveis, pode usar as definições de digitalização configuradas automaticamente com base no tipo de scanner ou apenas digitalizar usando a fonte de digitalização disponível de mesa ou alimentador. Para usar as configurações configuradas automaticamente, o scanner deve estar habilitado para configuração automática e não deve estar equipado com um scanner de mesa e um scanner de alimentação. Para obter mais informações, consulte Digitalização Configurada Automaticamente.

Enumerar digitalizadores disponíveis

O Windows não deteta scanners automaticamente. Você deve executar esta etapa para que seu aplicativo se comunique com o scanner. Neste exemplo, a enumeração do dispositivo de varredura é feita usando o namespace Windows.Devices.Enumeration .

  1. Primeiro, adicione essas instruções using ao seu arquivo de definição de classe.
    using Windows.Devices.Enumeration;
    using Windows.Devices.Scanners;
  1. Em seguida, implemente um inspetor de dispositivo para começar a enumerar scanners. Para obter mais informações, consulte Listar Dispositivos.
    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. Crie um manipulador de eventos para quando um scanner for adicionado.
    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);
             }
       );
    }

Digitalizar

  1. Obter um objeto ImageScanner

Para cada tipo de enumeração ImageScannerScanSource, seja Padrão, AutoConfigured , Flatbedou Feeder, você deve primeiro criar um objeto ImageScanner chamando o método ImageScanner.FromIdAsync, como este.

   ImageScanner myScanner = await ImageScanner.FromIdAsync(deviceId);
  1. Basta digitalizar

Para digitalizar com as configurações padrão, a sua aplicação depende do namespace Windows.Devices.Scanners para selecionar um scanner e digitaliza a partir dessa fonte. Nenhuma configuração de verificação é alterada. Os scanners possíveis são auto-configuráveis, de mesa ou com alimentador. Este tipo de digitalização provavelmente produzirá uma operação bem-sucedida, mesmo que seja feita a partir de uma fonte incorreta, como um scanner de mesa em vez de um alimentador.

Nota Se o utilizador colocar o documento para digitalizar no alimentador, o scanner irá digitalizar a partir da superfície plana. Se o utilizador tentar digitalizar a partir de um alimentador vazio, a tarefa de digitalização não produzirá nenhum ficheiro digitalizado.  

    var result = await myScanner.ScanFilesToFolderAsync(ImageScannerScanSource.Default,
        folder).AsTask(cancellationToken.Token, progress);
  1. Digitalizar a partir de origem configurada automaticamente, mesa plana ou alimentadora

Seu aplicativo pode usar a Varredura Configurada Automaticamente do dispositivo para verificar com as configurações de verificação ideais. Com essa opção, o próprio dispositivo pode determinar as melhores configurações de digitalização, como modo de cor e resolução de digitalização, com base no conteúdo que está sendo digitalizado. O dispositivo seleciona as configurações de digitalização durante a execução para cada novo trabalho de digitalização.

Observação Nem todos os scanners suportam esse recurso, portanto, o aplicativo deve verificar se o scanner suporta esse recurso antes de usar essa configuração.

Neste exemplo, o aplicativo primeiro verifica se o scanner é capaz de configuração automática e, em seguida, verifica. Para especificar um scanner de mesa plana ou alimentador, basta substituir Autoconfigurado por Mesa Plana ou Alimentador.

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

Pré-visualizar a análise

É possível adicionar código para pré-visualizar a digitalização antes de digitalizar para uma pasta. No exemplo abaixo, a aplicação verifica se o scanner Flatbed suporta visualização e, em seguida, visualiza a digitalização.

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

Cancelar a verificação

Você pode permitir que os usuários cancelem o trabalho de verificação no meio de uma verificação, como esta.

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

Digitalização com progresso

  1. Crie um objeto System.Threading.CancellationTokenSource.
cancellationToken = new CancellationTokenSource();
  1. Configure o handler de eventos de progresso e obtenha o progresso da verificação.
    rootPage.NotifyUser("Scanning", NotifyType.StatusMessage);
    var progress = new Progress<UInt32>(ScanProgress);

Digitalização para a biblioteca de imagens

Os utilizadores podem efetuar a digitalização para qualquer pasta dinamicamente usando a classe FolderPicker, mas é necessário declarar o recurso Biblioteca de Imagens no manifesto para permitir que os utilizadores façam a digitalização para essa pasta. Para saber mais sobre os recursos do aplicativo, veja Declarações de recursos do aplicativo.