From 220bd666518d5ab58a33677b7f692e55e34d878a Mon Sep 17 00:00:00 2001 From: liyingcheng712 <1871304538@qq.com> Date: Mon, 16 Nov 2020 18:05:04 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E6=96=B0=E5=A2=9E=E7=AB=8B=E6=80=9D?= =?UTF-8?q?=E8=BE=B0twain=202.=20=E5=A2=9E=E5=8A=A0=E6=8A=98=E8=A7=92?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=203.=20=E5=A2=9E=E5=8A=A0600dpi=204.=20?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=BB=91=E6=A1=86=E5=A1=AB=E5=85=85=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E4=B8=BA=E5=A1=AB=E5=85=85=205.=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=88=87=E6=8D=A2=E7=BA=B8=E5=BC=A0=E5=B0=BA=E5=AF=B8=E6=97=B6?= =?UTF-8?q?=EF=BC=8C=E5=A4=9A=E6=B5=81=E8=BE=93=E5=87=BA=E6=A1=86=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E4=B8=8D=E6=AD=A3=E7=A1=AE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- huagao/CAboutDlg.cpp | 10 + huagao/CBasicPage.cpp | 11 +- huagao/CBasicPage.h | 1 + huagao/CFeedPaperPage.cpp | 1 + huagao/CFeedPaperPage.h | 2 +- huagao/CImageProcPage.cpp | 2 +- huagao/CMakeLists.txt | 2 +- huagao/CTwainUI.cpp | 5 +- huagao/CTwainUI.h | 7 +- huagao/CcardblankDlg.cpp | 55 ++++++ huagao/CcardblankDlg.h | 30 +++ huagao/CdisardblankDlg.cpp | 31 +++ huagao/CdisardblankDlg.h | 23 +++ huagao/Device/GScan.h | 4 + huagao/Device/GScanO200.cpp | 30 ++- huagao/Device/GScanO200.h | 3 + huagao/Device/IConfig.h | 2 +- huagao/Device/ImageMatQueue.cpp | 93 ++++++++- huagao/Device/ImageMatQueue.h | 11 +- huagao/Device/PublicFunc.cpp | 2 + huagao/Device/PublicFunc.h | 3 + huagao/GscanJsonConfig.cpp | 12 +- .../ImageProcess/ImageApplyAdjustColors.cpp | 3 +- huagao/ImageProcess/ImageApplyAutoCrop.cpp | 6 +- huagao/ImageProcess/ImageApplyAutoCrop.h | 4 +- huagao/ImageProcess/ImageApplyBWBinaray.cpp | 3 +- huagao/ImageProcess/ImageApplyChannel.cpp | 3 +- .../ImageProcess/ImageApplyDiscardBlank.cpp | 3 +- .../ImageApplyDogEarDetection.cpp | 67 +++++++ .../ImageProcess/ImageApplyDogEarDetection.h | 56 ++++++ huagao/ImageProcess/ImageApplyHeaders.h | 1 + huagao/Sliders.h | 2 +- huagao/TabPageSSL.cpp | 2 + huagao/TabPageSSL.h | 2 +- huagao/huagaods.cpp | 176 +++++++++++++----- huagao/huagaods.hpp | 4 +- huagao/huagaotwds.rc | Bin 36108 -> 36576 bytes huagao/logo_lanxum_3.bmp | Bin 0 -> 91446 bytes huagao/resource.h | Bin 11170 -> 11804 bytes huagao/stdafx.h | Bin 7692 -> 9664 bytes 40 files changed, 597 insertions(+), 75 deletions(-) create mode 100644 huagao/CcardblankDlg.cpp create mode 100644 huagao/CcardblankDlg.h create mode 100644 huagao/CdisardblankDlg.cpp create mode 100644 huagao/CdisardblankDlg.h create mode 100644 huagao/ImageProcess/ImageApplyDogEarDetection.cpp create mode 100644 huagao/ImageProcess/ImageApplyDogEarDetection.h create mode 100644 huagao/logo_lanxum_3.bmp diff --git a/huagao/CAboutDlg.cpp b/huagao/CAboutDlg.cpp index e202e554..af74672d 100644 --- a/huagao/CAboutDlg.cpp +++ b/huagao/CAboutDlg.cpp @@ -50,8 +50,18 @@ BOOL CAboutDlg::OnInitDialog() SetDlgItemText(IDC_LBDERIVERVERSON, HG_VERSION_INFO); SetDlgItemText(IDC_LBCOMPANY, LIMIT_INFO); + CStatic* pStatic = (CStatic*)GetDlgItem(IDC_PICABOUTHUAGO); +#ifdef MAKEHUAGAO + HBITMAP hBitmap = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BMPABOUTDLG)); +#else defined LANXUM + HBITMAP hBitmap = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP2)); +#endif + pStatic->ModifyStyle(0xF, SS_BITMAP | SS_CENTERIMAGE); + pStatic->SetBitmap(hBitmap); #ifndef MAKEHUAGAO +#ifndef LANXUM GetDlgItem(IDC_PICABOUTHUAGO)->ShowWindow(FALSE); +#endif // !LANXUM #endif SetDlgItemText(IDC_LBDESIGNERVALUE, COMPANY_NAME); SetDlgItemText(IDC_LBCOMPANYADDRESS, COMPANY_ADDRESS); diff --git a/huagao/CBasicPage.cpp b/huagao/CBasicPage.cpp index 7e09b4c3..d3624bd8 100644 --- a/huagao/CBasicPage.cpp +++ b/huagao/CBasicPage.cpp @@ -8,6 +8,7 @@ #include "CAboutDlg.h" #include "CTwainUI.h" #include "CDiscardBlankSetting.h" +#include "CcardblankDlg.h" #include static std::vector color_Modes = { @@ -83,7 +84,8 @@ static std::vector reslutions{ _T("150"), _T("200"), _T("240"), - _T("300") + _T("300"), + _T("600") }; static std::vector duplexs @@ -209,6 +211,10 @@ void CBasicPage::OnCbnSelchangeCmbduplex() //DevnMax = index == 2 ? 200 : 300; m_dataChange(); //} + if (m_cmBoxDuplex->GetCurSel() == 2 || m_cmBoxDuplex->GetCurSel() == 3) + this->GetDlgItem(IDC_BTNDISCARDSETTING)->ShowWindow(SW_SHOW); + else + this->GetDlgItem(IDC_BTNDISCARDSETTING)->ShowWindow(SW_HIDE); updateCmbDuplex(TRUE); } @@ -223,6 +229,9 @@ void CBasicPage::OnClickedBtndiscardsetting() //if (nRet == IDOK) { // dbs.GetParams(AreaNum, DevnMax); //} + CcardblankDlg settingdlg(discardblank_percent); + settingdlg.DoModal(); + discardblank_percent = settingdlg.discardblank_percent; } void CBasicPage::SetScannerInfo(std::string hdVersion, std::string serialNum) diff --git a/huagao/CBasicPage.h b/huagao/CBasicPage.h index 4776ff72..dd12329e 100644 --- a/huagao/CBasicPage.h +++ b/huagao/CBasicPage.h @@ -28,6 +28,7 @@ public: int AreaNum; int DevnMax; BOOL m_bswitchfrontback; + int discardblank_percent; // 对话框数据 #ifdef AFX_DESIGN_TIME diff --git a/huagao/CFeedPaperPage.cpp b/huagao/CFeedPaperPage.cpp index a6c74446..5ab7caec 100644 --- a/huagao/CFeedPaperPage.cpp +++ b/huagao/CFeedPaperPage.cpp @@ -48,6 +48,7 @@ void CFeedPaperPage::DoDataExchange(CDataExchange* pDX) DDX_Control(pDX, IDC_CMBORENTATION, m_cmBoxOrentation); DDX_Control(pDX, IDC_SLDDETECTLEVEL, m_sldSkrewDetecttion); DDX_Control(pDX, IDC_EDSCANNUM, m_editNum); + DDX_Control(pDX, IDC_DogEarDetection, dogear); } BOOL CFeedPaperPage::OnInitDialog() diff --git a/huagao/CFeedPaperPage.h b/huagao/CFeedPaperPage.h index dc910722..4103edcb 100644 --- a/huagao/CFeedPaperPage.h +++ b/huagao/CFeedPaperPage.h @@ -16,7 +16,7 @@ public: void FeedPaperPageUpdate(int val); void FeedAutoDescrewUpdate(int val); void OnInitcmBoxOrentation(int selectIndex); - + CButton dogear; BOOL m_cbDoublePaper; BOOL m_cbStaple; BOOL m_cbRotation; diff --git a/huagao/CImageProcPage.cpp b/huagao/CImageProcPage.cpp index f8940b80..c06f75a2 100644 --- a/huagao/CImageProcPage.cpp +++ b/huagao/CImageProcPage.cpp @@ -58,7 +58,7 @@ void CImageProcPage::ImageProcPageUpdate(int val) { m_temp->SetCurSel(0); m_temp->EnableWindow(FALSE); - t_chMultiOutput->SetCheck(FALSE); + //t_chMultiOutput->SetCheck(TRUE); t_chMultiOutput->EnableWindow(TRUE); } else diff --git a/huagao/CMakeLists.txt b/huagao/CMakeLists.txt index 34772fca..bc04c6d7 100644 --- a/huagao/CMakeLists.txt +++ b/huagao/CMakeLists.txt @@ -105,4 +105,4 @@ set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/redistribute) set(huagaotwain_path "$<$:${LIBRARY_OUTPUT_PATH}\\Debug\\huagaotwain.dll>" "$<$:${LIBRARY_OUTPUT_PATH}\\Release\\huagaotwain.dll>") string(REPLACE "/" "\\" huagaotwain_path ${huagaotwain_path}) -add_custom_command(TARGET huagaotwain POST_BUILD COMMAND copy ${huagaotwain_path} $ENV{windir}\\twain_32\\huagoscan\\huagaotwain.ds) \ No newline at end of file +#add_custom_command(TARGET huagaotwain POST_BUILD COMMAND copy ${huagaotwain_path} $ENV{windir}\\twain_32\\huagoscan\\huagaotwain.ds) \ No newline at end of file diff --git a/huagao/CTwainUI.cpp b/huagao/CTwainUI.cpp index 8cce69a1..7012fc2f 100644 --- a/huagao/CTwainUI.cpp +++ b/huagao/CTwainUI.cpp @@ -171,7 +171,7 @@ void CTwainUI::UpdateUI() m_pageImageProc->m_ckbHSVCorrect = settings->hsvcorrect == TRUE ? TRUE : FALSE;//答题卡除红 m_pageImageProc->GetDlgItem(IDC_CKMULTIOUTPUT)->EnableWindow(settings->pixtype == 2);//彩色可用 m_pageImageProc->UpdateData(FALSE); - + m_pageFeedPaper->dogear.SetCheck(settings->is_dogeardetection); //!< Page feed paper if(settings->is_duplex==TRUE) m_pageFeedPaper->m_cbRotation = settings->is_backrotate180==TRUE ? TRUE : FALSE;//背面旋转180 @@ -420,7 +420,7 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs) settings->is_autodiscradblank_vince = configItem->Duplex == 3; //settings->areanum = configItem->DBlank_AreaNum; //settings->devnmax = configItem->DBlank_DevnMax; - + settings->discardblank_percent = m_pageBasic->discardblank_percent; //填充黑框 settings->fillbackground = configItem->EnFillBlack; settings->autodescrew = configItem->EnAutoDescrew; @@ -433,6 +433,7 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs) settings->is_autotext = configItem->Orentation == 4; settings->is_backrotate180 =configItem->EnBackRotate180; + settings->is_dogeardetection = m_pageFeedPaper->dogear.GetCheck(); settings->hardwarecaps.en_skrewdetect = configItem->EnScrewDetect; settings->hardwarecaps.skrewdetectlevel = (int)configItem->ScrewDetectLevel; settings->hardwarecaps.en_stapledetect = configItem->EnBindingDetect; diff --git a/huagao/CTwainUI.h b/huagao/CTwainUI.h index d7145f9f..742171d6 100644 --- a/huagao/CTwainUI.h +++ b/huagao/CTwainUI.h @@ -15,8 +15,8 @@ class CFeedPaperPage; class CBrightnessPage; /*配置文件默认索引号*/ -#define SUPPORTRESNUMS 5 -static int Resolutions[SUPPORTRESNUMS] = {100,150,200,240,300}; +#define SUPPORTRESNUMS 6 +static int Resolutions[SUPPORTRESNUMS] = {100,150,200,240,300,600}; #define TWPT_BW 0 #define TWPT_GRAY 1 @@ -100,7 +100,8 @@ static std::map resolutions = { {1,150.0f}, {2,200.0f}, {3,240.0f}, - {4,300.0f} + {4,300.0f}, + {5,600.0f} }; static std::map colorModes = { diff --git a/huagao/CcardblankDlg.cpp b/huagao/CcardblankDlg.cpp new file mode 100644 index 00000000..3d2f65cb --- /dev/null +++ b/huagao/CcardblankDlg.cpp @@ -0,0 +1,55 @@ +// CcardblankDlg.cpp: 实现文件 +// + +#include "CcardblankDlg.h" +#include "afxdialogex.h" +#include "resource.h" + + +// CcardblankDlg 对话框 + +IMPLEMENT_DYNAMIC(CcardblankDlg, CTabPageSSL) + +CcardblankDlg::CcardblankDlg(int pos,CWnd* pParent /*=nullptr*/) + : CTabPageSSL(IDD_DISCARDBLANKSETTING, pParent) + , discardblank_percent(pos) +{ + +} + +CcardblankDlg::~CcardblankDlg() +{ +} + +void CcardblankDlg::DoDataExchange(CDataExchange* pDX) +{ + CTabPageSSL::DoDataExchange(pDX); + DDX_Control(pDX, IDC_SLD_DEVNMAX, m_slider_blank); + DDX_Control(pDX, IDC_DBLANK_DEVNMAX, m_edit_blank); +} + +BOOL CcardblankDlg::OnInitDialog() +{ + CTabPageSSL::OnInitDialog(); + m_edit_blank.SetSlideLink(this, IDC_SLD_DEVNMAX); + m_edit_blank.SetParams(1, 100, 10); + m_edit_blank.SetValue(discardblank_percent); + return true; +} + + +BEGIN_MESSAGE_MAP(CcardblankDlg, CTabPageSSL) + ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_SLD_DEVNMAX, &CcardblankDlg::OnNMReleasedcaptureSldDevnmax) +END_MESSAGE_MAP() + + +// CcardblankDlg 消息处理程序 + + +void CcardblankDlg::OnNMReleasedcaptureSldDevnmax(NMHDR* pNMHDR, LRESULT* pResult) +{ + // TODO: 在此添加控件通知处理程序代码 + *pResult = 0; + discardblank_percent = m_slider_blank.m_iPosition; + m_edit_blank.SetValue(discardblank_percent); +} diff --git a/huagao/CcardblankDlg.h b/huagao/CcardblankDlg.h new file mode 100644 index 00000000..ec9266de --- /dev/null +++ b/huagao/CcardblankDlg.h @@ -0,0 +1,30 @@ +#pragma once +#include "TabPageSSL.h" +#include "Sliders.h" +#include "SmartEdit.h" + +// CcardblankDlg 对话框 + +class CcardblankDlg : public CTabPageSSL +{ + DECLARE_DYNAMIC(CcardblankDlg) + +public: + CcardblankDlg(int pos,CWnd* pParent = nullptr); // 标准构造函数 + virtual ~CcardblankDlg(); + +// 对话框数据 +#ifdef AFX_DESIGN_TIME + enum { IDD = IDD_DISCARDBLANKSETTING }; +#endif + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 + virtual BOOL OnInitDialog(); + DECLARE_MESSAGE_MAP() +public: + CLinkSlider m_slider_blank; + CSmartEdit m_edit_blank; + int discardblank_percent = 1; + afx_msg void OnNMReleasedcaptureSldDevnmax(NMHDR* pNMHDR, LRESULT* pResult); +}; diff --git a/huagao/CdisardblankDlg.cpp b/huagao/CdisardblankDlg.cpp new file mode 100644 index 00000000..e2f01a44 --- /dev/null +++ b/huagao/CdisardblankDlg.cpp @@ -0,0 +1,31 @@ +// CdisardblankDlg.cpp: 实现文件 +// +#include "CdisardblankDlg.h" +#include "afxdialogex.h" +#include "resource.h" + +// CdisardblankDlg 对话框 + +IMPLEMENT_DYNAMIC(CdisardblankDlg, CTabPageSSL) + +CdisardblankDlg::CdisardblankDlg(CWnd* pParent /*=nullptr*/) + : CTabPageSSL(IDD_DISCARDBLANKSETTING, pParent) +{ + +} + +CdisardblankDlg::~CdisardblankDlg() +{ +} + +void CdisardblankDlg::DoDataExchange(CDataExchange* pDX) +{ + CTabPageSSL::DoDataExchange(pDX); +} + + +BEGIN_MESSAGE_MAP(CdisardblankDlg, CTabPageSSL) +END_MESSAGE_MAP() + + +// CdisardblankDlg 消息处理程序 diff --git a/huagao/CdisardblankDlg.h b/huagao/CdisardblankDlg.h new file mode 100644 index 00000000..e0e40a1e --- /dev/null +++ b/huagao/CdisardblankDlg.h @@ -0,0 +1,23 @@ +#pragma once +#include "TabPageSSL.h" +#include +// CdisardblankDlg 对话框 + +class CdisardblankDlg : public CTabPageSSL +{ + DECLARE_DYNAMIC(CdisardblankDlg) + +public: + CdisardblankDlg(CWnd* pParent = nullptr); // 标准构造函数 + virtual ~CdisardblankDlg(); + +// 对话框数据 +#ifdef AFX_DESIGN_TIME + enum { IDD = IDD_DISCARDBLANKSETTING }; +#endif + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 + + DECLARE_MESSAGE_MAP() +}; diff --git a/huagao/Device/GScan.h b/huagao/Device/GScan.h index 6a5d0830..5faac223 100644 --- a/huagao/Device/GScan.h +++ b/huagao/Device/GScan.h @@ -7,6 +7,7 @@ #include #include #include +#include #include "PublicFunc.h" enum tagDevState @@ -60,6 +61,8 @@ typedef enum tagUsbSupported { UPDATE_SCAN_PARAMETER = 72, // PCæ PC_SCAN_BUSY_or_ERROR = 73, + //ߡ + DOG_EAR=74, //USB δ USB_DISCONNECTED = 200, //ûֹͣ @@ -86,6 +89,7 @@ public: void ResetMsgFiter() { bFilterMsg = true; } virtual void open(int vid, int pid) = 0; virtual void regist_deviceevent_callback(deviceevent_callback callback, void* usrdata = 0) = 0; + virtual void DogEar_callback(std::function fun)=0; virtual int aquire_bmpdata(std::vector& bmpdata) = 0; virtual BOOL IsConnected() = 0; virtual std::string GetFWVersion() = 0; diff --git a/huagao/Device/GScanO200.cpp b/huagao/Device/GScanO200.cpp index fa0ae520..0c4c2f97 100644 --- a/huagao/Device/GScanO200.cpp +++ b/huagao/Device/GScanO200.cpp @@ -5,6 +5,7 @@ #include "StopWatch.h" #include "scn_config.h" #include "ImageMatQueue.h" +#include "ImageProcess/ImageApplyDogEarDetection.h" #include "filetools.h" #include "GetMemoryUsage.h" #ifndef G200 @@ -143,9 +144,11 @@ typedef enum tagUsbKeyWords : UINT32 GScanO200::GScanO200() : huagods(NULL), + image_num(0), m_bread_fixed_ratio_fromDSP(false) { m_pImages.reset(new ImageMatQueue()); + m_pImages->Getimagenumber = std::bind(&GScanO200::Getimagenumber,this, std::placeholders::_1); } GScanO200::~GScanO200() @@ -160,6 +163,25 @@ GScanO200::~GScanO200() } + +void GScanO200::Getimagenumber(bool isadd) +{ + if (isadd) + { + image_num++; + } + else + { + image_num--; + } + //FileTools::write_log("1.txt", "image num :" + std::to_string(image_num)); +} + +void GScanO200::DogEar_callback(std::function fun) +{ + m_pImages->DogEarDetection_callback = fun; +} + void GScanO200::open(int vid, int pid) { auto usbs = UsbScan_List::find_vid_pid(vid, pid); @@ -175,7 +197,7 @@ void GScanO200::open(int vid, int pid) ipid = 0x0100; #else ivid = 0x3072; - ipid = 0x0100; + ipid = 0x0200; #endif // ISG100 #elif defined(G300) @@ -401,7 +423,7 @@ void GScanO200::Scanner_StartScan(UINT16 count) return; } #endif // !G200 - + m_pImages->reset_DogEar(); if (gcap.is_duplex) count = count == 65535 ? 65535 : count / 2; USBCB usbcb = { START_COMMAND,(UINT32)count ,0 }; @@ -586,8 +608,8 @@ void GScanO200::usbmain() writelog("imgData->size() error"); break; } - - m_pImages->pushMat(std::shared_ptr(new G200Decode(imgData))); + if(!m_pImages->get_isDogEar()) + m_pImages->pushMat(std::shared_ptr(new G200Decode(imgData))); //static int rawdataindex = 0; //writelog("origin rawbuffer index " + std::to_string(++rawdataindex)); #ifdef LOG_NORMAL diff --git a/huagao/Device/GScanO200.h b/huagao/Device/GScanO200.h index ff9af24c..de4e1994 100644 --- a/huagao/Device/GScanO200.h +++ b/huagao/Device/GScanO200.h @@ -34,6 +34,7 @@ public: virtual void Set_ErrorCode(UINT32 value) override; virtual int get_scanned_num() override; virtual void clear_hwerror() override; + virtual void DogEar_callback(std::function fun) override; private: static void usbhotplug_callback(bool isleft, void* userdata); @@ -41,6 +42,7 @@ private: void updateHVRatio(); void usbmain(); USBCB Get_Scanner_Status(); + void Getimagenumber(bool isadd); std::shared_ptr> Get_Img_Data(int buffersize); void Pop_Image(); private: @@ -48,6 +50,7 @@ private: std::shared_ptr m_usb; std::unique_ptr m_threadUsb; GScanCap gcap; + volatile int image_num; void* huagods; deviceevent_callback dev_callback; }; diff --git a/huagao/Device/IConfig.h b/huagao/Device/IConfig.h index db1ede24..b398d654 100644 --- a/huagao/Device/IConfig.h +++ b/huagao/Device/IConfig.h @@ -64,7 +64,7 @@ static std::map SupResolutions = { {200.0f, 1}, {240.0f, 1}, {300.0f, 0}, - {600.0f, 2} + {600.0f, 1} //ʱ汾1 ԭ2 }; diff --git a/huagao/Device/ImageMatQueue.cpp b/huagao/Device/ImageMatQueue.cpp index 6196e173..860a3cc3 100644 --- a/huagao/Device/ImageMatQueue.cpp +++ b/huagao/Device/ImageMatQueue.cpp @@ -50,8 +50,11 @@ ImageMatQueue::ImageMatQueue(void) , is_scanning(false) ,fx(1.001) ,fy(1.007) + ,DogEar_index(0) + ,is_DogEar(false) { atm_orgin_image_remains = 0; + m_dogear.reset(new CImageApplyDogEarDetection(40,1.0,200)); } void ImageMatQueue::run() @@ -62,6 +65,17 @@ void ImageMatQueue::run() } } +bool ImageMatQueue::get_isDogEar() +{ + return is_DogEar; +} + +void ImageMatQueue::reset_DogEar() +{ + is_DogEar = false; + DogEar_index = 0; +} + int ImageMatQueue::orginimgcount() { return atm_orgin_image_remains; @@ -95,6 +109,7 @@ ImageMatQueue::~ImageMatQueue(void) static int paperIndex = 0; void ImageMatQueue::pushMat(std::shared_ptr data) { + Getimagenumber(true); m_rawBuffs.Put(data); atm_orgin_image_remains++; //string paperindexinfo = "Get the index of "+to_string(++paperIndex)+" Paper"; @@ -118,9 +133,15 @@ void ImageMatQueue::clear() atm_orgin_image_remains = 0; } +void ImageMatQueue::rawBuffsclear() +{ + m_rawBuffs.Clear(); +} + void ImageMatQueue::setparam(const GScanCap& param) { paperIndex = 0; + ischeck_dogear = param.is_dogeardetection; //FileTools::write_log("D:\\1.txt", "RESET PAPER COUNT"); scanParam = param; //scanParam.is_duplex = 0; @@ -154,6 +175,48 @@ void ImageMatQueue::setparam(const GScanCap& param) } if (param.is_autodiscradblank_normal || param.is_autodiscradblank_vince) { + //m_iaList.push_back(shared_ptr(new CImageApplyDiscardBlank())); + CImageApplyDiscardBlank* disBlank = new CImageApplyDiscardBlank(); + //հҳֵ + int area = 200; + int intensity = 15; + int maxHeight = 3307;//A3 height + //ҳ߶Ȼȡ + if (param.papertype == TwSS::MaxSize) + maxHeight = 6614; + //ֵֵ + if (param.discardblank_percent < 10) { + area = 70 + (int)((param.discardblank_percent - 1) * 13.33); + intensity = 8 + param.discardblank_percent / 2; + } + else if (param.discardblank_percent < 20) { + area = 190 + (param.discardblank_percent - 10) * 14; + intensity = 15; + } + else if (param.discardblank_percent < 40) { + area = 400 + (param.discardblank_percent - 20) * 10; + intensity = 20; + } + else if (param.discardblank_percent < 60) { + area = 600 + (param.discardblank_percent - 40) * 20; + intensity = 20; + } + else if (param.discardblank_percent < 80) { + area = 1000 + (param.discardblank_percent - 60) * 55; + intensity = 30; + } + else { + area = 2100 + (param.discardblank_percent - 80) * (maxHeight - 2100) / 20; + intensity = 40; + } + //жǷΪհҳƱ + if (param.is_autodiscradblank_vince) { + area *= 1.5; + intensity *= 1.5; + } + //òֵ + disBlank->setMinArea(area); + disBlank->setIntensity(intensity); m_iaList.push_back(shared_ptr(new CImageApplyDiscardBlank())); //m_iaList.push_back(shared_ptr(new CImageApplyDiscardBlank(param.areanum,param.devnmax))); } @@ -226,7 +289,11 @@ void ImageMatQueue::setparam(const GScanCap& param) TCHAR szIniFile[MAX_PATH] = { 0 }; SHGetSpecialFolderPath(NULL, szIniFile, CSIDL_WINDOWS, TRUE); +#ifdef LANXUM + _tcscat(szIniFile, _T("\\twain_32\\LANXUMSCAN\\tessdata")); +#else _tcscat(szIniFile, _T("\\twain_32\\HuaGoScan\\tessdata")); +#endif // int iLen = WideCharToMultiByte(CP_ACP, 0, szIniFile, -1, NULL, 0, NULL, NULL); char* chRtn = new char[iLen * sizeof(char)]; WideCharToMultiByte(CP_ACP, 0, szIniFile, -1, chRtn, iLen, NULL, NULL); @@ -242,16 +309,17 @@ void ImageMatQueue::EnqueueBmpBuffer(std::shared_ptr> void ImageMatQueue::PaniusCount() { atm_orgin_image_remains--; + Getimagenumber(false); } bool ImageMatQueue::empty() { - return atm_orgin_image_remains == 0 && m_imagedata.Size() == 0 && !is_scanning; + return atm_orgin_image_remains <= 0 && m_imagedata.Size() == 0 && !is_scanning; } bool ImageMatQueue::queuesempty() { - return atm_orgin_image_remains == 0 && m_imagedata.Size() == 0; + return atm_orgin_image_remains <= 0 && m_imagedata.Size() == 0; } static int index = 0; @@ -312,7 +380,22 @@ void ImageMatQueue::proc() } } buffs.clear(); - + DogEar_index++; + StopWatch sw; + sw.reset(); + if (ischeck_dogear) + { + m_dogear->apply(mats[0], 0); + if (m_dogear->getResult()) + { + DogEarDetection_callback(DogEar_index); + m_rawBuffs.Clear(); + atm_orgin_image_remains = 0; + is_DogEar = true; + continue; + } + } + //FileTools::write_log("1.txt", " dogear time " + to_string(sw.elapsed_ms())); if (scanParam.is_switchfrontback) swap(mats[0], mats[1]); @@ -332,8 +415,11 @@ void ImageMatQueue::proc() if (mats[i].channels() == 3) cvtColor(mats[i], mats[i], cv::COLOR_BGR2GRAY); idata = scanParam.pixtype == 0 ? (IMat2Bmp)Mat2BmpBw(mats[i], scanParam.resolution_dst) : Mat2Bmp(mats[i], scanParam.resolution_dst); + if (!scanParam.multi_output_red) + mats[i].release(); auto data = idata.getBmpDataBuffer(); EnqueueBmpBuffer(data); + data.reset(); } else { @@ -356,6 +442,7 @@ void ImageMatQueue::proc() auto data = mb.getBmpDataBuffer(); ret.release(); EnqueueBmpBuffer(data); + data.reset(); } } } diff --git a/huagao/Device/ImageMatQueue.h b/huagao/Device/ImageMatQueue.h index 981d6d84..471ad7f9 100644 --- a/huagao/Device/ImageMatQueue.h +++ b/huagao/Device/ImageMatQueue.h @@ -161,24 +161,33 @@ public: bool empty(); bool queuesempty(); bool valid(); + bool get_isDogEar(); + void reset_DogEar(); void clear(); + void rawBuffsclear(); void setparam(const GScanCap& param); void run(); int orginimgcount(); void setscanflags(const bool flags) { is_scanning = flags; } void updatefixratio(float& hratio, float& vratio); + std::function DogEarDetection_callback; + std::function Getimagenumber; private: void proc(); void EnqueueBmpBuffer(std::shared_ptr>); void PaniusCount(); BlockingQueue>>m_imagedata; std::unique_ptr m_threadProc; + bool ischeck_dogear; + volatile int DogEar_index; + volatile bool is_DogEar; volatile bool bRun; volatile int atm_orgin_image_remains; volatile bool is_scanning; GScanCap scanParam; Device::PaperSize papersize; - std::vector> m_iaList; + std::shared_ptr m_dogear; + std::vector> m_iaList; //ͼÏñ´¦Àíº¯Êý½Ó¿Ú BlockingQueue> m_rawBuffs; float fx, fy; }; \ No newline at end of file diff --git a/huagao/Device/PublicFunc.cpp b/huagao/Device/PublicFunc.cpp index 1d58500c..c132c5c9 100644 --- a/huagao/Device/PublicFunc.cpp +++ b/huagao/Device/PublicFunc.cpp @@ -437,6 +437,8 @@ CString GetHidedlgPath() SHGetSpecialFolderPath(NULL, szIniFile, CSIDL_WINDOWS, TRUE); #ifdef MAKEHUAGAO _tcscat(szIniFile, _T("\\twain_32\\HuaGoScan\\hidedlg.exe")); +#elif defined LANXUM + _tcscat(szIniFile, _T("\\twain_32\\LANXUMSCAN\\hidedlg.exe")); #else // MAKEHUAGAO _tcscat(szIniFile, _T("\\twain_32\\ZhibenScan\\hidedlg.exe")); #endif diff --git a/huagao/Device/PublicFunc.h b/huagao/Device/PublicFunc.h index bce587b5..307d4132 100644 --- a/huagao/Device/PublicFunc.h +++ b/huagao/Device/PublicFunc.h @@ -59,6 +59,7 @@ using namespace std; #define DOCORIENTATION "bOrientation" #define AUTO_TEXT "bAutoText" #define BACKROTATE180 "iBackRotate180" +#define DOGEAR_DETECTION "dogeardetection" #define SCREWDETECT "bScrewDetect" #define SCREWLEVEL "iScrewLevel" #define ITEMCAPTION "Caption" @@ -180,6 +181,7 @@ struct GScanCap byte is_autocontrast; /**< ԶԱȶ*/ byte is_autocrop; /**< Զ*/ byte is_autodiscradblank_normal; /**< Զհҳͨ*/ + int discardblank_percent; /**<հҳֵ*/ byte is_autodiscradblank_vince;/**ԶհҳƱ*/ byte is_switchfrontback; /***/ byte autodescrew; /**< Զƫ*/ @@ -191,6 +193,7 @@ struct GScanCap byte fillbackground; /**< ڿ*/ unsigned short scannum; /**< ɨ*/ byte is_backrotate180; /**< ת180*/ + byte is_dogeardetection; /**<۽Ǽ*/ HardwareCaps hardwarecaps; /**< Ӳɨ*/ FillHole fillhole; byte is_autotext; /**< Զıʶ*/ diff --git a/huagao/GscanJsonConfig.cpp b/huagao/GscanJsonConfig.cpp index 6f754252..c0b709ed 100644 --- a/huagao/GscanJsonConfig.cpp +++ b/huagao/GscanJsonConfig.cpp @@ -41,7 +41,7 @@ GScanCap GscanJsonConfig::GetDefaultGscancapValue() gcap.autodescrew = TRUE;//Զƫ gcap.enhance_color = EnchaceColor::Enhance_None;//Ĭϲɫǿ gcap.en_fold = FALSE;//Ĭϲ - gcap.fillbackground = FALSE;//Ĭϲڿ + gcap.fillbackground = TRUE;//Ĭϲڿ gcap.fillhole.is_fillhole = FALSE; gcap.fillhole.fillholeratio = 10; gcap.filter = 3;//ӦFilter::None @@ -58,6 +58,7 @@ GScanCap GscanJsonConfig::GetDefaultGscancapValue() gcap.imageRotateDegree = 0.0f;//Ĭϲת gcap.is_autotext = FALSE; gcap.is_backrotate180 = FALSE; + gcap.is_dogeardetection = FALSE; gcap.scannum = -1;//Ĭɨ //gcap.scanrect = { 0 }; @@ -103,6 +104,7 @@ void GscanJsonConfig::SaveGscanCapConfig(const GScanCap & gcap, const std::strin outJson["Config"].Add(DOCORIENTATION, (int)(gcap.imageRotateDegree)); outJson["Config"].Add(AUTO_TEXT, (bool)(gcap.is_autotext),false); outJson["Config"].Add(BACKROTATE180, (bool)(gcap.is_backrotate180), false); + outJson["Config"].Add(DOGEAR_DETECTION, (bool)(gcap.is_dogeardetection), false); outJson["Config"].Add(SCREWDETECT, (bool)(gcap.hardwarecaps.en_skrewdetect), false); outJson["Config"].Add(SCREWLEVEL, (int)(gcap.hardwarecaps.skrewdetectlevel)); outJson["Config"].Add(ITEMCAPTION, (string)(gcap.Caption)); @@ -155,6 +157,7 @@ void GscanJsonConfig::WriteJsonArrayToFile(std::vector cfgArray, const root["Config"].AddEmptySubArray(DOCORIENTATION); root["Config"].AddEmptySubArray(AUTO_TEXT); root["Config"].AddEmptySubArray(BACKROTATE180); + root["Config"].AddEmptySubArray(DOGEAR_DETECTION); root["Config"].AddEmptySubArray(SCREWDETECT); root["Config"].AddEmptySubArray(SCREWLEVEL); @@ -197,6 +200,7 @@ void GscanJsonConfig::WriteJsonArrayToFile(std::vector cfgArray, const root["Config"][DOCORIENTATION].Add((int)cfgArray[i].imageRotateDegree); root["Config"][AUTO_TEXT].Add(i, (bool)cfgArray[i].is_autotext); root["Config"][BACKROTATE180].Add(i, (bool)cfgArray[i].is_backrotate180); + root["Config"][DOGEAR_DETECTION].Add(i, (bool)cfgArray[i].is_dogeardetection); root["Config"][SCREWDETECT].Add(i, (bool)cfgArray[i].hardwarecaps.en_skrewdetect); root["Config"][SCREWLEVEL].Add((int)cfgArray[i].hardwarecaps.skrewdetectlevel); @@ -349,6 +353,8 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str root["Config"].Get(AUTO_TEXT, itmAutotext); neb::CJsonObject itmBackRotate; root["Config"].Get(BACKROTATE180, itmBackRotate); + neb::CJsonObject itmdogeardetection; + root["Config"].Get(DOGEAR_DETECTION, itmdogeardetection); neb::CJsonObject itmScrewDetct; root["Config"].Get(SCREWDETECT, itmScrewDetct); neb::CJsonObject itmScrewLevel; @@ -437,6 +443,8 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str cfp.is_autotext = b_value?1:0; itmBackRotate.Get(i, b_value); cfp.is_backrotate180 = b_value ? 1 : 0; + itmdogeardetection.Get(i, b_value); + cfp.is_dogeardetection = b_value ? 1 : 0; itmScrewDetct.Get(i, b_value); cfp.hardwarecaps.en_skrewdetect = b_value ? 1 : 0; itmScrewLevel.Get(i, i_value); @@ -529,6 +537,8 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str cfp.is_autotext = bvalue?1:0; root["Config"].Get(BACKROTATE180, bvalue); cfp.is_backrotate180 = bvalue ? 1 : 0; + root["Config"].Get(DOGEAR_DETECTION, bvalue); + cfp.is_dogeardetection = bvalue ? 1 : 0; root["Config"].Get(SCREWDETECT, bvalue); cfp.hardwarecaps.en_skrewdetect = bvalue ? 1 : 0; root["Config"].Get(SCREWLEVEL, index); diff --git a/huagao/ImageProcess/ImageApplyAdjustColors.cpp b/huagao/ImageProcess/ImageApplyAdjustColors.cpp index 6554c4e2..0d1eead8 100644 --- a/huagao/ImageProcess/ImageApplyAdjustColors.cpp +++ b/huagao/ImageProcess/ImageApplyAdjustColors.cpp @@ -23,8 +23,7 @@ CImageApplyAdjustColors::~CImageApplyAdjustColors(void) void CImageApplyAdjustColors::apply(cv::Mat& pDib,int side) { #ifdef LOG - FileTools:: - "imgprc.txt", "enter CImageApplyAdjustColors apply"); + FileTools::write_log("imgprc.txt", "enter CImageApplyAdjustColors apply"); #endif // LOG if (pDib.empty()) { diff --git a/huagao/ImageProcess/ImageApplyAutoCrop.cpp b/huagao/ImageProcess/ImageApplyAutoCrop.cpp index c5bc0ad9..5fc5f12e 100644 --- a/huagao/ImageProcess/ImageApplyAutoCrop.cpp +++ b/huagao/ImageProcess/ImageApplyAutoCrop.cpp @@ -128,7 +128,10 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side) pDib.release(); if ((m_isCrop && side == 0) || (side == 1 && m_fixedSize.width * m_fixedSize.height == 0)) + { pDib = dst.clone(); + dst.release(); + } else { if (m_isCrop && side == 1 && !m_fixedSize.empty()) @@ -159,7 +162,8 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side) FileTools::write_log("imgprc.txt", outroiinfo); #endif // LOG dst(roi).copyTo(pDib(rect)); - + dst.release(); + } #ifdef LOG FileTools::write_log("imgprc.txt", "exit CImageApplyAutoCrop apply8"); diff --git a/huagao/ImageProcess/ImageApplyAutoCrop.h b/huagao/ImageProcess/ImageApplyAutoCrop.h index 23eefe84..81bed3f6 100644 --- a/huagao/ImageProcess/ImageApplyAutoCrop.h +++ b/huagao/ImageProcess/ImageApplyAutoCrop.h @@ -32,6 +32,8 @@ public: cv::Size fixedSize() { return m_fixedSize; } + const std::vector& maxContour() { return m_maxContour; } + void setAutoCrop(bool enabled) { m_isCrop = enabled; } void setFillBlank(bool enabled) { m_isFillBlank = enabled; } @@ -58,7 +60,7 @@ private: int m_noise; int m_indent; cv::Size m_fixedSize; - + std::vector m_maxContour; }; #endif // !IMAGE_APPLY_AUTO_CROP_H diff --git a/huagao/ImageProcess/ImageApplyBWBinaray.cpp b/huagao/ImageProcess/ImageApplyBWBinaray.cpp index b87803d1..7dfee1da 100644 --- a/huagao/ImageProcess/ImageApplyBWBinaray.cpp +++ b/huagao/ImageProcess/ImageApplyBWBinaray.cpp @@ -86,8 +86,7 @@ void CImageApplyBWBinaray::apply(cv::Mat& pDib, int side) } #ifdef LOG - FileTools:: - "imgprc.txt", "exit CImageApplyBWBinaray apply"); + FileTools::write_log("imgprc.txt", "exit CImageApplyBWBinaray apply"); #endif // LOG } diff --git a/huagao/ImageProcess/ImageApplyChannel.cpp b/huagao/ImageProcess/ImageApplyChannel.cpp index a82b0800..d4e7c6bb 100644 --- a/huagao/ImageProcess/ImageApplyChannel.cpp +++ b/huagao/ImageProcess/ImageApplyChannel.cpp @@ -21,8 +21,7 @@ CImageApplyChannel::~CImageApplyChannel(void) void CImageApplyChannel::apply(cv::Mat& pDib,int side) { #ifdef LOG - FileTools:: - "imgprc.txt", "enter CImageApplyChannel apply"); + FileTools::write_log("imgprc.txt", "enter CImageApplyChannel apply"); #endif // LOG if (pDib.empty()) diff --git a/huagao/ImageProcess/ImageApplyDiscardBlank.cpp b/huagao/ImageProcess/ImageApplyDiscardBlank.cpp index 9a1fa4c7..02052262 100644 --- a/huagao/ImageProcess/ImageApplyDiscardBlank.cpp +++ b/huagao/ImageProcess/ImageApplyDiscardBlank.cpp @@ -119,8 +119,7 @@ cv::Mat CImageApplyDiscardBlank::getRoiMat(const cv::Mat& image) void CImageApplyDiscardBlank::apply(cv::Mat& pDib, int side) { #ifdef LOG - FileTools:: - "imgprc.txt", "enter CImageApplyDiscardBlank apply"); + FileTools::write_log("imgprc.txt", "enter CImageApplyDiscardBlank apply"); #endif // LOG if (pDib.empty()) diff --git a/huagao/ImageProcess/ImageApplyDogEarDetection.cpp b/huagao/ImageProcess/ImageApplyDogEarDetection.cpp new file mode 100644 index 00000000..40ef3a75 --- /dev/null +++ b/huagao/ImageProcess/ImageApplyDogEarDetection.cpp @@ -0,0 +1,67 @@ +#include "ImageApplyDogEarDetection.h" +#include "ImageProcess_Public.h" + +CImageApplyDogEarDetection::CImageApplyDogEarDetection() + : m_threshold(40) + , m_zoom(1.0) + , m_distance(50) + , m_result(false) +{ + +} + +CImageApplyDogEarDetection::CImageApplyDogEarDetection(double threshlod, double zoom, double distance) + : m_threshold(threshlod) + , m_zoom(zoom) + , m_distance(distance) + , m_result(false) +{ + +} + +CImageApplyDogEarDetection::~CImageApplyDogEarDetection() +{ + +} + +void CImageApplyDogEarDetection::apply(cv::Mat &pDib, int side) +{ + m_result = false; + (void)side; + if (pDib.empty()) return; + cv::Mat src; + if (m_zoom != 1.0) + cv::resize(pDib, src, cv::Size(), m_zoom, m_zoom, cv::INTER_NEAREST); + else + src = pDib; + + cv::Mat thre; + hg::threshold_Mat(src, thre, m_threshold); + std::vector hierarchy; + std::vector> contours; + hg::findContours(thre, contours, hierarchy, cv::RETR_EXTERNAL); + + std::vector maxContour = hg::getMaxContour(contours, hierarchy); + if (maxContour.size() == 0) + { + m_result = true; + return; + } + hg::convexHull(maxContour, maxContour); + cv::RotatedRect rect = hg::getBoundingRect(maxContour); + cv::Point2f vertexes[4]; + rect.points(vertexes); + + for (int i = 0; i < 4; i++) + if ((-cv::pointPolygonTest(maxContour, vertexes[i], true)) > (m_distance * m_zoom)) + { + m_result = true; + return; + } +} + +void CImageApplyDogEarDetection::apply(std::vector &mats, bool isTwoSide) +{ + (void)mats; + (void)isTwoSide; +} diff --git a/huagao/ImageProcess/ImageApplyDogEarDetection.h b/huagao/ImageProcess/ImageApplyDogEarDetection.h new file mode 100644 index 00000000..a05f313c --- /dev/null +++ b/huagao/ImageProcess/ImageApplyDogEarDetection.h @@ -0,0 +1,56 @@ +/* + * ==================================================== + + * 功能:折角检测。检测原理:计算纸张的理论四角顶点,到实际轮廓最小距离。当任意顶点到轮廓最小距离超过阈值,则判定为折角 + * 作者:刘丁维 + * 生成时间:2020/10/30 + * 最近修改时间:2020/10/30 + * 版本号:v1.0 + + * ==================================================== + */ + +#ifndef IMAGE_APPLY_DOGEAR_DETECTION_H +#define IMAGE_APPLY_DOGEAR_DETECTION_H + +#include "ImageApply.h" + +class CImageApplyDogEarDetection :public CImageApply +{ +public: + + /// + /// 折角检测默认构造函数,threshold = 40, zoom = 1.0, distance = 50 + /// + CImageApplyDogEarDetection(); + + /// + /// 折角检测构造函数 + /// + /// 二值化阈值 + /// 原图缩放比例,对于大尺寸图像而言通过zoom缩小图像可减少计算量。默认值1.0(不缩放) + /// 理论顶点到实际轮廓最小距离的阈值,大于该阈值则判定为折角,默认值50(像素) + CImageApplyDogEarDetection(double threshlod, double zoom = 1.0, double distance = 50); + + virtual ~CImageApplyDogEarDetection(void); + + /// + /// 获取检测结果。该函数须在调用apply之后使用。 + /// + /// true为折角,false为不折角 + inline bool getResult() { return m_result; } + + virtual void apply(cv::Mat& pDib, int side); + +private: + virtual void apply(std::vector& mats, bool isTwoSide); + +private: + double m_threshold; + double m_zoom; + double m_distance; + + bool m_result; +}; + +#endif // IMAGE_APPLY_DOGEAR_DETECTION_H diff --git a/huagao/ImageProcess/ImageApplyHeaders.h b/huagao/ImageProcess/ImageApplyHeaders.h index baf1de6a..10a5f972 100644 --- a/huagao/ImageProcess/ImageApplyHeaders.h +++ b/huagao/ImageProcess/ImageApplyHeaders.h @@ -9,6 +9,7 @@ #include "ImageApplyCrop.h" #include "ImageApplyDiscardBlank.h" #include "ImageApplyOutHole.h" +#include "ImageApplyDogEarDetection.h" #include "ImageApplyResize.h" #include "ImageApplyRotation.h" #include "ImageApplySharpen.h" diff --git a/huagao/Sliders.h b/huagao/Sliders.h index 137c2da5..78626b1b 100644 --- a/huagao/Sliders.h +++ b/huagao/Sliders.h @@ -38,7 +38,7 @@ #endif // EXTENSION_DLL #endif // AfxExt - +#include class AfxExt CSmartEdit; diff --git a/huagao/TabPageSSL.cpp b/huagao/TabPageSSL.cpp index e64e21bc..73fce32a 100644 --- a/huagao/TabPageSSL.cpp +++ b/huagao/TabPageSSL.cpp @@ -42,12 +42,14 @@ void CTabPageSSL::OnOK (void) { // // Prevent CDialog::OnOK from calling EndDialog. // + CDialog::OnOK(); } void CTabPageSSL::OnCancel (void) { // // Prevent CDialog::OnCancel from calling EndDialog. // + CDialog::OnCancel(); } BOOL CTabPageSSL::OnCommand (WPARAM wParam, LPARAM lParam) { diff --git a/huagao/TabPageSSL.h b/huagao/TabPageSSL.h index 03101630..5e647121 100644 --- a/huagao/TabPageSSL.h +++ b/huagao/TabPageSSL.h @@ -3,7 +3,7 @@ ///////////////////////////////////////////////////////////////////////////// // CTabPageSSL declaration - +#include class CTabPageSSL : public CDialog { public: diff --git a/huagao/huagaods.cpp b/huagao/huagaods.cpp index 176c19ea..21ff8167 100644 --- a/huagao/huagaods.cpp +++ b/huagao/huagaods.cpp @@ -43,7 +43,8 @@ enum class CapTypeEx : unsigned short { TwEx_StableDetectEnable = 0x8090, TwEx_UVModel = 0x8093, TwEx_SwitchFrontBack = 0x8094, - TwEx_HsvCorrect = 0x8095 + TwEx_HsvCorrect = 0x8095, + TwEx_DogEarDelection=0x8096, }; using namespace Twpp; @@ -68,6 +69,8 @@ static constexpr const Identity srcIdent( DataGroup::Image, #ifdef MAKEHUAGAO "HUAGO", +#elif defined LANXUM + "LANXUM", #else // MAKEHUAGAO "ZHIBEN", #endif @@ -79,7 +82,12 @@ static constexpr const Identity srcIdent( "G200 Series", #endif #elif defined(G300) // G200 - "G300 Series", + #ifdef LANXUM + "G4260F Series", + #else // ISG100 + "G300 Series", + #endif + #elif defined(G400) // G200 "G400 Series", #endif @@ -98,11 +106,13 @@ static constexpr const Identity srcIdent( "HUAGOSCAN G200 TWAIN" #endif #endif -#elif defined(G300) // G200 - #ifndef MAKEHUAGAO - "ZhibenScan G300 TWAIN" - #else // !MAKEHUAGAO +#elif defined G300 // G200 + #ifdef MAKEHUAGAO "HUAGOSCAN G300 TWAIN" + #elif defined LANXUM //!LANXUM + "LANXUM G4260F TWAIN" + #else // !MAKEHUAGAO + "ZhibenScan G300 TWAIN" #endif #elif defined(G400) // G200 #ifndef MAKEHUAGAO @@ -126,13 +136,24 @@ static constexpr UInt32 RESOLUTIONX = 85; //static std::unique_ptr application(new CWinApp()); -static list resList = { 100.0,150.0,200.0,240.0,300.0 }; +static list resList = { 100.0,150.0,200.0,240.0,300.0,600.0 }; +//G200 G300G400ֽŷ +#ifdef G200 static list paperSizeList = { (UInt16)PaperSize::A3,(UInt16)PaperSize::A4,(UInt16)PaperSize::A5,(UInt16)PaperSize::A6, (UInt16)PaperSize::IsoB4,(UInt16)PaperSize::IsoB5,(UInt16)PaperSize::IsoB6, (UInt16)PaperSize::UsLetter,(UInt16)PaperSize::UsLegal,(UInt16)PaperSize::UsLedger, - (UInt16)PaperSize::MaxSize,(UInt16)Twpp::PaperSize::None,(UInt16)PaperSize::UsStatement }; + (UInt16)PaperSize::MaxSize,(UInt16)PaperSize::None,(UInt16)PaperSize::UsStatement }; +#elif defined G300 +static list paperSizeList = { (UInt16)PaperSize::A4,(UInt16)PaperSize::A5,(UInt16)PaperSize::A6, (UInt16)PaperSize::IsoB5,(UInt16)PaperSize::IsoB6, + (UInt16)PaperSize::UsLetter,(UInt16)PaperSize::UsLegal,(UInt16)PaperSize::None }; +#elif defined G400 +static list paperSizeList = { (UInt16)PaperSize::A3,(UInt16)PaperSize::A4,(UInt16)PaperSize::A5,(UInt16)PaperSize::A6, + (UInt16)PaperSize::IsoB4,(UInt16)PaperSize::IsoB5,(UInt16)PaperSize::IsoB6, + (UInt16)PaperSize::UsLetter,(UInt16)PaperSize::UsLegal,(UInt16)PaperSize::UsLedger, + (UInt16)PaperSize::MaxSize,(UInt16)PaperSize::None,(UInt16)PaperSize::UsStatement }; +#endif // G200 static list imageRotateList = { 0.0,90.0,180.0,270.0 }; enum class DeviceEventType : UInt16 @@ -146,7 +167,8 @@ enum class DeviceEventType : UInt16 Dev_COUNTMOE, Dev_HARDWAREERROR, Dev_FPGAERROR, - Dev_UserStop + Dev_UserStop, + Dev_DogEar }; static map mapDeviceEvent = { @@ -161,7 +183,8 @@ static map mapDeviceEvent = { {HARDWARE_ERROR,(DeviceEvent::Type)(DeviceEventType::Dev_HARDWAREERROR)}, {FPGA_ERROR,(DeviceEvent::Type)(DeviceEventType::Dev_FPGAERROR)}, {USB_DISCONNECTED,DeviceEvent::Type::CheckDeviceOnline}, - {USER_STOP,(DeviceEvent::Type)(DeviceEventType::Dev_UserStop)} + {USER_STOP,(DeviceEvent::Type)(DeviceEventType::Dev_UserStop)}, + {DOG_EAR,(DeviceEvent::Type)(DeviceEventType::Dev_DogEar)} }; static void DeleteWnd(CDialog* pWnd) { @@ -186,6 +209,7 @@ static std::unique_ptr scanner(new GScanVirtual()); #endif HuagaoDs::HuagaoDs() : m_scanparam(new GScanCap) + ,bmpData(new std::vector) , hMutex(NULL) { /*string ss1= getOSInfo(); @@ -464,19 +488,35 @@ void HuagaoDs::SetResoluton(const char* path, int resolution) fclose(file); } +void HuagaoDs::dogear_callback(int indexpaper) +{ + CString text; + text.Format(_T("74 %d"), indexpaper); + ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), text, NULL, SW_HIDE); + scanner->Stop_scan(); + //scanner->reset(); + scanner->ResetScanner(); + onDeviceEvent(DOG_EAR); +} + + Result HuagaoDs::identityOpenDs(const Identity&) { //writelog("identityOpenDs"); if(!scanner.get()) scanner.reset(new GScanO200()); - + m_haveError = false; updataGscanCap(); - bmpData.resize(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)); + bmpData->resize(sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)); BITMAPINFOHEADER& bmInfo = *((BITMAPINFOHEADER*)header()); bmInfo.biHeight = 2000; bmInfo.biWidth = 2000; bmInfo.biBitCount = m_scanparam->pixtype == 2 ? 24 : (m_scanparam->pixtype == 1 ? 8 : 0); m_iBitdepth = m_scanparam->pixtype == 2 ? 24 : (m_scanparam->pixtype == 1 ? 8 : 0); +#ifdef LANXUM + scanner->open(0x31c9, 0x8200); +#else scanner->open(0x064B, 0x7823); +#endif if (!scanner->IsConnected()) { ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), CString("201"), NULL, SW_HIDE); @@ -485,6 +525,7 @@ Result HuagaoDs::identityOpenDs(const Identity&) { else { scanner->regist_deviceevent_callback(DeviceEvent_callback, this); + scanner->DogEar_callback(std::bind(&HuagaoDs::dogear_callback, this, std::placeholders::_1)); } hMutex = CreateMutex(NULL, FALSE, _T("LookitApp")); if (GetLastError() == ERROR_ALREADY_EXISTS) { //ѾͬMutexõ. @@ -808,10 +849,13 @@ Result HuagaoDs::identityOpenDs(const Identity&) { break; } } - data = Capability::createEnumeration(data.type(), { PaperSize::A3,PaperSize::A4,PaperSize::A5, - PaperSize::A6,PaperSize::IsoB4,PaperSize::IsoB5, - PaperSize::IsoB6,PaperSize::UsLetter,PaperSize::UsLegal, - PaperSize::UsLedger,PaperSize::MaxSize,PaperSize::None,PaperSize::UsStatement}, + data = Capability::createEnumeration(data.type(), { (UInt16)PaperSize::A3,(UInt16)PaperSize::A4,(UInt16)PaperSize::A5,(UInt16)PaperSize::A6, + (UInt16)PaperSize::IsoB5,(UInt16)PaperSize::IsoB6,(UInt16)PaperSize::UsLetter,(UInt16)PaperSize::UsLegal,(UInt16)PaperSize::None +#ifndef G300 + ,(UInt16)PaperSize::UsLedger,(UInt16)PaperSize::IsoB4, + (UInt16)PaperSize::MaxSize,(UInt16)PaperSize::UsStatement +#endif // + }, index == -1 ? 0 : index, 0); @@ -1555,8 +1599,9 @@ Result HuagaoDs::identityOpenDs(const Identity&) { return success(); case Msg::Reset: case Msg::GetDefault: - m_scanparam->fillbackground = false; - data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_IFillBackground), Bool(false)); + m_scanparam->fillbackground = true; + data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_IFillBackground), Bool(true)); + return success(); case Msg::Set: { auto mech = data.currentItem(); @@ -1988,6 +2033,30 @@ Result HuagaoDs::identityOpenDs(const Identity&) { } }; + + m_query[(CapType)(CapTypeEx::TwEx_DogEarDelection)] = msgSupportGetAllSetReset; + m_caps[(CapType)(CapTypeEx::TwEx_DogEarDelection)] = [this](Msg msg, Capability& data)->Result { + switch (msg) + { + case Msg::Get: + case Msg::GetCurrent: + data = Capability::createOneValue((CapType)CapTypeEx::TwEx_DogEarDelection, m_scanparam->is_dogeardetection); + return success(); + case Msg::GetDefault: + case Msg::Reset: + m_scanparam->is_dogeardetection = false; + data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_DogEarDelection), Bool(false)); + return success(); + case Msg::Set: + { + auto mech = data.currentItem(); + m_scanparam->is_dogeardetection= mech; + return success(); + } + default: + return capBadOperation(); + } + }; //˫ż ٷ׼ Э޸Ϊbool m_query[CapType::DoubleFeedDetection] = msgSupportGetAllSetReset; m_caps[CapType::DoubleFeedDetection] = [this](Msg msg, Capability& data)->Result { @@ -2027,7 +2096,7 @@ Result HuagaoDs::identityCloseDs(const Identity&) { guiBridge.reset(); scanner.reset(); - + bmpData.reset(); if (hMutex) { ReleaseMutex(hMutex); @@ -2044,9 +2113,12 @@ Result HuagaoDs::pendingXfersGet(const Identity&, PendingXfers& data) { Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data) { //!< end xfer if set count 0 - if (bmpData.size() > 0) - bmpData.clear(); - int ret = scanner->aquire_bmpdata(bmpData); + if (bmpData->size() > 0) + { + bmpData.reset(new std::vector); + } + + int ret = scanner->aquire_bmpdata(*bmpData.get()); if (ret != 0) { scanner->Set_ErrorCode(0); @@ -2122,16 +2194,18 @@ Result HuagaoDs::userInterfaceEnable(const Identity&, UserInterface& ui) { // with hidden UI, the usual workflow DsState::Enabled -> notifyXferReady() -> DsState::XferReady is a single step setState(DsState::Enabled); auto ret = startScan(); - if (ret == success()) { - m_pendingXfers = 1; + if (ret.status().condition() == Twpp::CC::NoMedia) + return ret; + //if (ret == success()) { + //m_pendingXfers = 1; auto notified = notifyXferReady(); return success(); - } - else { - m_pendingXfers = 0; - setState(DsState::Open); - return ret; - } + //} + //else { + // m_pendingXfers = 0; + // setState(DsState::Open); + // return ret; + //} } return showTwainUI(ui); @@ -2225,7 +2299,7 @@ Result HuagaoDs::imageMemXferGet(const Identity& origin, ImageMemXfer& data) { vector cmpdata; if (m_compression == Compression::Group4) { - mat = cv::imdecode(bmpData, cv::IMREAD_GRAYSCALE); + mat = cv::imdecode(*bmpData.get(), cv::IMREAD_GRAYSCALE); G4Tiff gt(mat,G4Tiff::Mode::MemoryMode,"",120,m_scanparam->resolution_dst); gt.GetCompressedData(cmpdata); } @@ -2271,6 +2345,7 @@ Result HuagaoDs::imageMemXferGet(const Identity& origin, ImageMemXfer& data) { if (m_memXferYOff >= static_cast(std::abs(dib->biHeight))) { m_pendingXfers = 0; m_memXferYOff = 0; + bmpData.reset(new std::vector); return { ReturnCode::XferDone, ConditionCode::Success }; } @@ -2285,11 +2360,14 @@ Result HuagaoDs::imageNativeXferGet(const Identity& id, ImageNativeXfer& data) { if (!m_pendingXfers) { return seqError(); } + if (m_haveError) + return { ReturnCode::Cancel, ConditionCode::Success }; if (data) data.release(); // it does not get easier than that if we already have BMP data = ImageNativeXfer(bmpSize()); std::copy(bmpBegin(), bmpEnd(), data.data().data()); + bmpData.reset(new std::vector); #ifdef LOG_NORMAL #endif // LOG @@ -2361,8 +2439,9 @@ Twpp::Result HuagaoDs::imageFileXferGet(const Twpp::Identity& origin) FILE* pfile = fopen(filename.c_str(), "wb"); if (pfile) { - if (bmpData.size() > 0) { - fwrite(bmpData.data(), 1, bmpData.size(), pfile); + if (bmpData->size() > 0) { + fwrite(bmpData->data(), 1, bmpData->size(), pfile); + bmpData.reset(new std::vector); fclose(pfile); return Result(ReturnCode::XferDone, ConditionCode::Success); } @@ -2380,7 +2459,7 @@ Twpp::Result HuagaoDs::imageFileXferGet(const Twpp::Identity& origin) decodetype = cv::IMREAD_GRAYSCALE; - cv::Mat ims = cv::imdecode(bmpData, decodetype); + cv::Mat ims = cv::imdecode(*bmpData.get(), decodetype); if (m_compression == Compression::Group4&& m_fileXfer.format()==ImageFileFormat::Tiff) { @@ -2396,6 +2475,8 @@ Twpp::Result HuagaoDs::imageFileXferGet(const Twpp::Identity& origin) compression_params.push_back(m_jpegQuality); cv::imwrite(filename, ims, compression_params); } + bmpData.reset(new std::vector); + ims.release(); return Result(ReturnCode::XferDone, ConditionCode::Success); } default: @@ -2480,7 +2561,7 @@ void HuagaoDs::onDeviceEvent(int eventID) } const BITMAPINFOHEADER* HuagaoDs::header() const noexcept { - return reinterpret_cast(bmpData.data() + sizeof(BITMAPFILEHEADER)); + return reinterpret_cast(bmpData->data() + sizeof(BITMAPFILEHEADER)); } UInt32 HuagaoDs::bytesPerLine() const noexcept { @@ -2489,15 +2570,15 @@ UInt32 HuagaoDs::bytesPerLine() const noexcept { } UInt32 HuagaoDs::bmpSize() const noexcept { - return static_cast(bmpData.size()) - sizeof(BITMAPFILEHEADER); + return static_cast(bmpData->size()) - sizeof(BITMAPFILEHEADER); } const char* HuagaoDs::bmpBegin() const noexcept { - return (const char*)bmpData.cbegin()._Ptr + sizeof(BITMAPFILEHEADER); + return (const char*)bmpData->cbegin()._Ptr + sizeof(BITMAPFILEHEADER); } const char* HuagaoDs::bmpEnd() const noexcept { - return (const char*)bmpData.cend()._Ptr; + return (const char*)bmpData->cend()._Ptr; } void HuagaoDs::updataGscanCap() @@ -2522,7 +2603,11 @@ Twpp::Result HuagaoDs::startScan() //FileTools::write_log("D:\\1.txt", "RESET TWAIN TRANSFERED IMAGE COUNT"); if (!scanner->IsConnected()) { +#ifdef LANXUM + scanner->open(0x31c9, 0x8200); +#else scanner->open(0x064B, 0x7823); +#endif if (!scanner->IsConnected()) return checkDeviceOnline(); } @@ -2552,14 +2637,15 @@ Twpp::Result HuagaoDs::startScan() guiIndicator->ShowWindow(SW_SHOWNORMAL); } scanner->Scanner_StartScan(m_scanparam->scannum); - if (bmpData.size() > 0) - bmpData.clear(); - + if (bmpData->size() > 0) + { + bmpData.reset(new std::vector); + } if (guiTwain.get()) { ((CTwainUI*)(guiTwain.get()))->EnableID_OKorID_Cancel(false); } - int retCode = scanner->aquire_bmpdata(bmpData); + int retCode = scanner->aquire_bmpdata(*bmpData.get()); if (retCode != 0) { scanner->Set_ErrorCode(0); if (guiIndicator) @@ -2571,6 +2657,9 @@ Twpp::Result HuagaoDs::startScan() //MessageBox(guiTwain ? guiTwain->m_hWnd : NULL, noticeMsgMap[retCode], _T("ʾ"), MB_SYSTEMMODAL | MB_OK | MB_ICONINFORMATION); CString str; str.Format(_T("%d"), retCode); + m_pendingXfers = 0; + m_memXferYOff = 0; + m_haveError = true; ShellExecute(guiTwain ? guiTwain->m_hWnd : NULL, TEXT("open"), GetHidedlgPath(), str, NULL, SW_HIDE); #ifndef G200 scanner->clear_hwerror(); @@ -2586,7 +2675,8 @@ Twpp::Result HuagaoDs::startScan() return seqError(); } - if (bmpData.size() > 0) { + if (bmpData->size() > 0) { + m_haveError = false; return success(); } else { diff --git a/huagao/huagaods.hpp b/huagao/huagaods.hpp index 60cf82e5..ce4f9e14 100644 --- a/huagao/huagaods.hpp +++ b/huagao/huagaods.hpp @@ -90,6 +90,7 @@ private://method Twpp::UInt32 bmpSize() const noexcept; const char* bmpBegin() const noexcept; const char* bmpEnd() const noexcept; + void dogear_callback(int indexpaper); void updataGscanCap(); Twpp::Result capCommon(const Twpp::Identity& origin, Twpp::Msg msg, Twpp::Capability& data); @@ -112,10 +113,11 @@ private://field bool m_bCustomDsData = true; bool m_bFeederEnabled = true; bool m_bAutoFeed = true; + bool m_haveError = false; UINT16 m_iBitdepth; Twpp::ImageFileFormat m_capImageFileFormat = Twpp::ImageFileFormat::Bmp; std::queue devEvent; - std::vector bmpData; + std::unique_ptr < std::vector> bmpData; std::unique_ptr m_scanparam; HANDLE hMutex; diff --git a/huagao/huagaotwds.rc b/huagao/huagaotwds.rc index 1477b8326a6117ad137b1018443288e92a20565f..ee89077885fe664005209e272fa54ddd90e146af 100644 GIT binary patch delta 205 zcmeB~#q?k<(*_sk&3rDC_$L=ga!eLbQ=07J+%~z+ijC8f!JI*d!HmIpvZ9%(;f$n9 zod+_!bCrN%o(wJw&J6KDGM^!x!IdGAp$N!MWhepSWFVOd6wjNy(a9fV4!0qL5rZL6 zmkEQ#577kZ~_|P1T-v!!I#02A%MYX^2Y}0$&VV0By+$9=L6+)fQIKW oR4|k>ueEGPE|TW!;v=f{F diff --git a/huagao/logo_lanxum_3.bmp b/huagao/logo_lanxum_3.bmp new file mode 100644 index 0000000000000000000000000000000000000000..377533bf1fc448aeb85af13797ce88c78ec70f94 GIT binary patch literal 91446 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 GXMO-kD03|U delta 188 zcmbOevnYH+9^+;M<}k*|S}anN7qB=@wquo>#A-Kr7OT?a1Xiob-&o})Hwdsy-UDO@ zvB^!Iz|1vSj?HND8a9Q=1#Gh>7cpy0Hexpc(n^~<*b`VMuh6vGe2ixi(_{x;mdOcP zHj{n$uT0*d<*=DWzu#l-3dTT#K7!hx?uow13dfy diff --git a/huagao/stdafx.h b/huagao/stdafx.h index 587296b4feedbbabdfe6acbe52ebc79481c805db..e1a39a9d309438ec933f417790be9a2c732486be 100644 GIT binary patch delta 600 zcmeCNIpDov8;77Vg8>loGH`*hK7;<`tz6oZcX07>`!F~%_%TE& z<~LkyY?HlM1SW3~SDL(y zOJH)IfWYJf;(U_@Bzz`+krbMIK~Q1x18FwRRE8XeOolWD1%?!cR3M$nkO!nwfP4)G zB$qH~PX5m|5yc4$xkFL-|G7;kD+qH;-Xf+lIf17LMXp{{eDWD#lgS#qhZK=b4Q6l# z`&J)lS0d2n3WidK+{yfW2hnuPPyWT%7wp8~%HYZ11;l;~?m!nJo1_3V$)CZOApjU| zAwYFOKzR`D%-{i3?GIGz57ZM06a}f%W6%MLgfO^F{>Udgxj=$z@<0A*BI3bo{7zTN zCT!?m*gd`4D!m~|KYg;7_!S+H1XEmj?txsZ;IwGgy!X8p4BvwloGH`9?<}_rSY{qRi`30BKWI67<$z6;BlW%ZHZJxv}#5Vba zxW?oS@_dtPg)&wE DG}$E=