从应用扫描
本主题介绍如何使用平面、送纸器或自动配置的扫描源扫描应用中的内容。
重要的 API
若要从应用扫描,必须先通过声明新的 DeviceInformation 对象并获取 DeviceClass 类型来列出可用的扫描程序。 仅列出随 WIA 驱动程序一起在本地安装的扫描程序,并且可供应用使用。
应用列出可用的扫描程序后,可以使用基于扫描程序类型的自动配置的扫描设置,或者只需使用可用的平面或送纸器扫描源进行扫描。 若要使用自动配置的设置,必须启用扫描程序进行自动配置,并且不能同时配备平板扫描仪和送纸器扫描仪。 有关详细信息,请参阅 自动配置的扫描。
枚举可用的扫描程序
Windows 不会自动检测扫描程序。 必须执行此步骤,以便应用与扫描程序通信。 在此示例中,扫描程序设备枚举是使用 Windows.Devices.Enumeration 命名空间完成的。
- 首先,将这些 using 语句添加到类定义文件中。
using Windows.Devices.Enumeration;
using Windows.Devices.Scanners;
- 接下来,实现设备观察程序以开始枚举扫描程序。 有关详细信息,请参阅 枚举设备。
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;
}
- 为添加扫描程序时创建事件处理程序。
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);
}
);
}
扫描
- 获取 ImageScanner 对象
对于每个 ImageScannerScanSource 枚举类型(无论是 Default、AutoConfigured、Flatbed 还是 Feeder),必须首先通过调用 ImageScanner.FromIdAsync 方法创建 ImageScanner 对象,如下所示。
ImageScanner myScanner = await ImageScanner.FromIdAsync(deviceId);
- 只需扫描
若要使用默认设置进行扫描,应用依赖于 Windows.Devices.Scanners 命名空间来选择扫描程序并从该源进行扫描。 不会更改扫描设置。 可能的扫描程序是自动配置、平床或送纸器。 这种类型的扫描很可能生成成功的扫描操作,即使它从错误的源扫描,如平床而不是送纸器。
请注意 ,如果用户将文档置于送纸器中,扫描程序将改为从平床进行扫描。 如果用户尝试从空源器进行扫描,则扫描作业不会生成任何扫描的文件。
var result = await myScanner.ScanFilesToFolderAsync(ImageScannerScanSource.Default,
folder).AsTask(cancellationToken.Token, progress);
- 从自动配置的平面或送纸源进行扫描
你的应用可以使用设备的 自动配置的扫描 扫描来扫描最佳扫描设置。 使用此选项,设备本身可以根据要扫描的内容来确定最佳扫描设置,例如颜色模式和扫描分辨率。 设备在运行时为每个新扫描作业选择扫描设置。
请注意 ,并非所有扫描程序都支持此功能,因此应用在使用此设置之前必须检查扫描程序是否支持此功能。
在此示例中,应用首先检查扫描程序是否能够自动配置,然后扫描。 若要指定平板扫描程序或送纸器扫描程序,只需将 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();
}
}
扫描进度
- 创建 System.Threading.CancellationTokenSource 对象。
cancellationToken = new CancellationTokenSource();
- 设置进度事件处理程序并获取扫描的进度。
rootPage.NotifyUser("Scanning", NotifyType.StatusMessage);
var progress = new Progress<UInt32>(ScanProgress);
扫描到图片库
用户可以使用 FolderPicker 类动态扫描到任何文件夹,但必须在清单中声明图片库功能,以允许用户扫描到该文件夹。 有关应用功能的详细信息,请参阅 应用功能声明。