Digitalizar de seu aplicativo

Este tópico descreve como examinar conteúdo no seu aplicativo usando um scanner de mesa, um alimentador ou uma origem de verificação configurada automaticamente.

Obter um dispositivo de scanner

Para examinar a partir do aplicativo, primeiro você deve ter um scanner disponível conectado ao computador. Somente os scanners instalados localmente com drivers do Windows Image Acquisition (WIA) estão listados e disponíveis para o seu aplicativo.

Para obter um scanner conectado, você pode usar a interface do usuário do sistema DevicePicker ou outras APIs Windows.Devices.Enumeration, conforme mostrado em Enumerar dispositivos. Em ambos os casos, você pode usar o valor DeviceClass.ImageScanner como um filtro para que o DevicePicker ou DeviceWatcher mostre apenas dispositivos de scanner de imagem.

As APIs de enumeração do dispositivo fornecem um objeto DeviceInformation que representa um dispositivo anexado ao computador. Depois de ter o objeto DeviceInformation para um scanner, você pode usá-lo para criar um objeto ImageScanner . O ImageScanner representa o verificador no código do aplicativo e fornece acesso a propriedades e métodos que você usará para verificação.

Escolher um verificador disponível

Neste exemplo, você usa o DevicePicker do sistema para permitir que o usuário escolha um scanner anexado.

DeviceInformation scannerDeviceInfo;
ImageScanner selectedScannerDevice;

private async Task InitializeScannerDevice()
{
    scannerDeviceInfo = await PickScannerDevice();
    if (scannerDeviceInfo is not null)
    {
        selectedScannerDevice = await ImageScanner.FromIdAsync(scannerDeviceInfo.Id);
        StatusBar.Message = $"Scanner selected: {scannerDeviceInfo.Name}.";
    }
    else
    {
        // Either no scanner is attached, or the user cancelled the device picker.
        StatusBar.Message = $"No scanner is selected.";
    }
}

private async Task<DeviceInformation> PickScannerDevice()
{
    var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(App.MainWindow);
    DevicePicker devicePicker = new();
    // Initialize the device picker with the window handle (HWND).
    WinRT.Interop.InitializeWithWindow.Initialize(devicePicker, hWnd);

    // Filter to show only image scanner devices in the picker.
    devicePicker.Filter.SupportedDeviceClasses.Add(DeviceClass.ImageScanner);

    scannerDeviceInfo = await devicePicker.PickSingleDeviceAsync(new Rect());
    return scannerDeviceInfo;
}

Listar scanners disponíveis

Neste exemplo, a enumeração do dispositivo de scanner é feita usando a classe DeviceWatcher do Windows. Devices.Enumeration namespace. Para obter mais informações, consulte Enumerar dispositivos.

  1. Primeiro, adicione-os usando instruções ao arquivo de definição da sua classe.
    using Windows.Devices.Enumeration;
    using Windows.Devices.Scanners;
  1. Em seguida, implemente um observador de dispositivo para começar a enumerar scanners.
ObservableCollection<DeviceInformation> scannerDeviceList = new();

private async void WatchScanners()
{
    scannerDeviceList.Clear();
    deviceWatcher = DeviceInformation.CreateWatcher(DeviceClass.ImageScanner);

    deviceWatcher.Added += DeviceWatcher_Added;
    deviceWatcher.Removed += DeviceWatcher_Removed;
    deviceWatcher.EnumerationCompleted += DeviceWatcher_EnumerationCompleted;

    if (deviceWatcher.Status == DeviceWatcherStatus.Created)
    {
        deviceWatcher.Start();
    }
}
  1. Crie um manipulador de eventos para quando a enumeração do dispositivo for concluída.
private void DeviceWatcher_EnumerationCompleted(DeviceWatcher sender, object args)
{
    DispatcherQueue.TryEnqueue(DispatcherQueuePriority.Normal, () =>
    {
        if (scannerDeviceList.Count == 0)
        {
            StatusBar.Message = "No scanners found. Please make sure that your scanner is on and properly connected.";
        }
        else
        {
            StatusBar.Message = "Enumeration of scanners is complete.";
        }
    });
}
  1. Crie manipuladores de eventos para quando um scanner for adicionado ou removido.
private void DeviceWatcher_Removed(DeviceWatcher sender, DeviceInformationUpdate args)
{
    DispatcherQueue.TryEnqueue(DispatcherQueuePriority.Normal, () =>
    {
        scannerDeviceList.Remove(scannerDeviceList.Where(x => x.Id == args.Id).FirstOrDefault());
        StatusBar.Message = $"Scanner removed: {args.Id}";
    });
}

private void DeviceWatcher_Added(DeviceWatcher sender, DeviceInformation args)
{
    DispatcherQueue.TryEnqueue(DispatcherQueuePriority.Normal, () =>
    {
        scannerDeviceList.Add(args);
        StatusBar.Message = $"Scanner added: {args.Name}";
    });
}

Digitalizar

Você usa APIs do Windows. Devices.Scanners namespace para configurar e verificar a partir de um scanner. O objeto ImageScanner representa o scanner no código do aplicativo e fornece acesso a propriedades e métodos que você usará para verificação.

Conforme mostrado na seção anterior, você cria uma instância do ImageScanner chamando ImageScanner.FromIdAsync e passando o DeviceInformation.Id do scanner que deseja usar.

