///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // METHODS ////////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /// <summary> /// Generates the <see cref="BrightnessConfig"/> for a flatbed/feeder <paramref name="config"/>. /// </summary> internal static BrightnessConfig GenerateBrightnessConfig(IImageScannerSourceConfiguration config) { if (config.BrightnessStep == 0) { return(null); } BrightnessConfig result = new BrightnessConfig { MinBrightness = config.MinBrightness, MaxBrightness = config.MaxBrightness, BrightnessStep = (int)config.BrightnessStep, DefaultBrightness = config.DefaultBrightness, }; // determine virtual default brightness if (Math.Abs(Math.Abs(result.DefaultBrightness + result.BrightnessStep) - Math.Abs(result.MaxBrightness)) <= Math.Abs(Math.Abs(result.DefaultBrightness - result.BrightnessStep) - Math.Abs(result.MinBrightness))) { result.VirtualDefaultBrightness = result.DefaultBrightness - result.BrightnessStep; } else { result.VirtualDefaultBrightness = result.DefaultBrightness + result.BrightnessStep; } return(result); }
/// <summary> /// Generates the <see cref="ContrastConfig"/> for a flatbed/feeder <paramref name="config"/>. /// </summary> internal static ContrastConfig GenerateContrastConfig(IImageScannerSourceConfiguration config) { if (config.ContrastStep == 0) { return(null); } ContrastConfig result = new ContrastConfig { MinContrast = config.MinContrast, MaxContrast = config.MaxContrast, ContrastStep = (int)config.ContrastStep, DefaultContrast = config.DefaultContrast, }; // determine virtual default contrast if (Math.Abs(Math.Abs(result.DefaultContrast + result.ContrastStep) - Math.Abs(result.MaxContrast)) <= Math.Abs(Math.Abs(result.DefaultContrast - result.ContrastStep) - Math.Abs(result.MinContrast))) { result.VirtualDefaultContrast = result.DefaultContrast - result.ContrastStep; } else { result.VirtualDefaultContrast = result.DefaultContrast + result.ContrastStep; } return(result); }
/// <summary> /// Generates the true available resolution values for a flatbed/feeder configuration. Also enriches the resolution /// values with the related <see cref="ResolutionAnnotation"/> and a friendly string. /// Assumption: DpiX = DpiY /// </summary> /// <param name="config">The configuration for which resolution values are to be determined.</param> internal static ObservableCollection <ScanResolution> GenerateResolutions(IImageScannerSourceConfiguration config) { float currentValue = config.MinResolution.DpiX; float lastValue = -1; ObservableCollection <ScanResolution> result = new ObservableCollection <ScanResolution>(); int bestDocumentsResolution = -1, bestPhotosResolution = -1; while (currentValue <= config.MaxResolution.DpiX) { config.DesiredResolution = new ImageScannerResolution { DpiX = currentValue, DpiY = currentValue }; if (config.ActualResolution.DpiX != lastValue) { ScanResolution newRes = new ScanResolution(config.ActualResolution.DpiX, ResolutionAnnotation.None); result.Add(newRes); lastValue = config.ActualResolution.DpiX; // check how suitable these resolutions are for scanning documents and photos if (bestDocumentsResolution == -1 || Math.Abs(ScanResolution.DocumentsResolution - newRes.Resolution.DpiX) < Math.Abs(ScanResolution.DocumentsResolution - result[bestDocumentsResolution].Resolution.DpiX)) { bestDocumentsResolution = result.Count - 1; } if (bestPhotosResolution == -1 || Math.Abs(ScanResolution.PhotosResolution - newRes.Resolution.DpiX) < Math.Abs(ScanResolution.PhotosResolution - result[bestPhotosResolution].Resolution.DpiX)) { bestPhotosResolution = result.Count - 1; } } if (lastValue <= currentValue) { currentValue += 1; } else { currentValue = config.ActualResolution.DpiX + 1; } } if (result.Count == 0) { //log.Error("Generating resolutions for {@Config} failed.", config); throw new ApplicationException("Unable to generate any resolutions for given scanner."); } // determine the final properties if (bestDocumentsResolution == bestPhotosResolution) { result[bestDocumentsResolution] = new ScanResolution(result[bestDocumentsResolution].Resolution.DpiX, ResolutionAnnotation.Default); } else { result[bestDocumentsResolution] = new ScanResolution(result[bestDocumentsResolution].Resolution.DpiX, ResolutionAnnotation.Documents); result[bestPhotosResolution] = new ScanResolution(result[bestPhotosResolution].Resolution.DpiX, ResolutionAnnotation.Photos); } return(result); }
private static void ConfigureScanner( ImageScanner scanner, ImageScannerScanSource source, Double hScanPercent, Double vScanPercent) { if (scanner == null) { throw new ArgumentNullException("scanner"); } IImageScannerSourceConfiguration sourceConfig = null; IImageScannerFormatConfiguration formatConfig = null; switch (source) { case ImageScannerScanSource.Flatbed: sourceConfig = scanner.FlatbedConfiguration; formatConfig = scanner.FlatbedConfiguration; break; case ImageScannerScanSource.Feeder: sourceConfig = scanner.FeederConfiguration; formatConfig = scanner.FeederConfiguration; //Additional feeder-specific settings: //scanner.FeederConfiguration.CanScanDuplex //scanner.FeederConfiguration.Duplex //scanner.FeederConfiguration.CanScanAhead //scanner.FeederConfiguration.ScanAhead //scanner.FeederConfiguration.AutoDetectPageSize //scanner.FeederConfiguration.CanAutoDetectPageSize //scanner.FeederConfiguration.PageSize //scanner.FeederConfiguration.PageSizeDimensions //scanner.FeederConfiguration.PageOrientation break; case ImageScannerScanSource.AutoConfigured: formatConfig = scanner.AutoConfiguration; break; } // Potentially update the scanner configuration if (sourceConfig != null) { var maxScanArea = sourceConfig.MaxScanArea; // Size, with Width, Height in Inches // MinScanArea sourceConfig.SelectedScanRegion = new Rect( 0, 0, maxScanArea.Width * hScanPercent, maxScanArea.Height * vScanPercent); // In inches // Additional Configuration settings // sourceConfig.AutoCroppingMode // sourceConfig.ColorMode == // DefaultColorMode // sourceConfig.Brightness // DefaultBrightness //MaxBrightness // MinBrightness // sourceConfig.Contrast // DefaultContrast // MaxContrast // MinContrast // sourceConfig.DesiredResolution = resolution; // MaxResolution // MinResolution // var actualResolution = sourceConfig.ActualResolution; } // Potentially update the format that the end product is saved to if (formatConfig != null) { Debug.WriteLine("Default format is {0}", formatConfig.DefaultFormat); // NOTE: If your desired format isn't natively supported, it may // be possible to generate the desired format post-process // using image conversion, etc. libraries. var desiredFormats = new[] { ImageScannerFormat.Png, ImageScannerFormat.Jpeg, ImageScannerFormat.DeviceIndependentBitmap, //ImageScannerFormat.Tiff, //ImageScannerFormat.Xps, //ImageScannerFormat.OpenXps, //ImageScannerFormat.Pdf }; foreach (var format in desiredFormats) { if (formatConfig.IsFormatSupported(format)) { formatConfig.Format = format; break; } } Debug.WriteLine("Configured format is {0}", formatConfig.Format); } }