Esempio n. 1
0
        public List <Image> Scan(SettingsAcquire settings)
        {
            Log("Scan start");
            _images = new List <Image>();
            _scanCompleteEvent.Reset();

            var scanSettings = new ScanSettings
            {
                Resolution = new ResolutionSettings {
                    Dpi           = (int)settings.Resolution,
                    ColourSetting = (ColourSetting)settings.PixelType
                },
                Area = new AreaSettings(Units.Inches, 0, 0, settings.Format.Height, settings.Format.Width),
                ShowProgressIndicatorUI = false,
                ShowTwainUI             = false,
                UseDocumentFeeder       = settings.ScanSource.HasValue &&
                                          ((ScanFeed)settings.ScanSource.Value == ScanFeed.Feeder || (ScanFeed)settings.ScanSource.Value == ScanFeed.Duplex),
                UseAutoFeeder    = false,
                UseAutoScanCache = false,
                UseDuplex        = settings.ScanSource.HasValue && (ScanFeed)settings.ScanSource.Value == ScanFeed.Duplex,
            };

            var scan = new StartScan(StartTwainScan);

            _windowsMessageLoop.Invoke(scan, new object[] { scanSettings });

            _scanCompleteEvent.WaitOne();
            Log("Scan complete, images count: " + _images.Count);
            return(_images);
        }
Esempio n. 2
0
        private void SetAcquireSettings(Device device, SettingsAcquire settings)
        {
            Log("Set acquire settings");

            var source = device.Items[1];

            if (source == null)
            {
                throw new Exception("Current sourse not found");
            }

            SetProperty(source.Properties, WiaProperty.HorizontalResolution, (int)settings.Resolution);
            SetProperty(source.Properties, WiaProperty.VerticalResolution, (int)settings.Resolution);

            var horizontalExtent = (int)(settings.Format.Width * settings.Resolution);
            var verticalExtent   = (int)(settings.Format.Height * settings.Resolution);

            var horizontalExtentMax = FindProperty(source.Properties, WiaProperty.HorizontalExtent).SubTypeMax;
            var verticalExtentMax   = FindProperty(source.Properties, WiaProperty.VerticalExtent).SubTypeMax;

            var currentIntent = (WiaPixelType)settings.PixelType;

            SetProperty(source.Properties, WiaProperty.HorizontalExtent, horizontalExtent < horizontalExtentMax ? horizontalExtent : horizontalExtentMax);
            SetProperty(source.Properties, WiaProperty.VerticalExtent, verticalExtent < verticalExtentMax ? verticalExtent : verticalExtentMax);
            SetProperty(source.Properties, WiaProperty.CurrentIntent, currentIntent);

            if (currentIntent == WiaPixelType.Color)
            {
                try
                {
                    SetProperty(source.Properties, WiaProperty.BitsPerPixel, 24);
                }
                catch (Exception)
                {
                }
            }

            if (settings.ScanSource.HasValue && IsDocumentHandlingSelectSupported(device))
            {
                var documentHandlingSelect = (int)WIA_DPS_DOCUMENT_HANDLING_SELECT.Flatbad;
                switch ((ScanFeed)settings.ScanSource.Value)
                {
                case ScanFeed.Feeder:
                    documentHandlingSelect = (int)WIA_DPS_DOCUMENT_HANDLING_SELECT.Feeder;
                    break;

                case ScanFeed.Flatbad:
                    documentHandlingSelect = (int)WIA_DPS_DOCUMENT_HANDLING_SELECT.Flatbad;
                    break;

                case ScanFeed.Duplex:
                    documentHandlingSelect = (int)WIA_DPS_DOCUMENT_HANDLING_SELECT.Duplex | (int)WIA_DPS_DOCUMENT_HANDLING_SELECT.Feeder;
                    break;
                }
                SetProperty(device.Properties, WiaProperty.DocumentHandlingSelect, documentHandlingSelect);
            }

            Log("Set acquire settings success");
        }
