internal override Bitmap TakePicture() { Bitmap result = null; // take a picture WIA.Device device = m_deviceInfo.Connect(); WIA.Item item = device.ExecuteCommand(WIA.CommandID.wiaCommandTakePicture); foreach (string format in item.Formats) { // transfer WIA.ImageFile imageFile = item.Transfer(format) as WIA.ImageFile; // save string tempFile = System.IO.Path.GetTempFileName(); File.Delete(tempFile); imageFile.SaveFile(tempFile); // delete from cam DeleteItem(device.Items, item.ItemID); // return image MemoryStream ms = new MemoryStream(File.ReadAllBytes(tempFile)); File.Delete(tempFile); result = (Bitmap)Bitmap.FromStream(ms); break; } return(result); }
private void Scan(object sender, RoutedEventArgs e) { try { AppBarButton button = sender as AppBarButton; // hmmm, reusing the device doesn't work because it somehow resets itself to capture higher resolution images. bool hasDevice = false; // device != null; GetScannerAsync(new Action(() => { WIA.ImageFile imageFile = null; if (!hasDevice) { imageFile = globalDialog.ShowAcquireImage(DeviceType: WIA.WiaDeviceType.ScannerDeviceType, Bias: WIA.WiaImageBias.MinimizeSize, Intent: WIA.WiaImageIntent.TextIntent, AlwaysSelectDevice: false); } else { WIA.Item scannerItem = device.Items[1]; const string wiaFormatPNG = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}"; object scanResult = globalDialog.ShowTransfer(scannerItem, wiaFormatPNG, false); imageFile = (WIA.ImageFile)scanResult; } if (imageFile != null) { string temp = System.IO.Path.GetTempFileName(); if (File.Exists(temp)) { File.Delete(temp); } imageFile.SaveFile(temp); TempFilesManager.AddTempFile(temp); AttachmentDialogImageItem image = new AttachmentDialogImageItem(temp); AddItem(image); LayoutContent(); SelectItem(image); AutoCrop(image); } })); } catch (Exception ex) { device = null; string message = GetWiaErrorMessage(ex); MessageBox.Show(this, message, "Scan Error", MessageBoxButton.OK, MessageBoxImage.Error); } }
public ScanResult Scan(Control owner, string fileName) { ScanResult result; WIA.CommonDialogClass cdc = new WIA.CommonDialogClass(); WIA.ImageFile imageFile = null; try { imageFile = cdc.ShowAcquireImage(WIA.WiaDeviceType.UnspecifiedDeviceType, WIA.WiaImageIntent.UnspecifiedIntent, WIA.WiaImageBias.MaximizeQuality, "{00000000-0000-0000-0000-000000000000}", true, true, false); Marshal.ReleaseComObject(cdc); cdc = null; } catch (System.Runtime.InteropServices.COMException) { result = ScanResult.DeviceBusy; imageFile = null; } if (imageFile != null) { imageFile.SaveFile(fileName); result = ScanResult.Success; } else { result = ScanResult.UserCancelled; } return(result); }
/// <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; } } }
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); }
private void Button1_Click(object sender, EventArgs e) { try { // parametros de scanner int resolucion = 150; int anchoImagen = 1200; int altoImagen = 1500; int modoColor = 1; // la mas importante bool HayMasPaginas = true; // tiene mas paginas :) // ruta principal donde se guardan los archivos string rutaBase = string.Format("{0}\\{1}", Application.StartupPath, DateTime.Now.ToString("yyyMMddhhmmss")); Directory.CreateDirectory(rutaBase); // elegir escanner WIA.CommonDialog dialogoSeleccionaEscanner = new WIA.CommonDialog(); WIA.Device escaner = dialogoSeleccionaEscanner.ShowSelectDevice(WIA.WiaDeviceType.ScannerDeviceType, true, false); if (escaner != null) { idEscaner = escaner.DeviceID; } else { MessageBox.Show("No se eligió Escaner"); return; } int x = 0; int numeroPaginas = 0; while (HayMasPaginas) { // mientras la bandera de mas paginas este activa // conectar escaner // mostrando avance de escaneo WIA.CommonDialog dialogoEscaneo = new WIA.CommonDialogClass(); WIA.DeviceManager manager = new WIA.DeviceManagerClass(); WIA.Device dispoWIA = null; // cargando el dispositivo foreach (WIA.DeviceInfo scannerInfo in manager.DeviceInfos) { if (scannerInfo.DeviceID == idEscaner) { WIA.Properties infoprop = null; infoprop = scannerInfo.Properties; dispoWIA = scannerInfo.Connect(); break; } } // inicia escaneo WIA.ImageFile imgEscaneo = null; WIA.Item escanerItem = dispoWIA.Items[1] as WIA.Item; AdjustScannerSettings(escanerItem, resolucion, 0, 0, anchoImagen, altoImagen, 0, 0, modoColor); // tomando la imagen imgEscaneo = (WIA.ImageFile)dialogoEscaneo.ShowTransfer(escanerItem, WIA.FormatID.wiaFormatPNG, false); string RutaNombreEscaneo = String.Format("{0}\\{1}.png", rutaBase, x.ToString()); if (File.Exists(RutaNombreEscaneo)) { //file exists, delete it File.Delete(RutaNombreEscaneo); } imgEscaneo.SaveFile(RutaNombreEscaneo); numeroPaginas++; x++; imgEscaneo = null; // preguntar si hay mas documentos pendientes de escaneo if (MessageBox.Show("¿Deseas escanear otro documento?. Antes de seleccionar 'Yes' Por favor introduzca el documento a escanear.", "Escaner", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) { HayMasPaginas = false; } } // una vez escaneado los dosucmentos, se hace un pdf con ellos para despues hacerlo zip // rutaBase es el nombre de la variable de la carpeta MessageBox.Show("Escaneo finalizado. Armando archivo pdf"); string nombreArchivoPdf = string.Format("{0}\\{1}.pdf", rutaBase, DateTime.Now.ToString("yyyMMddhhmmss")); Document pdfDoc = new Document(PageSize.LETTER, 2, 2, 2, 2); PdfWriter writer = PdfWriter.GetInstance(pdfDoc, new FileStream(nombreArchivoPdf, FileMode.CreateNew)); pdfDoc.Open(); // tomar las imagenes del escaneo for (int i = 0; i < x; i++) { // tomar la imagen string rutaImagen = String.Format("{0}\\{1}.png", rutaBase, i.ToString()); PdfContentByte cb = writer.DirectContent; using (FileStream fsSource = new FileStream(rutaImagen, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) { Image img = Image.GetInstance(fsSource); img.ScaleToFit(pdfDoc.PageSize.Width, pdfDoc.PageSize.Height); pdfDoc.Add(img); } } pdfDoc.Close(); MessageBox.Show("Archivo pdf generado. Generando archivo zip"); // comprimir FileInfo pdfFileInfo = new FileInfo(nombreArchivoPdf); string nombreArchivoZip = string.Format("{0}\\{1}.zip", rutaBase, DateTime.Now.ToString("yyyMMddhhmmss")); ZipOutputStream zipStream = new ZipOutputStream(File.Create(nombreArchivoZip)); zipStream.SetLevel(6); // abrir el archivo para escribirlo FileStream pdfFile = File.OpenRead(nombreArchivoPdf); byte[] buffer = new byte[pdfFile.Length]; pdfFile.Read(buffer, 0, buffer.Length); // agregando el archivo a la carpeta comprimida ZipEntry entry = new ZipEntry(Path.GetFileName(nombreArchivoPdf)) { DateTime = pdfFileInfo.LastWriteTime, Size = pdfFile.Length }; pdfFile.Close(); Crc32 objCrc32 = new Crc32(); objCrc32.Reset(); objCrc32.Update(buffer); entry.Crc = objCrc32.Value; zipStream.PutNextEntry(entry); zipStream.Write(buffer, 0, buffer.Length); zipStream.Finish(); zipStream.Close(); MessageBox.Show("Archivo zip generado. Enviando archivo por FTP"); // enviar el documento en ftp MessageBox.Show("proceso completo."); } catch (Exception ex) { // cachando errores com if (ex is COMException) { // Convert the error code to UINT uint errorCode = (uint)((COMException)ex).ErrorCode; // See the error codes if (errorCode == 0x80210006) { MessageBox.Show("The scanner is busy or isn't ready"); } else if (errorCode == 0x80210064) { MessageBox.Show("The scanning process has been cancelled."); } else if (errorCode == 0x8021000C) { MessageBox.Show("There is an incorrect setting on the WIA device."); } else if (errorCode == 0x80210005) { MessageBox.Show("The device is offline. Make sure the device is powered on and connected to the PC."); } else if (errorCode == 0x80210001) { MessageBox.Show("An unknown error has occurred with the WIA device."); } } else { MessageBox.Show("Error " + ex.Message); } } }