/// <summary> /// Use scanner to scan an image (scanner is selected by its unique id). /// </summary> /// <param name="scannerName"></param> /// <returns>Scanned images.</returns> public static List <Image> Scan(string scannerId) { List <Image> images = new List <Image>(); bool hasMorePages = true; while (hasMorePages) { // select the correct scanner using the provided scannerId parameter WIA.DeviceManager manager = new WIA.DeviceManager(); WIA.Device device = null; foreach (WIA.DeviceInfo info in manager.DeviceInfos) { if (info.DeviceID == scannerId) { // connect to scanner device = info.Connect(); break; } } // device was not found if (device == null) { // enumerate available devices string availableDevices = ""; foreach (WIA.DeviceInfo info in manager.DeviceInfos) { availableDevices += info.DeviceID + "\n"; } // show error with available devices throw new Exception("The device with provided ID could not be found. Available Devices:\n" + availableDevices); } WIA.Item item = device.Items[1] as WIA.Item; try { // scan image WIA.ICommonDialog wiaCommonDialog = new WIA.CommonDialog(); WIA.ImageFile image = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatBMP, false); // save to temp file string fileName = Path.GetTempFileName(); File.Delete(fileName); image.SaveFile(fileName); image = null; // add file to output list images.Add(Image.FromFile(fileName)); } catch (Exception exc) { throw exc; } finally { item = null; //determine if there are any more pages waiting WIA.Property documentHandlingSelect = null; WIA.Property documentHandlingStatus = null; foreach (WIA.Property prop in device.Properties) { if (prop.PropertyID == WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_SELECT) { documentHandlingSelect = prop; } if (prop.PropertyID == WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_STATUS) { documentHandlingStatus = prop; } } // assume there are no more pages hasMorePages = false; // may not exist on flatbed scanner but required for feeder if (documentHandlingSelect != null) { // check for document feeder if ((Convert.ToUInt32(documentHandlingSelect.get_Value()) & WIA_DPS_DOCUMENT_HANDLING_SELECT.FEEDER) != 0) { hasMorePages = ((Convert.ToUInt32(documentHandlingStatus.get_Value()) & WIA_DPS_DOCUMENT_HANDLING_STATUS.FEED_READY) != 0); } } } } return(images); }
/// <summary> /// Start scan /// </summary> public void ScanAsync(ScannerInfo source) { if (source == null) { return; } WIA.Device wiaDevice = source.GetDevice(); // Manager WIA.DeviceManager wiaManager = new WIA.DeviceManager(); bool hasMorePages = true; while (hasMorePages) { try { // Get items WIA.Item wiaItem = wiaDevice.Items[1]; int inColor = 1; int dpi = 300; wiaItem.Properties["6146"].set_Value((int)inColor);//Item MUST be stored in a variable THEN the properties must be set. wiaItem.Properties["6147"].set_Value(dpi); wiaItem.Properties["6148"].set_Value(dpi); //var imageFile = (ImageFile)(new CommonDialog()).ShowTransfer(wiaItem, "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}", false); //wiaItem.Transfer("{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}") as WIA.ImageFile; //var imageFile = wiaItem.Transfer("{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}") as WIA.ImageFile; var imageFile = wiaItem.Transfer("{b96b3cab-0728-11d3-9d7b-0000f81ef32e}") as WIA.ImageFile; if (this.ScanCompleted != null) { this.ScanCompleted(this, new ScanCompletedEventArgs(imageFile.FileData.get_BinaryData())); } } catch (Exception) { break; } finally { //determine if there are any more pages waiting WIA.Property documentHandlingSelect = null; WIA.Property documentHandlingStatus = null; foreach (WIA.Property prop in wiaDevice.Properties) { if (prop.PropertyID == WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_SELECT) { documentHandlingSelect = prop; } if (prop.PropertyID == WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_STATUS) { documentHandlingStatus = prop; } } hasMorePages = false; //assume there are no more pages if (documentHandlingSelect != null) //may not exist on flatbed scanner but required for feeder { //check for document feeder if ((Convert.ToUInt32(documentHandlingSelect.get_Value()) & WIA_DPS_DOCUMENT_HANDLING_SELECT.FEEDER) != 0) { hasMorePages = ((Convert.ToUInt32(documentHandlingStatus.get_Value()) & WIA_DPS_DOCUMENT_HANDLING_STATUS.FEED_READY) != 0); } } if (hasMorePages && this.SingleOnly) { hasMorePages = false; } } } }
public void Scan(WiaDocumentHandlingType handlingType = WiaDocumentHandlingType.Feeder, WiaDocumentHandlingType?duplexOrOtherMode = null, List <string> imagesFromScanner = null) { if (imagesFromScanner == null) { imagesFromScanner = new List <string>(); } SelectDevice(); if (SelectedDevice == null) { return; } bool hasMorePages = true; // select the correct scanner using the provided scannerId parameter WIA.DeviceManager manager = new WIA.DeviceManager(); WIA.Device device = null; try { if (manager.DeviceInfos == null || manager.DeviceInfos.Count < 1) { throw new WiaScannerDeviceNotFoundException((string)Application.Current.FindResource("NemaDostupnihSkeneraUzvicnik")); } foreach (WIA.DeviceInfo info in manager.DeviceInfos) { if (info.DeviceID == SelectedDevice.DeviceID) { // connect to scanner device = info.Connect(); break; } } if (handlingType == WiaDocumentHandlingType.Feeder) { if (duplexOrOtherMode != null) { SetProperty(device.Properties, (uint)WiaProperty.DocumentHandlingSelect, (uint)(handlingType | duplexOrOtherMode)); } else { SetProperty(device.Properties, (uint)WiaProperty.DocumentHandlingSelect, (uint)handlingType); } } } catch (Exception ex) { device = null; } while (hasMorePages) { // device was not found if (device == null) { throw new WiaScannerDeviceNotFoundException((string)Application.Current.FindResource("OdabraniSkenerNijeDostupanUzvicnik")); } WIA.Item item = device.Items[1] as WIA.Item; try { PreviousPropertyValues.Clear(); foreach (var property in PropertyValues) { WIA.Property prop = GetProperty(item.Properties, property.Key); PreviousPropertyValues.Add(property.Key, prop?.get_Value()); var supported = prop.SubTypeValues; SetProperty(item.Properties, property.Key, property.Value); } // scan image WIA.ICommonDialog wiaCommonDialog = new WIA.CommonDialog(); WIA.ImageFile image = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatBMP, true); WIA.ImageFile duplexImage = null; if (duplexOrOtherMode == WiaDocumentHandlingType.Duplex) { Thread.Sleep(100); duplexImage = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatBMP, true); } // save to temp file string fileName = Path.GetTempFileName(); if (image != null) { File.Delete(fileName); image.SaveFile(fileName); Marshal.FinalReleaseComObject(image); image = null; // add file to output list imagesFromScanner.Add(fileName); } if (duplexImage != null) { string duplexFileName = Path.GetTempFileName(); File.Delete(duplexFileName); duplexImage.SaveFile(duplexFileName); Marshal.FinalReleaseComObject(duplexImage); duplexImage = null; // add file to output list imagesFromScanner.Add(duplexFileName); } item = null; WIA.Property documentHandlingSelect = null; WIA.Property documentHandlingStatus = null; foreach (WIA.Property prop in device.Properties) { if (prop.PropertyID == (uint)WiaProperty.DocumentHandlingSelect) { documentHandlingSelect = prop; } if (prop.PropertyID == (uint)WiaProperty.DocumentHandlingStatus) { documentHandlingStatus = prop; } } hasMorePages = false; if (documentHandlingSelect != null) { var propId = documentHandlingSelect.PropertyID; var propValue = documentHandlingSelect.get_Value(); var propValueBitCheck = (propValue & ((uint)WiaDocumentHandlingType.Feeder)); if (propValueBitCheck != 0) { var statusId = documentHandlingStatus.PropertyID; var statusValue = documentHandlingStatus.get_Value(); var statusValueBitCheck = (statusValue & WIA_DPS_DOCUMENT_HANDLING_STATUS.FEED_READY); hasMorePages = (statusValueBitCheck != 0); } } //Thread.Sleep(500); } catch (WiaScannerDeviceNotFoundException exc) { throw exc; } catch (IOException exc) { throw exc; } catch (COMException exc) { if (imagesFromScanner?.Count() < 1) { if ((uint)exc.ErrorCode == 0x80210003) { throw new WiaScannerInsertPaperException(exc.Message); } else { throw exc; } } else // U slucaju da su pokupljene slike, kad dodje do poruke o poslednjoj skeniranoj prekidamo izvrsavanje { return; } } catch (Exception exc) { throw exc; } } }
public static List <Image> Scan(string scannerName) { List <Image> images = new List <Image>(); bool hasMorePages = true; bool paperEmpty = false; while (hasMorePages) { Dictionary <string, string> devices = WiaScanner.GetDevices(); var scannerId = devices.FirstOrDefault(x => x.Value == scannerName).Key; WIA.DeviceManager manager = new WIA.DeviceManager(); WIA.Device device = null; // select the correct scanner using the provided scannerId parameter foreach (WIA.DeviceInfo info in manager.DeviceInfos) { if (info.DeviceID == scannerId && info.Type == WIA.WiaDeviceType.ScannerDeviceType) { // connect to scanner device = info.Connect(); break; } } // device was not found if (device == null) { // enumerate available devices string availableDevices = ""; foreach (var d in devices) { availableDevices += d.Value + "\n"; } // show error with available devices throw new Exception("The device with provided ID could not be found. Available Devices:\n" + availableDevices); } WIA.Item item = SetPaperSetting(device); try { // scan image WIA.ICommonDialog wiaCommonDialog = new WIA.CommonDialog(); WIA.ImageFile image = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatJPEG, true); //WIA.ImageProcess imp = new WIA.ImageProcess(); // use to compress jpeg. //imp.Filters.Add(imp.FilterInfos["Convert"].FilterID); ////imp.Filters[1].Properties["FormatID"].set_Value(wiaFormatJPEG); //imp.Filters[1].Properties["FormatID"].set_Value(wiaFormatJPEG); //imp.Filters[1].Properties["Quality"].set_Value(80); // 1 = low quality, 100 = best //image = imp.Apply(image); // apply the filters // get a tempfile path string fileName = Path.GetTempFileName(); // delete any existing file first File.Delete(fileName); // save to temp file image.SaveFile(fileName); // make the original (wia) image null image = null; // get system.drawing image from temporary file and add file to output list images.Add(Image.FromFile(fileName, true)); //var imageBytes = (byte[])image.FileData.get_BinaryData(); //var stream = new MemoryStream(imageBytes); //images.Add(Image.FromStream(stream)); } catch (System.Runtime.InteropServices.COMException cx) { string ex = string.Empty; int comErrorCode = GetWIAErrorCode(cx); if (comErrorCode > 0) { ex = GetErrorCodeDescription(comErrorCode); } if (comErrorCode == 3 && images.Count == 0) { throw new Exception(ex); } else if (comErrorCode == 3 && images.Count > 0) { paperEmpty = true; } } finally { item = null; // assume there are no more pages hasMorePages = false; if (!paperEmpty) { //determine if there are any more pages waiting WIA.Property documentHandlingSelect = null; WIA.Property documentHandlingStatus = null; foreach (WIA.Property prop in device.Properties) { if (prop.PropertyID == WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_SELECT) { documentHandlingSelect = prop; } if (prop.PropertyID == WIA_PROPERTIES.WIA_DPS_DOCUMENT_HANDLING_STATUS) { documentHandlingStatus = prop; } } // may not exist on flatbed scanner but required for feeder if (documentHandlingSelect != null) { // check for document feeder if ((Convert.ToUInt32(documentHandlingSelect.get_Value()) & WIA_DPS_DOCUMENT_HANDLING_SELECT.FEEDER) != 0) { hasMorePages = ((Convert.ToUInt32(documentHandlingStatus.get_Value()) & WIA_DPS_DOCUMENT_HANDLING_STATUS.FEED_READY) != 0); } } } } } return(images); }