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 1477b832..ee890778 100644 Binary files a/huagao/huagaotwds.rc and b/huagao/huagaotwds.rc differ diff --git a/huagao/logo_lanxum_3.bmp b/huagao/logo_lanxum_3.bmp new file mode 100644 index 00000000..377533bf Binary files /dev/null and b/huagao/logo_lanxum_3.bmp differ diff --git a/huagao/resource.h b/huagao/resource.h index 3eac4999..d5dde030 100644 Binary files a/huagao/resource.h and b/huagao/resource.h differ diff --git a/huagao/stdafx.h b/huagao/stdafx.h index 587296b4..e1a39a9d 100644 Binary files a/huagao/stdafx.h and b/huagao/stdafx.h differ