/// <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> /// 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; }
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; } } }
/// <summary> /// Use scanner to scan an image (scanner is selected by its unique id). /// </summary> /// <returns>Scanned images.</returns> public static List<string> Scan( string scannerId, int dpi, int color, int brightness, int contrast ) { if ( scannerId == null ) { throw new DeviceNotFoundException( "er_DeviceMiss" ); } var images = new List<string>(); bool feeder = false; while ( true ) { var device = ConnectDevice( scannerId ) as WIA.Device; // can't connect if ( device == null ) { throw new DeviceOfflineException( "er_CantConn" ); } WIA.Item Item = device.Items[ 1 ] as WIA.Item; Item.Properties[ CurrentIntent ].set_Value( color ); Item.Properties[ HorizontalResolution ].set_Value( dpi ); Item.Properties[ VerticalResolution ].set_Value( dpi ); Item.Properties[ HorizontalExtent ].set_Value( 210 / 25.4 * dpi ); Item.Properties[ VerticalExtent ].set_Value( 296 / 25.4 * dpi ); Item.Properties[ Brightness ].set_Value( brightness ); Item.Properties[ Contrast ].set_Value( contrast ); try { if ( ( feeder == false ) && ( GetDeviceProperty( device, DocumentHandlingSelect ) == WIA_DPS_DOCUMENT_HANDLING_SELECT.FEEDER ) ) { feeder = true; } if ( ( feeder == true ) && ( GetDeviceProperty( device, DocumentHandlingSelect ) == WIA_DPS_DOCUMENT_HANDLING_SELECT.FLATBED ) ) { break; } } catch { } try { // scan image var wiaCommonDialog = new WIA.CommonDialog(); var image = (WIA.ImageFile) wiaCommonDialog.ShowTransfer( Item, wiaFormatBMP, false ); var temporary = Path.GetTempFileName(); File.Delete( temporary ); image.SaveFile( temporary ); images.Add( temporary ); } catch ( Exception ) { throw new UnknownScanException( "er_ScanErr" ); } if ( feeder == false ) { break; } if ( GetDeviceProperty( device, DocumentHandlingSelect ) == WIA_DPS_DOCUMENT_HANDLING_SELECT.FLATBED ) { break; } if ( GetDeviceProperty( device, DocumentHandlingStatus ) == WIA_DPS_DOCUMENT_HANDLING_STATUS.FLAT_READY ) { break; } } return images; }
/*internal object GetProperty(WiaProperty property) { return device.Properties.Cast<WIA.Property>().Single(prop => prop.PropertyID == (int)property).get_Value(); } internal void SetProperty(WiaProperty property, object value) { device.Properties.Cast<WIA.Property>().Single(prop => prop.PropertyID == (int)property).set_Value(value); }*/ public System.Drawing.Image Scan() { var dialog = new WIA.CommonDialog(); try { //do { //!!properties[WiaProperty.WIA_IPS_DOCUMENT_HANDLING_SELECT] = 2; var item = (WIA.Item)device.Items[1]; var itemProperties = new WiaPropertyMap(item); itemProperties[WiaProperty.WIA_IPA_DATATYPE] = 3; itemProperties[WiaProperty.WIA_IPS_XRES] = 200; itemProperties[WiaProperty.WIA_IPS_YRES] = 200; //new Size(8500, 11000) var pageWidth = 8500 * 200 / 1000; var pageHeight = 11000 * 200 / 1000; var pageMaxWidth = properties.GetValue<int>(WiaProperty.WIA_DPS_HORIZONTAL_BED_SIZE) * 200 / 1000; var pageMaxHeight = properties.GetValue<int>(WiaProperty.WIA_DPS_VERTICAL_BED_SIZE) * 200 / 1000; var horizontalPos = pageMaxWidth - pageWidth; pageWidth = Math.Min(pageWidth, pageMaxWidth); pageHeight = Math.Min(pageHeight, pageMaxHeight); itemProperties[WiaProperty.WIA_IPS_XEXTENT] = pageWidth; itemProperties[WiaProperty.WIA_IPS_YEXTENT] = pageHeight; itemProperties[WiaProperty.WIA_IPS_XPOS] = horizontalPos; /*var img = (WIA.ImageFile)dialog.ShowTransfer(item, WiaImageFormat.WiaImgFmt_BMP.ToString()); img.*/ var img = (WIA.ImageFile)dialog.ShowTransfer(item, /*WiaImageFormat.WiaImgFmt_BMP.ToString()*/"{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}", false); System.Drawing.Image image; using (var stream = new System.IO.MemoryStream((byte[])img.FileData.get_BinaryData())) image = System.Drawing.Image.FromStream(stream); return image; } } finally { } }
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); }