从应用扫描

本主题介绍如何使用平面、送纸器或自动配置的扫描源扫描应用中的内容。

重要的 API

若要从应用扫描,必须先通过声明新的 DeviceInformation 对象并获取 DeviceClass 类型来列出可用的扫描程序。 仅列出随 WIA 驱动程序一起在本地安装的扫描程序,并且可供应用使用。

应用列出可用的扫描程序后,可以使用基于扫描程序类型的自动配置的扫描设置,或者只需使用可用的平面或送纸器扫描源进行扫描。 若要使用自动配置的设置,必须启用扫描程序进行自动配置,并且不能同时配备平板扫描仪和送纸器扫描仪。 有关详细信息,请参阅 自动配置的扫描

枚举可用的扫描程序

Windows 不会自动检测扫描程序。 必须执行此步骤,以便应用与扫描程序通信。 在此示例中,扫描程序设备枚举是使用 Windows.Devices.Enumeration 命名空间完成的

  1. 首先,将这些 using 语句添加到类定义文件中。
    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 枚举类型(无论是 DefaultAutoConfiguredFlatbed 还是 Feeder),必须首先通过调用 ImageScanner.FromIdAsync 方法创建 ImageScanner 对象,如下所示。

   ImageScanner myScanner = await ImageScanner.FromIdAsync(deviceId);
  1. 只需扫描

若要使用默认设置进行扫描,应用依赖于 Windows.Devices.Scanners 命名空间来选择扫描程序并从该源进行扫描。 不会更改扫描设置。 可能的扫描程序是自动配置、平床或送纸器。 这种类型的扫描很可能生成成功的扫描操作,即使它从错误的源扫描,如平床而不是送纸器。

请注意 ,如果用户将文档置于送纸器中,扫描程序将改为从平床进行扫描。 如果用户尝试从空源器进行扫描,则扫描作业不会生成任何扫描的文件。  

    var result = await myScanner.ScanFilesToFolderAsync(ImageScannerScanSource.Default,
        folder).AsTask(cancellationToken.Token, progress);
  1. 从自动配置的平面或送纸源进行扫描

你的应用可以使用设备的 自动配置的扫描 扫描来扫描最佳扫描设置。 使用此选项,设备本身可以根据要扫描的内容来确定最佳扫描设置,例如颜色模式和扫描分辨率。 设备在运行时为每个新扫描作业选择扫描设置。

请注意 ,并非所有扫描程序都支持此功能,因此应用在使用此设置之前必须检查扫描程序是否支持此功能。

在此示例中,应用首先检查扫描程序是否能够自动配置,然后扫描。 若要指定平板扫描程序或送纸器扫描程序,只需将 AutoConfigured 替换为 FlatbedFeeder

    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 类动态扫描到任何文件夹,但必须在清单中声明图片库功能,以允许用户扫描到该文件夹。 有关应用功能的详细信息,请参阅 应用功能声明