Esempio n. 3
0
        /// <summary>
        /// Use scanner to scan an image (with user selecting the scanner from a dialog).
        /// </summary>
        /// <returns>Scanned images.</returns>
        public List <Image> Scan(SettingsAcquire settings)
        {
            if (_deviceId == null)
            {
                throw new Exception("Не выбран источник данных для сканера.");
            }

            var device = ConnectToDevice();

            SetAcquireSettings(device, settings);

            return(Scan(device));
        }
Esempio n. 4
0
        public ScanResult Execute(object markerAsynchrone)
        {
            _log.Info("======================================= SCAN COMMAND ========================================");
            _log.Info(string.Format("Start execute with scan params: " +
                                    "source={0}, sourceFeed={1}, dpi={2}, colorMode={3}, compressionFormat={4}, format={5}, " +
                                    "isPackage={6}, saveAs={7}, CurrentSourceIndex={8}, Index={9}",
                                    _command.Source,
                                    _command.DocumentHandlingCap,
                                    _command.DPI,
                                    _command.ColorMode,
                                    _command.CompressionFormat.ImgFormat,
                                    _command.Format.Name,
                                    _command.IsPackage,
                                    _command.SaveAs,
                                    _scannerManager.CurrentSourceIndex,
                                    _scannerManager.CurrentSource.Index
                                    ));

            ScanResult scanResult;

            try
            {
                var scannedImages = new List <Image>();
                lock (markerAsynchrone)
                {
                    if (_scannerManager.CurrentSourceIndex != _command.Source)
                    {
                        new AsyncWorker <int>().RunWorkAsync(_command.Source, _scannerManager.ChangeSource,
                                                             WaitTimeForChangeSource);

                        if (_scannerManager.CurrentSourceIndex != _command.Source)
                        {
                            return(new SingleScanResult("Не удается изменить источник данных"));
                        }
                    }

                    var settingAcquire = new SettingsAcquire
                    {
                        Format     = _command.Format,
                        Resolution = _command.DPI,
                        PixelType  = _command.ColorMode,
                        ScanSource = _command.DocumentHandlingCap
                    };

                    //создаем отдельный поток и передаем в него метод сканирования(callback) и параметры для него
                    var images = new AsyncWorker <SettingsAcquire, List <Image> >().RunWorkAsync(settingAcquire, _scannerManager.CurrentSource.Scan, WaitTimaeForScan);

                    if (images != null)
                    {
                        foreach (var image in images)
                        {
                            var clonedImage = (Image)image.Clone();
                            image.Dispose();

                            ((Bitmap)clonedImage).SetResolution(_command.DPI, _command.DPI);
                            scannedImages.Add(clonedImage);
                        }
                    }
                }
                if (scannedImages.Count == 0)
                {
                    return(new SingleScanResult(
                               "Сканирование завершилось неудачей! Попробуйте переподключить сканер либо повторить сканирование с помощью другого устройства."));
                }

                if (scannedImages.Count == 1)
                {
                    var image            = scannedImages[0];
                    var downloadFile     = SaveImage(image);
                    var singleScanResult = new SingleScanResult();
                    singleScanResult.FillContent(downloadFile);

                    scanResult = singleScanResult;

                    image.Dispose();
                }
                else
                {
                    var downloadFiles = new List <DownloadFile>();
                    int counter;
                    try
                    {
                        counter = int.Parse(_command.FileCounter);
                    }
                    catch (Exception)
                    {
                        counter = 1;
                    }
                    foreach (var scannedImage in scannedImages)
                    {
                        var downloadFile = SaveImage(scannedImage, counter++);
                        downloadFiles.Add(downloadFile);
                        scannedImage.Dispose();
                    }

                    var multipleScanResult = new MultipleScanResult();
                    multipleScanResult.FillContent(downloadFiles);
                    scanResult = multipleScanResult;
                }
            }
            catch (TwainException ex)
            {
                return(new SingleScanResult(ex.Message));
            }

            _log.Info("Scan command executed");
            return(scanResult);
        }