Пример #1
0
 /// <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();
 }
Пример #2
0
        /// <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;
        }
Пример #3
0
        /// <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);
            }
        }