Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Questo argomento descrive come acquisire contenuto dalla propria app utilizzando uno scanner piano, un alimentatore o un'origine di acquisizione configurata automaticamente.
- APIimportanti:Windows. Devices.Scanners, DeviceInformation, DeviceClass
Ottenere un dispositivo scanner
Per eseguire l'analisi dall'app, devi prima ottenere uno scanner disponibile collegato al computer. Per l'app sono elencati e disponibili solo gli scanner installati localmente con i driver Windows Image Acquisition (WIA).
Per ottenere uno scanner collegato, è possibile usare l'interfaccia utente di sistema DevicePicker oppure usare altri Windows. Devices.Enumeration API come illustrato in Enumerate devices. In entrambi i casi, è possibile usare il valore DeviceClass.ImageScanner come filtro in modo che DevicePicker o DeviceWatcher mostri solo i dispositivi dello scanner di immagini.
Le API di enumerazione del dispositivo forniscono un oggetto DeviceInformation che rappresenta un dispositivo collegato al computer. Dopo aver ottenuto l'oggetto DeviceInformation per uno scanner, puoi usarlo per creare un oggetto ImageScanner . ImageScanner rappresenta lo scanner nel codice dell'app e consente di accedere alle proprietà e ai metodi che verranno usati per l'analisi.
Selezionare uno scanner disponibile
In questo esempio si usa devicePicker di sistema per consentire all'utente di scegliere uno scanner collegato.
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;
}
Enumerare gli scanner disponibili
In questo esempio, l'enumerazione dei dispositivi scanner viene eseguita utilizzando la classe DeviceWatcher dello spazio dei nomi Windows.Devices.Enumeration. Per altre info, si veda Enumerare i dispositivi.
- Per prima cosa, aggiungi queste direttive using al file di definizione della classe.
using Windows.Devices.Enumeration;
using Windows.Devices.Scanners;
- Successivamente, implementare un dispositivo di monitoraggio per avviare l'enumerazione degli scanner.
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();
}
}
- Creare un gestore eventi per al termine dell'enumerazione 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.";
}
});
}
- Creare gestori eventi per quando uno scanner viene aggiunto o rimosso.
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}";
});
}
Scansione
Si usano le API del Windows. Devices.Scanners spazio dei nomi per configurare ed eseguire l'analisi da uno scanner. L'oggetto ImageScanner rappresenta lo scanner nel codice dell'app e consente di accedere alle proprietà e ai metodi che verranno usati per l'analisi.
Come illustrato nella sezione precedente, si crea un'istanza di ImageScanner chiamando ImageScanner.FromIdAsync e passando il DeviceInformation.Id dello scanner da usare.
ImageScanner selectedScannerDevice;
selectedScannerDevice = await ImageScanner.FromIdAsync(scannerDeviceInfo.Id);
Per eseguire un'analisi, chiamare ImageScanner.ScanFileToFolderAsync e specificare l'origine di analisi e la cartella di destinazione. In questo caso, viene creata una cartella denominata Scans nella raccolta Immagini come destinazione per i risultati dell'analisi.
StorageFolder folder = await KnownFolders.PicturesLibrary.CreateFolderAsync("Scans", CreationCollisionOption.OpenIfExists);
ImageScannerScanResult result = await selectedScannerDevice.ScanFilesToFolderAsync(ImageScannerScanSource.Default,
folder);
Scansione delle fonti
Uno scanner può avere un piano fisso, un alimentatore o entrambi come origine di scansione. Alcuni scanner supportano anche l'analisi configurata automaticamente. Queste origini di analisi sono identificate dall'enumerazione ImageScannerScanSource e sono rappresentate da queste classi:
- ImageScannerFlatbedConfiguration (proprietà ImageScanner.FlatbedConfiguration )
- ImageScannerFeederConfiguration (proprietà ImageScanner.FeederConfiguration )
- ImageScannerAutoConfiguration (proprietà ImageScanner.AutoConfiguration )
È possibile usare l'oggetto di origine di analisi per:
- Controllare se l'origine di scansione è supportata dallo scanner.
selectedScannerDevice.IsScanSourceSupported(ImageScannerScanSource.AutoConfigured); - Controllare se l'origine dell'analisi supporta le analisi in anteprima.
selectedScannerDevice.IsPreviewSupported(ImageScannerScanSource.Feeder); - Specificare l'origine da cui eseguire l'analisi.
selectedScannerDevice.ScanFilesToFolderAsync(ImageScannerScanSource.Flatbed, folder);
Importante
Quando si esegue l'anteprima o l'analisi da un'origine diversa da Default, è prima necessario verificare che siano supportate le analisi di anteprima e l'origine di analisi specificata.
È anche possibile usare gli oggetti ImageScannerFlatbedConfiguration e ImageScannerFeederConfiguration per leggere e impostare molte proprietà dell'origine di analisi corrispondente.
Sorgente di scansione predefinita
Per ottenere l'origine di analisi predefinita di uno scanner, usare la proprietà ImageScanner.DefaultScanSource . È anche possibile usare il valore di enumerazione ImageScannerScanSource.Default per specificare che venga usata l'origine di analisi predefinita.
Ad esempio, queste due chiamate sono equivalenti:
selectedScannerDevice.ScanFilesToFolderAsync(ImageScannerScanSource.Default, folder);
selectedScannerDevice.ScanFilesToFolderAsync(selectedScannerDevice.DefaultScanSource, folder);
Scansione configurata automaticamente
Per usare le impostazioni configurate automaticamente, lo scanner deve essere abilitato all’autoconfigurazione e non deve essere dotato sia di uno scanner piano sia di uno scanner con alimentatore automatico. Per altre info, vedi Analisi configurata automaticamente.
L'app può usare la Scansione auto-configurata del dispositivo per eseguire l'analisi con le impostazioni più ottimali. Con questa opzione, il dispositivo stesso può determinare le migliori impostazioni di analisi, ad esempio la modalità colore e la risoluzione dell'analisi, in base al contenuto analizzato. Il dispositivo seleziona le impostazioni di analisi in fase di esecuzione per ogni nuovo processo di scansione.
Note
Non tutti gli scanner supportano questa funzionalità, quindi è necessario chiamare IsScanSourceSupported per verificare se lo scanner supporta questa funzionalità prima di usare questa impostazione.
In questo esempio si verifica innanzitutto se lo scanner è in grado di configurare automaticamente ed eseguire l'analisi solo se lo è.
if (selectedScannerDevice.IsScanSourceSupported(ImageScannerScanSource.AutoConfigured))
{
// Scan API call to start scanning with Auto-Configured settings.
ImageScannerScanResult result = await selectedScannerDevice.ScanFilesToFolderAsync(
ImageScannerScanSource.AutoConfigured, folder);
}
Visualizzare l'anteprima della scansione
Se il dispositivo scanner lo supporta, è possibile consentire all'utente di visualizzare l'anteprima dell'analisi prima di eseguire l'analisi in una cartella. In questo esempio, l'app verifica se l'origine di analisi Feeder supporta l'anteprima, quindi, in caso affermativo, mostra l'anteprima della scansione.
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.";
}
Questo metodo mostra come visualizzare l'anteprima nell'interfaccia utente dell'app.
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;
}
Scansione nella raccolta immagini
Gli utenti possono eseguire l'analisi in qualsiasi cartella in modo dinamico usando la classe FolderPicker, ma è necessario dichiarare la Pictures Library nel manifesto per consentire agli utenti di eseguire l'analisi in tale cartella. Per ulteriori informazioni sulle funzionalità dell'app, vedere Dichiarazione di funzionalità dell'app.