Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este tema se describe cómo escanear contenido desde tu aplicación utilizando un escáner plano, un alimentador o una fuente de escaneo configurada automáticamente.
- API importantes:Windows.Devices.Scanners, DeviceInformation, DeviceClass
Obtención de un dispositivo de escáner
Para examinar desde la aplicación, primero debes obtener un escáner disponible que esté conectado al equipo. Solo los escáneres instalados localmente con controladores de Windows Image Acquisition (WIA) se muestran y están disponibles para tu aplicación.
Para obtener un escáner conectado, puede usar la interfaz de usuario del sistema DevicePicker o usar otros Windows. Devices.Enumeration API como se muestra en Enumerate devices. En cualquier caso, puede usar el valor DeviceClass.ImageScanner como filtro para que DevicePicker o DeviceWatcher muestren solo dispositivos de escáner de imágenes.
Las API de enumeración de dispositivos proporcionan un objeto DeviceInformation que representa un dispositivo conectado al equipo. Después de tener el objeto DeviceInformation para un escáner, puede usarlo para crear un objeto ImageScanner . ImageScanner representa el escáner en el código de tu aplicación y te da acceso a las propiedades y métodos que usarás para escanear.
Selección de un escáner disponible
En este ejemplo, se usa el sistema DevicePicker para permitir al usuario elegir un escáner conectado.
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;
}
Enumerar escáneres disponibles
En este ejemplo, la enumeración del dispositivo de escáner se realiza mediante la clase DeviceWatcher de la Windows. Devices.Enumeration espacio de nombres. Para obtener más información, consulta Enumerar dispositivos.
- En primer lugar, añade estas instrucciones using a tu archivo de definición de clases.
using Windows.Devices.Enumeration;
using Windows.Devices.Scanners;
- A continuación, implemente un monitor de dispositivo para iniciar la enumeración de escáneres.
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();
}
}
- Cree un controlador de eventos para cuando se complete la enumeración del dispositivo.
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.";
}
});
}
- Cree controladores de eventos para cuando se agrega o quita un analizador.
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
Se utilizan las API del espacio de nombres Windows.Devices.Scanners para configurar y escanear desde un escáner. El objeto ImageScanner representa el escáner en el código de la aplicación y te proporciona acceso a propiedades y métodos que usarás para el examen.
Como se muestra en la sección anterior, creará una instancia de ImageScanner llamando a ImageScanner.FromIdAsync y pasando la DeviceInformation.Id del analizador que desea usar.
ImageScanner selectedScannerDevice;
selectedScannerDevice = await ImageScanner.FromIdAsync(scannerDeviceInfo.Id);
Para realizar un escaneo, llame a ImageScanner.ScanFileToFolderAsync y especifique el origen del escaneo y la carpeta de destino. Aquí se crea una carpeta denominada Scans en la biblioteca de Imágenes como destino de los resultados del escaneado.
StorageFolder folder = await KnownFolders.PicturesLibrary.CreateFolderAsync("Scans", CreationCollisionOption.OpenIfExists);
ImageScannerScanResult result = await selectedScannerDevice.ScanFilesToFolderAsync(ImageScannerScanSource.Default,
folder);
Escanear fuentes
Un escáner puede tener una superficie plana, un alimentador o ambos como fuente de escaneo. Algunos escáneres también admiten el escaneo con configuración automática. Estas fuentes de digitalización se identifican por la enumeración ImageScannerScanSource y están representadas por estas clases:
- ImageScannerFlatbedConfiguration (propiedad ImageScanner.FlatbedConfiguration)
- ImageScannerFeederConfiguration (propiedad ImageScanner.FeederConfiguration)
- ImageScannerAutoConfiguration (propiedad ImageScanner.AutoConfiguration)
Puede utilizar el objeto de origen de escaneo para:
- Compruebe si la fuente de escaneo es compatible con el escáner.
selectedScannerDevice.IsScanSourceSupported(ImageScannerScanSource.AutoConfigured); - Compruebe si el origen de escaneo admite escaneos de vista previa.
selectedScannerDevice.IsPreviewSupported(ImageScannerScanSource.Feeder); - Especifique qué fuente se debe escanear.
selectedScannerDevice.ScanFilesToFolderAsync(ImageScannerScanSource.Flatbed, folder);
Importante
Antes de obtener una vista previa o escanear desde una fuente distinta de la predeterminada, debe comprobar primero que se admiten las vistas previas de escaneo y la fuente de escaneo especificada.
También puede usar los objetos ImageScannerFlatbedConfiguration e ImageScannerFeederConfiguration para leer y establecer muchas propiedades del origen de examen correspondiente.
Origen de escaneo predeterminado
Para obtener el origen de examen predeterminado de un analizador, use la propiedad ImageScanner.DefaultScanSource . También puede usar el valor de enumeración ImageScannerScanSource.Default para especificar que se use el origen de examen predeterminado.
Por ejemplo, estas dos llamadas son equivalentes:
selectedScannerDevice.ScanFilesToFolderAsync(ImageScannerScanSource.Default, folder);
selectedScannerDevice.ScanFilesToFolderAsync(selectedScannerDevice.DefaultScanSource, folder);
Escaneo configurado automáticamente
Para usar los ajustes configurados automáticamente, el escáner debe estar habilitado para la autoconfiguración y no debe estar equipado con un escáner de superficie plana y un alimentador de documentos. Para obtener más información, consulta Escaneo configurado automáticamente.
Tu aplicación puede usar el escaneo configurado automáticamente del dispositivo para escanear con la configuración de escaneo más adecuada. Con esta opción, el propio dispositivo puede determinar la mejor configuración de examen, como el modo de color y la resolución del examen, en función del contenido que se está examinando. El dispositivo selecciona la configuración de escaneo en tiempo de ejecución para cada nuevo trabajo de escaneo.
Note
No todos los escáneres admiten esta característica, por lo que debe llamar a IsScanSourceSupported para comprobar si el analizador admite esta característica antes de usar esta configuración.
En este ejemplo, primero comprueba si el escáner admite la configuración automática y solo realiza el escaneo si es así.
if (selectedScannerDevice.IsScanSourceSupported(ImageScannerScanSource.AutoConfigured))
{
// Scan API call to start scanning with Auto-Configured settings.
ImageScannerScanResult result = await selectedScannerDevice.ScanFilesToFolderAsync(
ImageScannerScanSource.AutoConfigured, folder);
}
Vista previa del escaneo
Si el escáner lo admite, puede permitir al usuario obtener una vista previa del escaneo antes de guardarlo en una carpeta. En este ejemplo, la aplicación comprueba si la fuente de Feeder escaneo admite la vista previa y, a continuación, muestra una vista previa del escaneo si es así.
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.";
}
Este método muestra cómo mostrar la vista previa en la interfaz de usuario de la aplicación.
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;
}
Buscando en la biblioteca de imágenes
Los usuarios pueden escanear directamente a cualquier carpeta de forma dinámica mediante la clase FolderPicker, pero debe declarar la capacidad Pictures Library en el manifiesto para permitir que los usuarios escaneen a esa carpeta. Para obtener más información sobre las funcionalidades de la aplicación, consulta Declaraciones de funcionalidad de la aplicación.