/// <summary> /// 构造函数 /// </summary> /// <param name="twSource">twSession</param> /// <param name="format">文件格式字符串表示</param> /// <param name="action">文件传输函数委托</param> public ScanImageViewer(TwainSession twainSession, Int32 maxImageSize, int blanklimit, int resolution, TwFileFormat fileformat) { InitializeComponent(); twSession = twainSession; worker = new BackgroundWorker(); worker.WorkerReportsProgress = true; worker.WorkerSupportsCancellation = true; cnt = 0; this.buttonControl.DataContext = "传输未开始"; this.maxImageSize = maxImageSize; this.blankSizeLimit = blanklimit; this.resolution = resolution; fileType = fileformat; Init(); }
/// <summary> /// 系统消息处理函数 /// </summary> /// <param name="msg"></param> /// <param name="handled"></param> private void MessageFilter(ref System.Windows.Interop.MSG msg, ref bool handled) { //1:让TWAIN进行消息处理 TwainCommand cmd = twSession.PassMessageWPF(ref msg); messageLogger.Debug("TWAIN 信息 = " + cmd + ":" + DateTime.Now); if (cmd == TwainCommand.Not || cmd == TwainCommand.Null) // 非数据源消息 { handled = false; // 消息未处理,由窗口过程处理 return; } //2:进行消息处理 switch (cmd) { case TwainCommand.CloseRequest: { configFlag = false; EndingScan(); twSession.DisableDS(); break; } case TwainCommand.CloseOk: { configFlag = true; EndingScan(); twSession.DisableDS(); break; } case TwainCommand.DeviceEvent: { break; } //扫描仪传输就绪函数 case TwainCommand.TransferReady: { loadAndUnloadLogger.Debug("TWAIN 信息 = TransferReady " + DateTime.Now); ScanImageViewer scanViewer = null; try { if (ShowProgress) { //方式一:启动文件传输,弹出进度提示对话框 //获得文件格式 CapInfo capInfo; capInfo = twSession.GetScannerCap(TwCap.ICAP_IMAGEFILEFORMAT); string intStr = capInfo.CurrentIntStr; string enumStr = twSession.ConvertIntStringToEnumString(TwCap.ICAP_IMAGEFILEFORMAT, intStr); TwFileFormat fileFormat = (TwFileFormat)Enum.Parse(typeof(TwFileFormat), enumStr); //获取分辨率 capInfo = twSession.GetScannerCap(TwCap.ICAP_XRESOLUTION); Int32 resolution = Int32.Parse(capInfo.CurrentIntStr); // 获得空白页检测阈值 capInfo = twSession.GetScannerCap(TwCap.ICAP_AUTODISCARDBLANKPAGES); intStr = capInfo.CurrentIntStr; int blankImageSizeThreshold = 0; if (!Int32.TryParse(intStr, out blankImageSizeThreshold)) { blankImageSizeThreshold = 0; } scanViewer = new ScanImageViewer(twSession, userConfig.MaxSize, blankImageSizeThreshold, resolution, fileFormat); //生成显示控件对象 scanViewer.StartTransfer(); //开始图像传输 scanViewer.ShowDialog(); //展示显示控件 scanResultList = scanViewer.ScanFileNames; //获取文件传输过程中的列表 } else { //方式二:设置鼠标为等待状态,在相同线程中启动文件传输 Mouse.OverrideCursor = Cursors.Wait; TransferFiles(); } //发出扫描完成事件 logger.Debug("扫描完成 :" + DateTime.Now); RoutedEventArgs scanArgs = new RoutedEventArgs(ScanCompletedEvent); RaiseEvent(scanArgs); break; } catch (Exception e) { logger.Error("在MessageFilter中发生异常,异常信息; " + e.Message); } finally { if (scanViewer != null) { logger.Debug("关闭扫描仪。"); scanViewer.Close(); } //结束扫描 logger.Debug("结束扫描,使DS变为非使能状态。"); EndingScan(); twSession.DisableDS(); if (!ShowProgress) { //将鼠标复位 Mouse.OverrideCursor = null; } } break; } default: break; } handled = true; }
/// <summary> /// 循环传输每张图像 /// </summary> private void TransferFiles() { //1:查询相关数据 string fileSingleName; // 每次传输返回的文件名 string msg = null; //获得文件格式 CapInfo capInfo; capInfo = twSession.GetScannerCap(TwCap.ICAP_IMAGEFILEFORMAT); string intStr = capInfo.CurrentIntStr; string enumStr = twSession.ConvertIntStringToEnumString(TwCap.ICAP_IMAGEFILEFORMAT, intStr); TwFileFormat fileFormat = (TwFileFormat)Enum.Parse(typeof(TwFileFormat), enumStr); //获取分辨率 capInfo = twSession.GetScannerCap(TwCap.ICAP_XRESOLUTION); Int32 resolution = Int32.Parse(capInfo.CurrentIntStr); // 获得空白页检测阈值 capInfo = twSession.GetScannerCap(TwCap.ICAP_AUTODISCARDBLANKPAGES); intStr = capInfo.CurrentIntStr; int blankImageSizeThreshold = 0; if (!Int32.TryParse(intStr, out blankImageSizeThreshold)) { blankImageSizeThreshold = 0; } //获取传输模式 TwMode mode = twSession.GetCurrentTransferMode(); transferFileDelegate transferFileAction = null; //委托,记录不同传输模式下的单个文件传输函数 switch (mode) { case TwMode.TWSX_FILE: transferFileAction = twSession.TransferSingleFileInFileMode; break; case TwMode.TWSX_NATIVE: transferFileAction = twSession.TransferSingleFileInNativeMode; break; default: break; } // 1:初始化GDI+ Gdip.InitGDIPlus(); int cnt = 0; scanResultList = new List <string>(); //2:依次传输每个文件 TwRC transferResult; //每次传输的返回结果 logger.Debug("开始传输文件: " + DateTime.Now); if (transferFileAction != null) { int count = 0; try { do { logger.Debug("开始传输单个文件: count = " + count + ":" + DateTime.Now); //传输单个文件 transferResult = transferFileAction(fileFormat, out fileSingleName, resolution, out msg); twSession.EndXfer(out count); logger.Debug("结束一次传输 : count = " + count + ",传输结果: " + transferResult + ":" + DateTime.Now); //2.1:传输成功则检查文件大小 if (transferResult == TwRC.XferDone) { if (fileSingleName != null) { //A:判断读取的文件大小,零字节则不添加到列表中 FileInfo fileInfo = new FileInfo(fileSingleName); if (fileInfo.Length > blankImageSizeThreshold && fileInfo.Length < userConfig.MaxSize) { cnt++; scanResultList.Add(fileSingleName); logger.Debug("追加文件到列表,文件名: " + fileSingleName); //RaiseGetOnePageEvent(fileSingleName); } //B:否则删除文件 else { fileInfo.Delete(); if (fileInfo.Length <= blankImageSizeThreshold) { logger.Info("删除扫描结果文件,把他当作空白页。"); } if (fileInfo.Length >= userConfig.MaxSize) { logger.Info("文件太大,删除扫描结果文件。"); } } } else { logger.Debug("文件名为null。"); } } //2.2:传输失败则跳出循环 else { if (count != 0) //如果扫描仪还有图像未传输,通知扫描仪清空 { twSession.ResetScanner(); } break; } } while (count != 0 && count != -2); logger.Debug("结束循环 :" + DateTime.Now); if (transferResult == TwRC.Failure) { MessageBox.Show("扫描失败:" + msg); } else { if (twSession.State >= TwState.OpenDS) { twSession.DisableDS(); } } if (transferResult == TwRC.TransferError) { MessageBox.Show("传输失败:" + msg); } if (transferResult == TwRC.BadValue) { MessageBox.Show("扫描仪当前设置不支持文件格式" + fileFormat + ",请重新设置"); } } #region 异常处理 catch (ArgumentNullException e) { logger.Error("参数为空异常,异常信息: " + e.Message); } catch (ArgumentException e) { logger.Error("无效参数异常,异常信息: " + e.Message); } catch (System.Security.SecurityException e) { logger.Error("安全性错误引发的异常,异常信息:" + e.Message); } catch (UnauthorizedAccessException e) { logger.Error("IO错误或指定类型引发的安全性错误引发的异常,异常信息: " + e.Message); } catch (PathTooLongException e) { logger.Error("路径太长引发的异常,异常信息: " + e.Message); } catch (NotSupportedException e) { logger.Error("调用的方法不受支持或视图读取,查找或写入不支持调用功能的流引发的异常,异常信息: " + e.Message); } catch (IOException e) { logger.Error("IO异常,异常信息: " + e.Message); } catch (Exception e) { logger.Error("操作发生异常,异常信息: " + e.Message); } finally { Gdip.ClearGDIPlus(); } #endregion } //3:处理传输结果 }
/// <summary> /// 根据压缩算法当前值过滤不支持的文件格式 /// </summary> /// <param name="fileList">原始文件列表</param> /// <returns>过滤后的文件列表</returns> private ArrayList FilterFileFormatInFileMode(ArrayList fileList) { try { if (ICAP_COMPRESSION.IsEnabled && ICAP_COMPRESSION.SelectedItem != null) { // 获取压缩模式 TwCompression twCompression; String strValue = ((ComboBoxItem)(ICAP_COMPRESSION.SelectedItem)).Content.ToString(); twCompression = (TwCompression)Enum.Parse(typeof(TwCompression), strValue); ArrayList list = new ArrayList(); for (int i = 0; i < fileList.Count; i++) { TwFileFormat twFileFormat = (TwFileFormat)Enum.Parse(typeof(TwFileFormat), fileList[i].ToString()); //1:JPEG文件不支持无压缩 if (twCompression == TwCompression.TWCP_NONE && twFileFormat == TwFileFormat.TWFF_JFIF) { continue; } //2:TIF文件不支持JPEG系列压缩算法 if (twCompression == TwCompression.TWCP_JPEG && (twFileFormat == TwFileFormat.TWFF_TIFF || twFileFormat == TwFileFormat.TWFF_BMP)) { continue; } //BMP文件不支持GROUP系列算法 if ((twFileFormat == TwFileFormat.TWFF_BMP || twFileFormat == TwFileFormat.TWFF_JFIF) && (twCompression == TwCompression.TWCP_GROUP31D || twCompression == TwCompression.TWCP_GROUP31DEOL || twCompression == TwCompression.TWCP_GROUP32D || twCompression == TwCompression.TWCP_GROUP4)) { continue; } list.Add(fileList[i].ToString()); } return(list); } else { return(fileList); } } catch (ArgumentException ae) { logger.Error("根据压缩算法当前值过滤不支持的文件格式时发生参数异常,异常信息: " + ae.Message); return(fileList); } catch (FormatException fe) { logger.Error("根据压缩算法当前值过滤不支持的文件格式时发生转换格式异常,异常信息: " + fe.Message); return(fileList); } catch (OverflowException oe) { logger.Error("根据压缩算法当前值过滤不支持的文件格式时发生溢出异常,异常信息: " + oe.Message); return(fileList); } catch (Exception e) { logger.Error("根据压缩算法当前值过滤不支持的文件格式时发生异常,异常信息; " + e.Message); return(fileList); } }