ImageScanner selectedScannerDevice;
selectedScannerDevice = await ImageScanner.FromIdAsync(scannerDeviceInfo.Id);

Para executar uma verificação, chame ImageScanner.ScanFileToFolderAsync e especifique a origem da verificação e a pasta de destino. Aqui, uma pasta chamada Scans é criada na biblioteca de Imagens como destino para os resultados da digitalização.  

StorageFolder folder = await KnownFolders.PicturesLibrary.CreateFolderAsync("Scans", CreationCollisionOption.OpenIfExists);
                
ImageScannerScanResult result = await selectedScannerDevice.ScanFilesToFolderAsync(ImageScannerScanSource.Default,
        folder);

Fontes de verificação

Um scanner pode ter uma mesa plana, um alimentador ou ambos como fonte de verificação. Alguns scanners também oferecem suporte à varredura configurada automaticamente. Essas fontes de verificação são identificadas pela enumeração ImageScannerScanSource e são representadas por estas classes:

Você pode usar o objeto de origem da digitalização para:

  • Verifique se a origem de digitalização é compatível com o scanner.
    selectedScannerDevice.IsScanSourceSupported(ImageScannerScanSource.AutoConfigured);
    
  • Verifique se a origem da verificação é compatível com a versão prévia.
    selectedScannerDevice.IsPreviewSupported(ImageScannerScanSource.Feeder);
    
  • Especifique de qual origem examinar.
    selectedScannerDevice.ScanFilesToFolderAsync(ImageScannerScanSource.Flatbed, folder);
    

Importante

Ao fazer uma verificação ou uma versão prévia a partir de uma fonte diferente da fonte padrão, primeiro verifique se há suporte a verificações de versão prévia e à fonte de verificação especificada.

Você também pode usar os objetos ImageScannerFlatbedConfiguration e ImageScannerFeederConfiguration para ler e definir muitas propriedades da fonte de verificação correspondente.

Fonte padrão da verificação

Para obter a origem de digitalização padrão de um scanner, use a propriedade ImageScanner.DefaultScanSource. Você também pode usar o valor de enumeração ImageScannerScanSource.Default para especificar que a fonte de verificação padrão seja usada.

Por exemplo, essas duas chamadas são equivalentes:

selectedScannerDevice.ScanFilesToFolderAsync(ImageScannerScanSource.Default, folder);
selectedScannerDevice.ScanFilesToFolderAsync(selectedScannerDevice.DefaultScanSource, folder);

Varredura autoconfigurada

Para usar as configurações definidas automaticamente, o scanner deve estar habilitado para configuração automática e não deve ser equipado com um scanner de mesa e um scanner alimentador. Para obter mais informações, consulte Verificação configurada automaticamente.

Seu aplicativo pode usar a digitalização configurada automaticamente do dispositivo para digitalizar com as configurações de digitalização mais adequadas. 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.

Note

Nem todos os scanners dão suporte a esse recurso, portanto, você deve chamar IsScanSourceSupported para verificar se o verificador dá suporte a esse recurso antes de usar essa configuração.

Neste exemplo, primeiro você verifica se o scanner pode fazer a configuração automática e só executa a verificação se ela for automática.

if (selectedScannerDevice.IsScanSourceSupported(ImageScannerScanSource.AutoConfigured))
{
    // Scan API call to start scanning with Auto-Configured settings.
    ImageScannerScanResult result = await selectedScannerDevice.ScanFilesToFolderAsync(
        ImageScannerScanSource.AutoConfigured, folder);
}

Conferir a versão prévia da verificação

Se o scanner tiver suporte para ela, você permitirá que o usuário confira a versão prévia da verificação antes de verificar uma pasta. Neste exemplo, o aplicativo verifica se a origem da verificação Feeder oferece suporte à versão prévia, em seguida, confere a versão prévia da verificação, se houver suporte.

if (selectedScannerDevice.IsPreviewSupported(ImageScannerScanSource.Feeder))
{
    IRandomAccessStream stream = new InMemoryRandomAccessStream();
    // Scan API call to get preview from the Feeder.
    ImageScannerScanResult result = 
        await selectedScannerDevice.ScanPreviewToStreamAsync(ImageScannerScanSource.Feeder, stream);
    if (result.Succeeded)
    {
        // ScanPreviewImage is a XAML Image control (not shown).
        SetImageSourceFromStream(stream, ScanPreviewImage);
        StatusBar.Message = "Preview scan is complete.";
    }
    else
    {
        StatusBar.Message = $"Failed to preview from Feeder.";
    }
}
else
{
    StatusBar.Message = $"The selected scanner does not support preview from Feeder.";
}

Esse método mostra como mostrar a visualização na interface do usuário do aplicativo.

static async public void SetImageSourceFromStream(IRandomAccessStream stream, Image img)
{
    BitmapImage bitmap = await GetImageFromFile(stream);

    if ((bitmap.PixelHeight > img.Height) || (bitmap.PixelWidth > img.Width))
    {
        img.Stretch = Stretch.Uniform;
    }
    else
    {
        img.Stretch = Stretch.None;
    }
    img.Source = bitmap;
}

Verificação para a biblioteca de imagens

Os usuários podem verificar qualquer pasta dinamicamente usando a classe FolderPicker mas você deve declarar a funcionalidade Pictures Library no manifesto para permitir que os usuários examinem essa pasta. Para obter mais informações sobre os recursos do aplicativo, consulte Declarações de funcionalidade do aplicativo.