/// <summary> /// Previews the image from the scanner with given device id /// The preview is allowed only if the selected scanner is equipped with a Flatbed and supports preview. /// </summary> /// <param name="deviceId">scanner device id</param> /// <param name="stream">RandomAccessStream in which preview given the by the scan runtime API is kept</param> public async void ScanPreview(string deviceId, IRandomAccessStream stream) { try { // Get the scanner object for this device id ImageScanner myScanner = await ImageScanner.FromIdAsync(deviceId); if (myScanner.IsScanSourceSupported(ImageScannerScanSource.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); if (result.Succeeded) { Utils.SetImageSourceFromStream(stream, DisplayImage); rootPage.NotifyUser("Preview scanning is complete. Below is the preview image.", NotifyType.StatusMessage); } else { rootPage.NotifyUser("Failed to preview from Flatbed.", NotifyType.ErrorMessage); } } else { rootPage.NotifyUser("The selected scanner does not support preview from Flatbed.", NotifyType.ErrorMessage); } } else { rootPage.NotifyUser("The selected scanner does not report to be equipped with a Flatbed.", NotifyType.ErrorMessage); } } catch (Exception ex) { Utils.DisplayExceptionErrorMessage(ex); } }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CONSTRUCTORS / FACTORIES ///////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// public DiscoveredScanner(ImageScanner device, string name) { Device = device; Id = Device.DeviceId; Name = name; try { IsAutoAllowed = device.IsScanSourceSupported(ImageScannerScanSource.AutoConfigured); IsFeederAllowed = device.IsScanSourceSupported(ImageScannerScanSource.Feeder); IsFlatbedAllowed = device.IsScanSourceSupported(ImageScannerScanSource.Flatbed); } catch (Exception exc) { LogService.Log.Error(exc, "DiscoveredScanner: Couldn't determine supported scan sources."); throw; } // auto mode if (IsAutoAllowed) { LogService.Log.Information("DiscoveredScanner: Processing auto mode"); IsAutoPreviewAllowed = device.IsPreviewSupported(ImageScannerScanSource.AutoConfigured); AutoFormats = GenerateFormats(device.AutoConfiguration); } // flatbed mode if (IsFlatbedAllowed) { LogService.Log.Information("DiscoveredScanner: Processing flatbed mode"); IsFlatbedColorAllowed = device.FlatbedConfiguration.IsColorModeSupported(ImageScannerColorMode.Color); IsFlatbedGrayscaleAllowed = device.FlatbedConfiguration.IsColorModeSupported(ImageScannerColorMode.Grayscale); IsFlatbedMonochromeAllowed = device.FlatbedConfiguration.IsColorModeSupported(ImageScannerColorMode.Monochrome); IsFlatbedAutoColorAllowed = device.FlatbedConfiguration.IsColorModeSupported(ImageScannerColorMode.AutoColor); if (!IsFlatbedColorAllowed && !IsFlatbedGrayscaleAllowed && !IsFlatbedMonochromeAllowed && !IsFlatbedAutoColorAllowed) { // no color mode allowed, source mode is invalid IsFlatbedAllowed = false; LogService.Log.Warning("DiscoveredScanner: No color mode for flatbed allowed, invalid source mode"); } else { LogService.Log.Information("DiscoveredScanner: Flatbed supports at least one color mode"); try { IsFlatbedPreviewAllowed = device.IsPreviewSupported(ImageScannerScanSource.Flatbed); } catch (Exception exc) { LogService.Log.Error(exc, "DiscoveredScanner: Couldn't determine preview support for flatbed."); throw; } try { IsFlatbedAutoCropSingleRegionAllowed = device.FlatbedConfiguration .IsAutoCroppingModeSupported(ImageScannerAutoCroppingMode.SingleRegion); IsFlatbedAutoCropMultiRegionAllowed = device.FlatbedConfiguration .IsAutoCroppingModeSupported(ImageScannerAutoCroppingMode.MultipleRegion); } catch (Exception exc) { LogService.Log.Error(exc, "DiscoveredScanner: Couldn't determine auto crop support for flatbed."); throw; } FlatbedResolutions = GenerateResolutions(device.FlatbedConfiguration); LogService.Log.Information("Generated {@Resolutions} for flatbed.", FlatbedResolutions); FlatbedFormats = GenerateFormats(device.FlatbedConfiguration); LogService.Log.Information("Generated {@Formats} for feeder.", FlatbedFormats); try { if (device.FlatbedConfiguration.BrightnessStep != 0) { FlatbedBrightnessConfig = GenerateBrightnessConfig(device.FlatbedConfiguration); } } catch (Exception exc) { LogService.Log.Error(exc, "DiscoveredScanner: Couldn't determine BrightnessConfig for flatbed."); throw; } try { if (device.FlatbedConfiguration.ContrastStep != 0) { FlatbedContrastConfig = GenerateContrastConfig(device.FlatbedConfiguration); } } catch (Exception exc) { LogService.Log.Error(exc, "DiscoveredScanner: Couldn't determine ContrastConfig for flatbed."); throw; } } } // feeder mode if (IsFeederAllowed) { LogService.Log.Information("DiscoveredScanner: Processing feeder mode"); IsFeederColorAllowed = device.FeederConfiguration.IsColorModeSupported(ImageScannerColorMode.Color); IsFeederGrayscaleAllowed = device.FeederConfiguration.IsColorModeSupported(ImageScannerColorMode.Grayscale); IsFeederMonochromeAllowed = device.FeederConfiguration.IsColorModeSupported(ImageScannerColorMode.Monochrome); IsFeederAutoColorAllowed = device.FeederConfiguration.IsColorModeSupported(ImageScannerColorMode.AutoColor); if (!IsFeederColorAllowed && !IsFeederGrayscaleAllowed && !IsFeederMonochromeAllowed && !IsFeederAutoColorAllowed) { // no color mode allowed, source mode is invalid IsFeederAllowed = false; LogService.Log.Warning("DiscoveredScanner: No color mode for feeder allowed, invalid source mode"); } else { LogService.Log.Information("DiscoveredScanner: Feeder supports at least one color mode"); try { IsFeederDuplexAllowed = device.FeederConfiguration.CanScanDuplex; } catch (Exception exc) { LogService.Log.Error(exc, "DiscoveredScanner: Couldn't determine duplex support for feeder."); throw; } try { IsFeederPreviewAllowed = device.IsPreviewSupported(ImageScannerScanSource.Feeder); } catch (Exception exc) { LogService.Log.Error(exc, "DiscoveredScanner: Couldn't determine preview support for feeder."); throw; } try { IsFeederAutoCropSingleRegionAllowed = device.FeederConfiguration .IsAutoCroppingModeSupported(ImageScannerAutoCroppingMode.SingleRegion); IsFeederAutoCropMultiRegionAllowed = device.FeederConfiguration .IsAutoCroppingModeSupported(ImageScannerAutoCroppingMode.MultipleRegion); } catch (Exception exc) { LogService.Log.Error(exc, "DiscoveredScanner: Couldn't determine auto crop support for feeder."); throw; } FeederResolutions = GenerateResolutions(device.FeederConfiguration); LogService.Log.Information("Generated {@Resolutions} for feeder.", FeederResolutions); FeederFormats = GenerateFormats(device.FeederConfiguration); LogService.Log.Information("Generated {@Formats} for feeder.", FeederFormats); try { if (device.FeederConfiguration.BrightnessStep != 0) { FeederBrightnessConfig = GenerateBrightnessConfig(device.FeederConfiguration); } } catch (Exception exc) { LogService.Log.Error(exc, "DiscoveredScanner: Couldn't determine BrightnessConfig for feeder."); throw; } try { if (device.FeederConfiguration.ContrastStep != 0) { FeederContrastConfig = GenerateContrastConfig(device.FeederConfiguration); } } catch (Exception exc) { LogService.Log.Error(exc, "DiscoveredScanner: Couldn't determine ContrastConfig for feeder."); throw; } } } if (!IsAutoAllowed && !IsFlatbedAllowed && !IsFeederAllowed) { // no source mode allowed, scanner is invalid and useless throw new ArgumentException("Scanner doesn't support any source mode and can't be used."); } LogService.Log.Information("Created {@DiscoveredScanner}", this); }