diff --git a/changelog.txt b/changelog.txt index 3760f235..cc30127f 100644 --- a/changelog.txt +++ b/changelog.txt @@ -19,3 +19,13 @@ 5.根据arm固件进行兼容,以A1209为分界线,根据版本显示连续扫描 6.屏蔽对折前旋转,奥鸽要求 7.修复首选项保存时亮度读取异常问题 + 8.修复scsanner reset时判断条件错误问题 + 9.针对usb连接异常屏蔽显示扫描纸张速度等 + 10.修复安卓首张异常时的版本兼容问题 + 11.修复单面扫描不出图问题 + 12.更新穿孔算法 + 13.修复非3399设备尺寸检测索引错误问题 + 14.添加除底色功能 + 15.修复折角 尺寸取图超时问题 + 16.修复安卓机器usb连接断开卡死问题 + diff --git a/huagao/CAboutDlg.cpp b/huagao/CAboutDlg.cpp index 0141d146..069b63cf 100644 --- a/huagao/CAboutDlg.cpp +++ b/huagao/CAboutDlg.cpp @@ -11,10 +11,11 @@ IMPLEMENT_DYNAMIC(CAboutDlg, CDialogEx) -CAboutDlg::CAboutDlg(std::string hardwareversion, std::string serialnum,CWnd* pParent /*=nullptr*/) +CAboutDlg::CAboutDlg(std::string hardwareversion, std::string serialnum,std::string macadder,CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_ABOUT, pParent) ,m_hardwareversion(hardwareversion) ,m_serialnum(serialnum) + ,m_macadder(macadder) { } @@ -44,10 +45,11 @@ BOOL CAboutDlg::OnInitDialog() // TODO: 在此添加额外的初始化 CString hardwareversion(m_hardwareversion.c_str()); CString serialnum(m_serialnum.c_str()); + CString macadder(m_macadder.c_str()); SetDlgItemText(IDC_LBSCANNERNAMEVALUE, SCANNERNAME); SetDlgItemText(IDC_LBHARDWAREVALUE, hardwareversion); SetDlgItemText(IDC_LBSERIALNUMVALUE, serialnum); - + SetDlgItemText(IDC_LBTOTALSCANVALU, macadder); SetDlgItemText(IDC_LBDERIVERVERSON, HG_VERSION_INFO); SetDlgItemText(IDC_LBCOMPANY, LIMIT_INFO); CStatic* pStatic = (CStatic*)GetDlgItem(IDC_PICABOUTHUAGO); @@ -59,10 +61,12 @@ BOOL CAboutDlg::OnInitDialog() HBITMAP hBitmap = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP2)); #elif defined AUGE HBITMAP hBitmap = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP4)); +#elif defined MAKERIGHTWAY + HBITMAP hBitmap = ::LoadBitmap(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDB_BITMAP5)); #endif pStatic->ModifyStyle(0xF, SS_BITMAP | SS_CENTERIMAGE); pStatic->SetBitmap(hBitmap); -#if defined MAKEHUAGAO || defined LANXUM || defined HANVON || defined AUGE +#if defined MAKEHUAGAO || defined LANXUM || defined HANVON || defined AUGE ||defined MAKERIGHTWAY GetDlgItem(IDC_PICABOUTHUAGO)->ShowWindow(TRUE); #else GetDlgItem(IDC_PICABOUTHUAGO)->ShowWindow(FALSE); diff --git a/huagao/CAboutDlg.h b/huagao/CAboutDlg.h index 41594548..4c3eac5c 100644 --- a/huagao/CAboutDlg.h +++ b/huagao/CAboutDlg.h @@ -8,7 +8,7 @@ class CAboutDlg : public CDialogEx DECLARE_DYNAMIC(CAboutDlg) public: - CAboutDlg(std::string hardwareversion,std::string serialnum, CWnd* pParent = nullptr); // 标准构造函数 + CAboutDlg(std::string hardwareversion,std::string serialnum,std::string macadder, CWnd* pParent = nullptr); // 标准构造函数 virtual ~CAboutDlg(); // 对话框数据 @@ -26,4 +26,5 @@ public: private: std::string m_hardwareversion; std::string m_serialnum; + std::string m_macadder; }; diff --git a/huagao/CBasicPage.cpp b/huagao/CBasicPage.cpp index c2381540..59d88c0d 100644 --- a/huagao/CBasicPage.cpp +++ b/huagao/CBasicPage.cpp @@ -195,7 +195,7 @@ END_MESSAGE_MAP() void CBasicPage::OnBnClickedBtnabout() { - CAboutDlg dlg(m_hdVersion, m_serialNum,this); + CAboutDlg dlg(m_hdVersion, m_serialNum,m_macadder,this); dlg.DoModal(); } @@ -261,10 +261,11 @@ void CBasicPage::OnClickedBtndiscardsetting() discardblank_percent = settingdlg.discardblank_percent; } -void CBasicPage::SetScannerInfo(std::string hdVersion, std::string serialNum) +void CBasicPage::SetScannerInfo(std::string hdVersion, std::string serialNum,std::string macadder) { m_hdVersion = hdVersion; m_serialNum = serialNum; + m_macadder = macadder; } void CBasicPage::updateCmbDuplex(BOOL insert) diff --git a/huagao/CBasicPage.h b/huagao/CBasicPage.h index d599f177..bb9263ea 100644 --- a/huagao/CBasicPage.h +++ b/huagao/CBasicPage.h @@ -48,10 +48,11 @@ protected: public: BOOL m_bUV; afx_msg void OnClickedBtndiscardsetting(); - void SetScannerInfo(std::string hdVersion, std::string serialNum); + void SetScannerInfo(std::string hdVersion, std::string serialNum,std::string macadder); private: std::string m_hdVersion; std::string m_serialNum; + std::string m_macadder; public: afx_msg void OnCbnSelchangeCblowpowermode(); afx_msg void OnNMReleasedcaptureSliderdpi(NMHDR* pNMHDR, LRESULT* pResult); diff --git a/huagao/CImageProcPage.cpp b/huagao/CImageProcPage.cpp index 9a9cbde3..8abe18ce 100644 --- a/huagao/CImageProcPage.cpp +++ b/huagao/CImageProcPage.cpp @@ -66,10 +66,15 @@ void CImageProcPage::ImageProcPageUpdate(int val,int twss, int cmduplexsel,bool ((CButton*)GetDlgItem(IDC_ADVANCEDSET))->EnableWindow(false); } if (val == 0) + { GetDlgItem(IDC_CKHSVCORRECT)->EnableWindow(TRUE); + GetDlgItem(IDC_CKBACKGROUNDSMOOTH)->EnableWindow(TRUE); + } else { GetDlgItem(IDC_CKHSVCORRECT)->EnableWindow(FALSE); ((CButton*)GetDlgItem(IDC_CKHSVCORRECT))->SetCheck(FALSE); + GetDlgItem(IDC_CKBACKGROUNDSMOOTH)->EnableWindow(FALSE); + ((CButton*)GetDlgItem(IDC_CKBACKGROUNDSMOOTH))->SetCheck(FALSE); } if (0 == val||val==3)//彩色 { @@ -83,6 +88,7 @@ void CImageProcPage::ImageProcPageUpdate(int val,int twss, int cmduplexsel,bool m_temp->EnableWindow(TRUE); t_chMultiOutput->SetCheck(FALSE); t_chMultiOutput->EnableWindow(FALSE); + GetDlgItem(IDC_CKBACKGROUNDSMOOTH)->EnableWindow(FALSE); } if (val == 2) { @@ -127,8 +133,11 @@ void CImageProcPage::DoDataExchange(CDataExchange* pDX) DDX_Control(pDX, IDC_EDIT_HOLE, m_edit_hole); DDX_Control(pDX, IDC_EDITDETACHNOISE, m_edit_detachnoise); DDX_Control(pDX, IDC_SLIDERDETACHNOISE, m_slider_detachnoise); + DDX_Control(pDX, IDC_SLIDERFADEBACKRANGE, m_slider_faderange); + DDX_Control(pDX, IDC_EDITFADEBACKRANGE, m_edit_faderange); DDX_Control(pDX, IDC_CMBFILTER, m_cmBoxFilter); DDX_Control(pDX, IDC_CMBSHARPEN, m_cmBoxSharpen); + DDX_Check(pDX, IDC_CKBACKGROUNDSMOOTH, m_ckbfadeback); DDX_Check(pDX, IDC_CKFILLBLACKRECT, m_ckbFillBlack); DDX_Check(pDX, IDC_CKAUTODESKREW, m_ckbAutoDeskrew); DDX_Check(pDX, IDC_CKMULTIOUTPUT, m_ckbMultioutput); @@ -144,6 +153,10 @@ BOOL CImageProcPage::OnInitDialog() m_edit_hole.SetParams(0.01, 0.50, 10, _T("%0.2f"),20); m_edit_hole.SetValue(0.10); + m_edit_faderange.SetSlideLink(this, IDC_SLIDERFADEBACKRANGE); + m_edit_faderange.SetParams(1, 128, 1); + m_edit_faderange.SetValue(40); + m_edit_detachnoise.SetSlideLink(this, IDC_SLIDERDETACHNOISE); m_edit_detachnoise.SetParams(10, 50, 10); m_edit_detachnoise.SetValue(detachnoise); @@ -169,6 +182,7 @@ BEGIN_MESSAGE_MAP(CImageProcPage, CTabPageSSL) ON_BN_CLICKED(IDC_CKFILLBLACKRECT, &CImageProcPage::OnBnClickedCkfillblackrect) ON_BN_CLICKED(IDC_CKAUTODESKREW, &CImageProcPage::OnBnClickedCkautodeskrew) ON_BN_CLICKED(IDC_CHECKDETACHNOISE, &CImageProcPage::OnBnClickedCheckdetachnoise) + ON_BN_CLICKED(IDC_CKBACKGROUNDSMOOTH, &CImageProcPage::OnBnClickedCkbackgroundsmooth) END_MESSAGE_MAP() void CImageProcPage::EnableOutHoleCheckChanged(BOOL enable) @@ -282,3 +296,13 @@ void CImageProcPage::OnBnClickedCheckdetachnoise() m_edit_detachnoise.EnableWindow(m_ckbDetachNoise); m_slider_detachnoise.EnableWindow(m_ckbDetachNoise); } + + +void CImageProcPage::OnBnClickedCkbackgroundsmooth() +{ + // TODO: 在此添加控件通知处理程序代码 + UpdateData(); + m_ckbfadeback = m_ckbfadeback && (!is_bw); + GetDlgItem(IDC_SLIDERFADEBACKRANGE)->EnableWindow(m_ckbfadeback); + GetDlgItem(IDC_EDITFADEBACKRANGE)->EnableWindow(m_ckbfadeback); +} diff --git a/huagao/CImageProcPage.h b/huagao/CImageProcPage.h index c0f9c6fa..8e7446bf 100644 --- a/huagao/CImageProcPage.h +++ b/huagao/CImageProcPage.h @@ -19,8 +19,11 @@ public: CSmartEdit m_edit_hole; CLinkSlider m_slider_detachnoise; CSmartEdit m_edit_detachnoise; + CLinkSlider m_slider_faderange; + CSmartEdit m_edit_faderange; CComboBox m_cmBoxFilter; CComboBox m_cmBoxSharpen; + BOOL m_ckbfadeback; BOOL m_ckbFillBlack; BOOL m_ckbAutoDeskrew; BOOL m_ckbMultioutput; @@ -61,4 +64,5 @@ public: afx_msg void OnBnClickedCkfillblackrect(); afx_msg void OnBnClickedCkautodeskrew(); afx_msg void OnBnClickedCheckdetachnoise(); + afx_msg void OnBnClickedCkbackgroundsmooth(); }; diff --git a/huagao/CTwainUI.cpp b/huagao/CTwainUI.cpp index 984c54d0..d2433687 100644 --- a/huagao/CTwainUI.cpp +++ b/huagao/CTwainUI.cpp @@ -17,7 +17,7 @@ IMPLEMENT_DYNAMIC(CTwainUI, CDialogEx) -CTwainUI::CTwainUI(TwGlue glue, GScanCap caps, std::string confirmtitle, std::string hardwareversion, std::string serialnum, std::uint32_t mbversion ,CWnd* pParent /*=nullptr*/) +CTwainUI::CTwainUI(TwGlue glue, GScanCap caps, std::string confirmtitle, std::string hardwareversion, std::string serialnum,std::string macadder, std::uint32_t mbversion ,CWnd* pParent /*=nullptr*/) : CDialogEx(IDD_TWAINUI, pParent) , m_tabCtrl(new CTabCtrlSSL()) , m_pageBrightness(new CBrightnessPage) @@ -30,14 +30,7 @@ CTwainUI::CTwainUI(TwGlue glue, GScanCap caps, std::string confirmtitle, std::st m_hardwareVersion = hardwareversion; m_serialnum = serialnum; m_mbversion = mbversion; - //memset(settings.get(), 0, sizeof(GScanCap)); - /*m_pageImageProc->noise = caps.noise; - m_pageImageProc->is_convex = caps.is_convex; - m_pageImageProc->threshold = caps.AutoCrop_threshold; - m_pageImageProc->indent = caps.indent; - m_pageImageProc->detachnoise = caps.detachnoise.detachnoise; - m_pageImageProc->is_detachnoise = caps.detachnoise.is_detachnoise;*/ - + m_macadder = macadder; } CTwainUI::~CTwainUI() @@ -74,7 +67,7 @@ BOOL CTwainUI::OnInitDialog() m_pageBasic.reset(new CBasicPage(dataChangeFunction)); m_pageBasic->Create(IDD_PAGEBASIC, this); m_pageBasic->discardblank_percent = settings->discardblank_percent; - m_pageBasic->SetScannerInfo(m_hardwareVersion, m_serialnum); + m_pageBasic->SetScannerInfo(m_hardwareVersion, m_serialnum, m_macadder); m_tabCtrl->AddSSLPage(_T("基本"), nPageID++, m_pageBasic.get()); m_pageBrightness->Create(IDD_PAGEBRIGHTNESS, this); m_tabCtrl->AddSSLPage(_T("亮度"), nPageID++, m_pageBrightness.get()); @@ -223,11 +216,19 @@ void CTwainUI::UpdateUI() m_pageImageProc->m_edit_hole.SetValue(settings->fillhole.fillholeratio/ 100.0);//穿孔搜索范围比例系数 m_pageImageProc->m_edit_hole.EnableWindow(settings->fillhole.is_fillhole == TRUE ? TRUE : FALSE); m_pageImageProc->GetDlgItem(IDC_SLDOUTHOLE)->EnableWindow(m_pageImageProc->m_ckbRemoveHole); + m_pageImageProc->m_ckbfadeback = settings->fadeback; + ((CButton*)m_pageImageProc->GetDlgItem(IDC_CKBACKGROUNDSMOOTH))->SetCheck(m_pageImageProc->m_ckbfadeback); + ((CButton*)m_pageImageProc->GetDlgItem(IDC_CKBACKGROUNDSMOOTH))->EnableWindow(settings->pixtype == 2); + m_pageImageProc->m_edit_faderange.SetValue(settings->fadeback_range); + m_pageImageProc->m_slider_faderange.EnableWindow(settings->fadeback); + m_pageImageProc->m_edit_faderange.EnableWindow(settings->fadeback); + m_pageImageProc->m_ckbDetachNoise = settings->detachnoise.is_detachnoise == TRUE ? TRUE : FALSE;//黑白降噪是否启用 ((CButton*)m_pageImageProc->GetDlgItem(IDC_CHECKDETACHNOISE))->SetCheck(m_pageImageProc->m_ckbDetachNoise); ((CButton*)m_pageImageProc->GetDlgItem(IDC_CHECKDETACHNOISE))->EnableWindow(settings->pixtype != 2); m_pageImageProc->m_edit_detachnoise.SetValue(settings->detachnoise.detachnoise); m_pageImageProc->m_slider_detachnoise.EnableWindow(settings->detachnoise.is_detachnoise == TRUE ? TRUE : FALSE); + m_pageImageProc->m_edit_detachnoise.EnableWindow(settings->detachnoise.is_detachnoise == TRUE ? TRUE : FALSE); if (settings->pixtype == 2) m_pageImageProc->m_ckbMultioutput = settings->multi_output_red == TRUE ? TRUE : FALSE;//多流除红 else @@ -572,6 +573,8 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs) settings->hardwarecaps.capturepixtype = TWPT_RGB; settings->detachnoise.is_detachnoise = m_pageImageProc->m_ckbDetachNoise; settings->detachnoise.detachnoise = m_pageImageProc->m_slider_detachnoise.m_iPosition; + settings->fadeback = m_pageImageProc->m_ckbfadeback; + settings->fadeback_range = m_pageImageProc->m_slider_faderange.m_iPosition; settings->fillhole.is_fillhole = configItem->EnOutHole; settings->fillhole.fillholeratio = configItem->OutHoleRatio; settings->multi_output_red = configItem->EnMultiOutPutR; diff --git a/huagao/CTwainUI.h b/huagao/CTwainUI.h index 0300680f..5462780b 100644 --- a/huagao/CTwainUI.h +++ b/huagao/CTwainUI.h @@ -165,7 +165,7 @@ class CTwainUI : public CDialogEx DECLARE_DYNAMIC(CTwainUI) public: - CTwainUI(TwGlue glue,GScanCap caps,std::string confirmtitle,std::string hardwareversion,std::string serialnum,std::uint32_t mbversion ,CWnd* pParent = nullptr); // 标准构造函数 + CTwainUI(TwGlue glue,GScanCap caps,std::string confirmtitle,std::string hardwareversion,std::string serialnum, std::string macadder,std::uint32_t mbversion ,CWnd* pParent = nullptr); // 标准构造函数 virtual ~CTwainUI(); void UpdateUI(); @@ -185,6 +185,7 @@ public: public: std::string m_hardwareVersion; std::string m_serialnum; + std::string m_macadder; std::uint32_t m_mbversion; protected: diff --git a/huagao/Device/GScan.h b/huagao/Device/GScan.h index a1665cd3..ee982899 100644 --- a/huagao/Device/GScan.h +++ b/huagao/Device/GScan.h @@ -107,8 +107,8 @@ static map msgs = { {UsbSupported::NO_FEED,"ֽ!ֽ!"}, {UsbSupported::FEED_IN_ERROR,"ֽʧ!ֽţ"}, {UsbSupported::PAPER_JAM,"ֽ!"}, - {UsbSupported::DETECT_DOUBLE_FEED,"˫ţ˶ɨԾ"}, - {UsbSupported::DETECT_STAPLE,"⵽!"}, + {UsbSupported::DETECT_DOUBLE_FEED,"˫ţ˶ɨ"}, + {UsbSupported::DETECT_STAPLE,"⵽鶤!"}, {UsbSupported::PAPER_SKEW,"ֽб!ֽ!"}, {UsbSupported::COUNT_MODE,"ģʽ˳ģʽ!"}, {UsbSupported::HARDWARE_ERROR,"Ӳ쳣!ɨ!"}, @@ -234,6 +234,7 @@ public: virtual BOOL IsConnected() = 0; virtual std::string GetFWVersion() = 0; virtual std::string GetSerialNum() = 0; + virtual std::string GetMacAdder() = 0; virtual std::uint32_t GetMotorFPGA() = 0; virtual std::uint32_t GetScanFPGA() = 0; virtual bool is_scan() = 0; diff --git a/huagao/Device/GScanO1003399.cpp b/huagao/Device/GScanO1003399.cpp index dc4dff03..db423ae0 100644 --- a/huagao/Device/GScanO1003399.cpp +++ b/huagao/Device/GScanO1003399.cpp @@ -35,7 +35,7 @@ static void scanner_cmd(std::shared_ptr& usb, int cmd) -GScanO1003399::GScanO1003399() +GScanO1003399::GScanO1003399():preProcImgindex(0) { im_data.reset(new std::vector()); //open(0x3072, 0x139); @@ -189,6 +189,22 @@ std::string GScanO1003399::GetFWVersion() return fw; } +std::string GScanO1003399::GetMacAdder() +{ + std::string mac; + auto fwver = GetFWVersion(); + if (fwver[5] > 'A' && atoi(fwver.substr(6, 4).c_str()) >= 111) { + if (m_usb.get() && m_usb->is_connected()) + { + scanner_write_reg(m_usb, SR_GET_MACADDR, 0); + mac.resize(17); + read_data(&mac[0], mac.length(), 200); + } + } + else + mac = "The firmware version does not support reading"; + return mac; +} std::string GScanO1003399::GetSerialNum() { std::string sn; @@ -259,7 +275,7 @@ void GScanO1003399::config_params(GScanCap& param) cfg.g200params.screw_detect_level = (unsigned int)cfg.g200params.screw_detect_enable ? secrewMaps[param.hardwarecaps.skrewdetectlevel] : 0; cfg.g200params.is_autopaper = param.hardwarecaps.is_autopaper; cfg.g200params.enable_sizecheck = param.en_sizecheck == 1 ? 1 : 0; - cfg.g200params.unused_one = cfg.g200params.sizeerror_errorratio = 0; + cfg.g200params.is_textcorrect = cfg.g200params.unused_one = cfg.g200params.sizeerror_errorratio = 0; #else @@ -328,26 +344,9 @@ void GScanO1003399::config_params(GScanCap& param) param39.threshold = param.threshold; param39.multiOutput = MultiOutput::Unused; param39.normalCrop = param.normalCrop; + param39.fadeback = param.fadeback; + param39.fadebackrange = param.fadeback_range; m_usb->write_bulk(¶m39, sizeof(param39)); - if (param.is_autotext) - { - TCHAR szIniFile[MAX_PATH] = { 0 }; - SHGetSpecialFolderPath(NULL, szIniFile, CSIDL_WINDOWS, TRUE); -#ifdef LANXUM - _tcscat(szIniFile, _T("\\twain_32\\LANXUMSCAN\\tessdata\\osd.traineddata")); -#elif defined AUGE - _tcscat(szIniFile, _T("\\twain_32\\AuGeScan\\tessdata\\osd.traineddata")); -#elif defined HANVON - _tcscat(szIniFile, _T("\\twain_32\\HanvonScan\\tessdata\\osd.traineddata")); -#else - _tcscat(szIniFile, _T("\\twain_32\\HuaGoScan\\tessdata\\osd.traineddata")); -#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); - m_autotext.reset(new CImageApplyRotation(CImageApplyRotation::RotationType::AutoTextOrientation, false, param.resolution_dst, chRtn)); - delete[] chRtn; - } } void GScanO1003399::Scanner_StartScan(UINT16 count) @@ -363,6 +362,7 @@ void GScanO1003399::Scanner_StartScan(UINT16 count) else is_kernelsnap_211209 = false; error_index = autopaperstop = 0; + is_back = false; roller_num = this->count(); scanflag = true; while (m_paths.Size() > 0) @@ -381,13 +381,6 @@ void GScanO1003399::Scanner_StartScan(UINT16 count) scanflag = false; return; } - if (scan_mode()) - { - devState = DEV_WRONG; - Set_ErrorCode(COUNT_MODE); - scanflag = false; - return; - } //if (!Get_Scanner_PaperOn()) //{ // devState = DEV_WRONG; @@ -395,6 +388,13 @@ void GScanO1003399::Scanner_StartScan(UINT16 count) // scanflag = false; // return; //} + if (scan_mode()) + { + devState = DEV_WRONG; + Set_ErrorCode(COUNT_MODE); + scanflag = false; + return; + } start(); bool procmode = (m_param.resolution_dst > 200.0f || m_param.papertype == 52 || m_param.papertype == 54 || m_param.papertype == 131); @@ -403,6 +403,7 @@ void GScanO1003399::Scanner_StartScan(UINT16 count) b_imgprothread = false; m_imgprocthread->join(); } + preProcImgindex = 0; m_imgprocthread.reset(new thread(&GScanO1003399::proc, this, procmode)); } @@ -493,7 +494,7 @@ void GScanO1003399::usb_run() switch (info.From) { case IMG: - if (is_runing()) + if (is_runing() && (im_dev_count()>0)) im_rx(); break; case MtBoard: @@ -712,6 +713,7 @@ int GScanO1003399::im_dev_count() static int num = 0; void GScanO1003399::imgproce(std::shared_ptr>& buff) { + preProcImgindex++; auto& buffs= G400Decode(buff).getImageBuffs(); vector mats; StopWatch sw; @@ -743,7 +745,27 @@ void GScanO1003399::imgproce(std::shared_ptr>& buff) buffs.clear(); if (m_param.is_autotext) { - m_autotext->apply(mats, m_param.is_duplex); + //m_autotext->apply(mats, m_param.is_duplex); + + TCHAR szIniFile[MAX_PATH] = { 0 }; + SHGetSpecialFolderPath(NULL, szIniFile, CSIDL_WINDOWS, TRUE); +#ifdef LANXUM + _tcscat(szIniFile, _T("\\twain_32\\LANXUMSCAN\\tessdata\\osd.traineddata")); +#elif defined AUGE + _tcscat(szIniFile, _T("\\twain_32\\AuGeScan\\tessdata\\osd.traineddata")); +#elif defined HANVON + _tcscat(szIniFile, _T("\\twain_32\\HanvonScan\\tessdata\\osd.traineddata")); +#elif defined MAKERIGHTWAY + _tcscat(szIniFile, _T("\\twain_32\\RIGHTWAYSCAN\\tessdata\\osd.traineddata")); +#else + _tcscat(szIniFile, _T("\\twain_32\\HuaGoScan\\tessdata\\osd.traineddata")); +#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); + CImageApplyRotation autotext(CImageApplyRotation::RotationType::AutoTextOrientation, false, m_param.resolution_dst, chRtn); + autotext.apply(mats, m_param.is_duplex); + delete[] chRtn; } if (m_param.automaticcolor) { @@ -751,13 +773,27 @@ void GScanO1003399::imgproce(std::shared_ptr>& buff) } if (m_param.is_split) { + if (!is_back) + { + CImageApplyRotation autotext(CImageApplyRotation::RotationType::Rotate_90_clockwise, false, m_param.resolution_dst, NULL); + autotext.apply(mats[0], false); + if (m_param.is_duplex) + is_back = true; + } + else if (is_back && m_param.is_duplex) + { + CImageApplyRotation autotext(CImageApplyRotation::RotationType::Rotate_90_anti_clockwise, false, m_param.resolution_dst, NULL); + autotext.apply(mats[0], true); + is_back = false; + } CImageApplySplit m_split; std::vector tmp; for (auto& var : mats) { if (!var.empty()) { - auto sptmp = m_split.apply(var); + int side = (preProcImgindex % 2) == 1 ? 0 : 1; + auto sptmp = m_split.apply(var, m_param.is_duplex? side:0); for (auto& matvar : sptmp) { if (!matvar.empty()) @@ -765,6 +801,8 @@ void GScanO1003399::imgproce(std::shared_ptr>& buff) } } } + if(is_back && tmp.size()>=2) + std::swap(tmp[0], tmp[1]); mats.swap(tmp); } for (int i = 0; i < mats.size(); i++) { @@ -797,6 +835,7 @@ void GScanO1003399::imgproce(std::shared_ptr>& buff) } } } + mats.clear(); } diff --git a/huagao/Device/GScanO1003399.h b/huagao/Device/GScanO1003399.h index 91fb0861..323e93e6 100644 --- a/huagao/Device/GScanO1003399.h +++ b/huagao/Device/GScanO1003399.h @@ -27,6 +27,7 @@ public: virtual BOOL IsConnected() override; virtual std::string GetFWVersion() override; virtual std::string GetSerialNum() override; + virtual std::string GetMacAdder() override; virtual std::uint32_t GetMotorFPGA() override; virtual std::uint32_t GetScanFPGA() override; virtual bool is_scan() override; @@ -73,6 +74,7 @@ private: private: volatile int devState; volatile int Error_Code; + volatile bool is_back; volatile bool scanflag; volatile bool keeplastimg; volatile bool autopaperstop; @@ -83,12 +85,13 @@ private: volatile bool b_usbthread; BlockingQueue>> imgs; BlockingQueue m_paths; - std::shared_ptr m_autotext; + //std::shared_ptr m_autotext; std::shared_ptr m_imgprocthread; std::shared_ptr m_usbthread; std::shared_ptr> im_data; BlockingQueue>> m_imagedata; std::atomic_int imagecount; + int preProcImgindex;//Ԥͼ void* huagods; deviceevent_callback dev_callback; }; diff --git a/huagao/Device/GScanO200.cpp b/huagao/Device/GScanO200.cpp index a3a8f786..a046fd50 100644 --- a/huagao/Device/GScanO200.cpp +++ b/huagao/Device/GScanO200.cpp @@ -245,11 +245,17 @@ int GScanO200::aquire_bmpdata(std::vector& bmpdata) } } + BOOL GScanO200::IsConnected() { return m_usb.get() && m_usb->is_connected(); } +std::string GScanO200::GetMacAdder() +{ + return "This device does not support reading"; +} + std::string GScanO200::GetFWVersion() { if (m_usb.get() && m_usb->is_connected()) { @@ -476,9 +482,8 @@ bool GScanO200::Get_IsImageQueueEmpty() void GScanO200::reset() { - while (!m_pImages->empty()) + if(!m_pImages->empty()) m_pImages->clear(); - } UINT32 GScanO200::get_ErrorCode() diff --git a/huagao/Device/GScanO200.h b/huagao/Device/GScanO200.h index 6ac6739f..89c5112c 100644 --- a/huagao/Device/GScanO200.h +++ b/huagao/Device/GScanO200.h @@ -15,6 +15,7 @@ public: virtual BOOL IsConnected() override; virtual std::string GetFWVersion() override; virtual std::string GetSerialNum() override; + virtual std::string GetMacAdder() override; virtual std::uint32_t GetMotorFPGA() override; virtual std::uint32_t GetScanFPGA() override; virtual bool is_scan() override; diff --git a/huagao/Device/GScanO400.cpp b/huagao/Device/GScanO400.cpp index 3612b48e..d9a28dc8 100644 --- a/huagao/Device/GScanO400.cpp +++ b/huagao/Device/GScanO400.cpp @@ -574,6 +574,10 @@ void GScanO400::usbhotplug(bool isleft) } } +std::string GScanO400::GetMacAdder() +{ + return "The firmware version does not support reading"; +} void GScanO400::updateHVRatio() { if (!(m_usb.get() && m_usb->is_connected())) diff --git a/huagao/Device/GScanO400.h b/huagao/Device/GScanO400.h index a45d3f34..004a80ab 100644 --- a/huagao/Device/GScanO400.h +++ b/huagao/Device/GScanO400.h @@ -17,6 +17,7 @@ public: virtual std::string GetSerialNum() override; virtual std::uint32_t GetMotorFPGA() override; virtual std::uint32_t GetScanFPGA() override; + virtual std::string GetMacAdder()override; virtual bool is_scan() override; virtual BOOL Get_Scanner_PaperOn() override; virtual int Get_Roller_num() override; diff --git a/huagao/Device/GScanO400Android.cpp b/huagao/Device/GScanO400Android.cpp index 28b31ddd..2011b3ed 100644 --- a/huagao/Device/GScanO400Android.cpp +++ b/huagao/Device/GScanO400Android.cpp @@ -251,6 +251,10 @@ BOOL GScanO400Android::IsConnected() return m_usb.get() && m_usb->is_connected(); } +std::string GScanO400Android::GetMacAdder() { + return "̼汾ֶ֧ȡ"; +} + std::string GScanO400Android::GetFWVersion() { if (m_usb.get() && m_usb->is_connected()) { @@ -575,6 +579,7 @@ void GScanO400Android::usbhotplug(bool isleft) if (isleft) { devState = DEV_WRONG; Error_Code = USB_DISCONNECTED; + image_last = false; m_pImages->setscanflags(false); if (m_usb.get()) m_usb.reset(); @@ -606,6 +611,7 @@ void GScanO400Android::usbmain() devState = DEV_ISRUNNING; image_last = true; bool haveError = false; + bool is_first_error = true; try { StopWatch sw; @@ -628,6 +634,7 @@ void GScanO400Android::usbmain() switch (usbcb.u32_Data) { case HAVE_IMAGE: { + is_first_error = false; int totalNum = usbcb.u32_Count&0x3fffffff; if ((usbcb.u32_Count & 0xc0000000) == 0) { @@ -665,6 +672,8 @@ void GScanO400Android::usbmain() //m_pImages->setscanflags(false); //std::this_thread::sleep_for(std::chrono::milliseconds(500)); devState = haveError ? DevState::DEV_WRONG : DevState::DEV_STOP; + if (is_first_error) + image_last = false; break; } case COUNT_MODE: diff --git a/huagao/Device/GScanO400Android.h b/huagao/Device/GScanO400Android.h index c3972768..3db3b1bf 100644 --- a/huagao/Device/GScanO400Android.h +++ b/huagao/Device/GScanO400Android.h @@ -17,6 +17,7 @@ public: virtual std::string GetSerialNum() override; virtual std::uint32_t GetMotorFPGA() override; virtual std::uint32_t GetScanFPGA() override; + virtual std::string GetMacAdder() override; virtual bool is_scan() override; virtual BOOL Get_Scanner_PaperOn() override; virtual int Get_Roller_num() override; diff --git a/huagao/Device/IConfig.h b/huagao/Device/IConfig.h index b73e7214..4b1d8298 100644 --- a/huagao/Device/IConfig.h +++ b/huagao/Device/IConfig.h @@ -190,6 +190,19 @@ enum Scanner_Reg_Defs SR_GET_SCANN_NUM, SR_CLR_ROLLER_NUM, SR_GET_ROLLER_NUM, + SR_CLR_SCANN_NUM, + SR_GET_H_200_RATIO, + SR_SET_H_200_RATIO, + SR_GET_V_200_RATIO, + SR_SET_V_200_RATIO, + SR_GET_H_300_RATIO, + SR_SET_H_300_RATIO, + SR_GET_V_300_RATIO, + SR_SET_V_300_RATIO, + SR_GET_H_600_RATIO, + SR_SET_H_600_RATIO, + SR_GET_V_600_RATIO, + SR_SET_V_600_RATIO, SR_UPDATA_START = 0x100, SR_UPDATA_STAUTUS = 0x101, SR_UPDATA_MD5_RELUST = 0x102, @@ -292,7 +305,8 @@ typedef union HG_ScanConfig unsigned int screw_detect_level : 3;//ʮλ unsigned int iscorrect_mod : 1; unsigned int is_autopaper : 1; - unsigned int unused_one : 4; + unsigned int is_textcorrect : 1; + unsigned int unused_one : 3; unsigned int pc_correct : 1; unsigned int enable_sizecheck : 1; unsigned int enabledsp_cache : 1; diff --git a/huagao/Device/ImageMatQueue.cpp b/huagao/Device/ImageMatQueue.cpp index 31943185..bdb64529 100644 --- a/huagao/Device/ImageMatQueue.cpp +++ b/huagao/Device/ImageMatQueue.cpp @@ -139,9 +139,11 @@ bool ImageMatQueue::valid() void ImageMatQueue::clear() { - m_rawBuffs.Clear(); + if(m_rawBuffs.Size()>0) + m_rawBuffs.Clear(); clear_cachefiles(); - m_imagedata.Clear(); + if (m_imagedata.Size() > 0) + m_imagedata.Clear(); atm_orgin_image_remains = 0; } @@ -232,7 +234,9 @@ void ImageMatQueue::setparam(const GScanCap& param) m_iaList.push_back(shared_ptr(new CImageApplyResize(CImageApplyResize::ResizeType::DSIZE, cv::Size(fixedSize.cx, fixedSize.cy), 1.0, 1.0)));*/ } - + if (param.fadeback && param.pixtype == 2) { + m_iaList.push_back(shared_ptr(new CImageApplyFadeBackGroudColor(100,0,param.fadeback_range))); + } //filter 0 r 1 g 2 b 3 none enhance color 0 none 1 r 2 g 3 b if (param.filter != 3 || param.enhance_color) { int channel = 0; //filter none r g b enhance none r g b @@ -320,6 +324,8 @@ void ImageMatQueue::setparam(const GScanCap& param) _tcscat(szIniFile, _T("\\twain_32\\AuGeScan\\tessdata\\osd.traineddata")); #elif defined HANVON _tcscat(szIniFile, _T("\\twain_32\\HanvonScan\\tessdata\\osd.traineddata")); +#elif defined MAKERIGHTWAY + _tcscat(szIniFile, _T("\\twain_32\\RIGHTWAYSCAN\\tessdata\\osd.traineddata")); #else _tcscat(szIniFile, _T("\\twain_32\\HuaGoScan\\tessdata\\osd.traineddata")); #endif // @@ -492,6 +498,10 @@ void ImageMatQueue::proc() sw.reset(); if (!imgfront.empty() && !imgback.empty()) { + if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) { + cv::flip(imgback, imgback, 0); + cv::flip(imgback, imgback, 1); + } mats.push_back(scanParam.is_switchfrontback ? imgback : imgfront); mats.push_back(scanParam.is_switchfrontback ? imgfront : imgback); remove(info.path.c_str()); @@ -526,15 +536,16 @@ void ImageMatQueue::proc() { Mat front = mat(Rect(0, 0, mat.cols / 2, mat.rows-10));//避免图像尾部出现无效数据丢弃10行数据 Mat back = mat(Rect(mat.cols / 2, 0, mat.cols / 2, mat.rows-10));//避免图像尾部出现无效数据丢弃10行数据 + if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) { + cv::flip(front, front, 0); + cv::flip(front, front, 1); + } #ifdef UV mats.push_back(scanParam.is_switchfrontback ? front : back); mats.push_back(scanParam.is_switchfrontback ? back : front); #else - if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) { - cv::flip(front, front, 0); - cv::flip(front, front, 1); - } + mats.push_back(scanParam.is_switchfrontback ? front : back); mats.push_back(scanParam.is_switchfrontback ? back : front); #endif @@ -556,6 +567,10 @@ void ImageMatQueue::proc() { Mat front = matuv(Rect(0, 0, mat.cols / 2, mat.rows)); Mat back = matuv(Rect(mat.cols / 2, 0, mat.cols / 2, mat.rows)); + if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) { + cv::flip(front, front, 0); + cv::flip(front, front, 1); + } uvmats.push_back(scanParam.is_switchfrontback ? front : back); uvmats.push_back(scanParam.is_switchfrontback ? back : front); front.release(); @@ -605,7 +620,6 @@ void ImageMatQueue::proc() #endif if (!scanParam.is_duplex && mats.size()>1) { mats.pop_back(); - break; } if (scanParam.is_split) { @@ -668,17 +682,21 @@ void ImageMatQueue::proc() } void ImageMatQueue::splitimg(std::vector& mats) { + CImageApplyRotation autotext(CImageApplyRotation::RotationType::Rotate_90_clockwise, true, scanParam.resolution_dst, NULL); + autotext.apply(mats, true); CImageApplySplit m_split; std::vector tmp; - for (auto& var : mats){ - if (!var.empty()){ - auto sptmp = m_split.apply(var); + for (int i = 0; i < mats.size();i++) { + if (!mats[i].empty()){ + auto sptmp = m_split.apply(mats[i],i); for (auto& matvar : sptmp){ if (!matvar.empty()) tmp.push_back(matvar); } } } + if (tmp.size() >= 2) + std::swap(tmp[0], tmp[1]); mats.swap(tmp); } diff --git a/huagao/Device/PublicFunc.cpp b/huagao/Device/PublicFunc.cpp index c15f7e6c..ea3ca648 100644 --- a/huagao/Device/PublicFunc.cpp +++ b/huagao/Device/PublicFunc.cpp @@ -467,6 +467,8 @@ CString GetHidedlgPath() _tcscat(szIniFile, _T("\\twain_32\\HanvonScan\\hidedlg.exe")); #elif defined LANXUM _tcscat(szIniFile, _T("\\twain_32\\LANXUMSCAN\\hidedlg.exe")); +#elif defined MAKERIGHTWAY + _tcscat(szIniFile, _T("\\twain_32\\RIGHTWAYSCAN\\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 f7147f64..905b9275 100644 --- a/huagao/Device/PublicFunc.h +++ b/huagao/Device/PublicFunc.h @@ -65,6 +65,8 @@ const std::string OUTHOLE = "bOutHole"; const std::string OUTHOLERATIO = "iOutHoleRatio"; const std::string DETACHNOISE = "detachnoise"; const std::string DETACHNOISEVALUE = "detachnoisevalue"; +const std::string FADEBACK = "bfadeback"; +const std::string FADEBACKRANGE = "fadebackvalue"; const std::string HSVCORRECT = "bHsvCorrect"; //*/ int colorCorrection; /**< ɫУ>*/ int removeMorr; /**< ȥĦ>*/ - int errorExtention; /** < ɢ>*/ - int textureRemove; /** < >*/ - int splitImage; /** < ͼ>*/ + int errorExtention; /**< ɢ>*/ + int textureRemove; /**< >*/ + int splitImage; /**< ͼ>*/ CropRect cropRect; /**< Զ>*/ MultiOutput multiOutput; /**< >*/ bool normalCrop; /**< Զɫ>*/ uint32_t dogeardistabce; /**< ۽Ǽ۶㵽ʵ¾>*/ + bool fadeback; /**< ɫ>*/ + int fadebackrange; /**< ɫΧ>*/ uint32_t reserve[1024]; /**< Ԥ4096ֽЭչ*/ }; diff --git a/huagao/GscanJsonConfig.cpp b/huagao/GscanJsonConfig.cpp index 82acbf39..f131e3b7 100644 --- a/huagao/GscanJsonConfig.cpp +++ b/huagao/GscanJsonConfig.cpp @@ -124,6 +124,8 @@ void GscanJsonConfig::SaveGscanCapConfig(const GScanCap & gcap, const std::strin outJson["Config"].Add(OUTHOLERATIO, (int)(gcap.fillhole.fillholeratio)); outJson["Config"].Add(DETACHNOISE, (bool)(gcap.detachnoise.is_detachnoise), false); outJson["Config"].Add(DETACHNOISEVALUE, (int)(gcap.detachnoise.detachnoise)); + outJson["Config"].Add(FADEBACK, (bool)(gcap.fadeback), false); + outJson["Config"].Add(FADEBACKRANGE, (int)(gcap.fadeback_range)); outJson["Config"].Add(HSVCORRECT, (bool)(gcap.hsvcorrect),false); outJson["Config"].Add(ULTRADETECT, (bool)(gcap.hardwarecaps.en_doublefeed), false); @@ -175,6 +177,8 @@ void GscanJsonConfig::WriteJsonArrayToFile(std::vector cfgArray, const root["Config"].AddEmptySubArray(SWITCHFRONTBACK); root["Config"].AddEmptySubArray(DETACHNOISE); root["Config"].AddEmptySubArray(DETACHNOISEVALUE); + root["Config"].AddEmptySubArray(FADEBACK); + root["Config"].AddEmptySubArray(FADEBACKRANGE); /*< brightness setting*/ root["Config"].AddEmptySubArray(BRIGHTNESS); root["Config"].AddEmptySubArray(AUTOCONTRAST); @@ -248,6 +252,8 @@ void GscanJsonConfig::WriteJsonArrayToFile(std::vector cfgArray, const root["Config"][OUTHOLERATIO].Add((int)cfgArray[i].fillhole.fillholeratio); root["Config"][DETACHNOISE].Add(i, (bool)cfgArray[i].detachnoise.is_detachnoise); root["Config"][DETACHNOISEVALUE].Add((int)cfgArray[i].detachnoise.detachnoise); + root["Config"][FADEBACK].Add(i, (bool)cfgArray[i].fadeback); + root["Config"][FADEBACKRANGE].Add((int)cfgArray[i].fadeback_range); root["Config"][HSVCORRECT].Add(i, (bool)cfgArray[i].hsvcorrect); root["Config"][ULTRADETECT].Add(i, (bool)cfgArray[i].hardwarecaps.en_doublefeed); @@ -433,6 +439,11 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str root["Config"].Get(DETACHNOISE, itmDetachNoise); neb::CJsonObject itmDetachNoiseValue; root["Config"].Get(DETACHNOISEVALUE, itmDetachNoiseValue); + + neb::CJsonObject itmFadeBack; + root["Config"].Get(FADEBACK, itmFadeBack); + neb::CJsonObject itmFadeBackValue; + root["Config"].Get(FADEBACKRANGE, itmFadeBackValue); neb::CJsonObject itmHsvCorrect; root["Config"].Get(HSVCORRECT, itmHsvCorrect); @@ -523,8 +534,8 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str itmEnUV.Get(i, b_value); cfp.hardwarecaps.en_uv = b_value ? 1 : 0; #endif - itmBrtnes.Get(i, f_value); - cfp.brightness = f_value; + itmBrtnes.Get(i, i_value); + cfp.brightness = i_value; itmAutoCrnt.Get(i, b_value); cfp.is_autocontrast = b_value ? 1 : 0; itmContrast.Get(i, i_value); @@ -552,6 +563,10 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str cfp.detachnoise.is_detachnoise = b_value ? 1 : 0; itmDetachNoiseValue.Get(i, i_value); cfp.detachnoise.detachnoise = i_value; + itmFadeBack.Get(i, b_value); + cfp.fadeback = b_value ? 1 : 0; + itmFadeBackValue.Get(i, i_value); + cfp.fadeback_range = i_value; itmHsvCorrect.Get(i, b_value); cfp.hsvcorrect = b_value ? 1 : 0; @@ -671,6 +686,10 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str cfp.detachnoise.is_detachnoise = bvalue ? 1 : 0; root["Config"].Get(DETACHNOISEVALUE, index); cfp.detachnoise.detachnoise = index; + root["Config"].Get(FADEBACK, bvalue); + cfp.fadeback = bvalue ? 1 : 0; + root["Config"].Get(FADEBACKRANGE, index); + cfp.fadeback_range = index; root["Config"].Get(HSVCORRECT, bvalue); cfp.hsvcorrect = bvalue ? 1 : 0; root["Config"].Get(NOISE, index); @@ -762,6 +781,8 @@ json GscanJsonConfig::GscancapToJson(GScanCap& cap) #endif js[CONFIG][DETACHNOISE] = cap.detachnoise.is_detachnoise; js[CONFIG][DETACHNOISEVALUE] = cap.detachnoise.detachnoise; + js[CONFIG][FADEBACK] = cap.fadeback; + js[CONFIG][FADEBACKRANGE] = cap.fadeback_range; js[CONFIG][BRIGHTNESS] = cap.brightness; js[CONFIG][AUTOCONTRAST] = cap.is_autocontrast; js[CONFIG][CONTRAST] = cap.contrast; @@ -824,6 +845,9 @@ GScanCap GscanJsonConfig::JsonToGscancap(json& js) cap.normalCrop = json_cast(js[CONFIG][CROPMODEL]).to_bool(); cap.detachnoise.is_detachnoise = json_cast(js[CONFIG][DETACHNOISE]).to_int(); cap.detachnoise.detachnoise = json_cast(js[CONFIG][DETACHNOISEVALUE]).to_int(); + + cap.fadeback = json_cast(js[CONFIG][FADEBACK]).to_bool(); + cap.fadeback_range = json_cast(js[CONFIG][FADEBACKRANGE]).to_int(); cap.brightness = json_cast(js[CONFIG][BRIGHTNESS]).to_float(); cap.is_autocontrast = json_cast(js[CONFIG][AUTOCONTRAST]).to_int(); cap.contrast = json_cast(js[CONFIG][CONTRAST]).to_float(); @@ -881,6 +905,8 @@ json GscanJsonConfig::GetDefaultJson() "bUVmodel": false, "detachnoise": false , "detachnoisevalue": 30 , + "bfadeback": false , + "fadebackvalue": 40, "iBrightness": 0 , "bAutoContrast": false , "iContrast": 0 , @@ -935,6 +961,8 @@ json GscanJsonConfig::GetDefaultJson() "bSplit": false , "detachnoise": false , "detachnoisevalue": 30 , + "bfadeback": false , + "fadebackvalue": 40, "iBrightness": 0 , "bAutoContrast": false , "iContrast": 0 , diff --git a/huagao/ImageProcess/ImageApplyHeaders.h b/huagao/ImageProcess/ImageApplyHeaders.h index d27169ba..66e046a3 100644 --- a/huagao/ImageProcess/ImageApplyHeaders.h +++ b/huagao/ImageProcess/ImageApplyHeaders.h @@ -19,4 +19,5 @@ #include "ImageApplyColorRecognition.h" #include "ImageApplyUV.h" #include "ImageApplySplit.h" +#include "ImageApplyFadeBackGroundColor.h" #endif diff --git a/huagao/ImageProcess/ImageApplyOutHole.h b/huagao/ImageProcess/ImageApplyOutHole.h index 0b412861..ade2989a 100644 --- a/huagao/ImageProcess/ImageApplyOutHole.h +++ b/huagao/ImageProcess/ImageApplyOutHole.h @@ -20,7 +20,7 @@ #include "ImageApply.h" -class CImageApplyOutHole : public CImageApply +class CImageApplyOutHole : public CImageApply { public: @@ -72,4 +72,3 @@ private: }; #endif // !IMAGE_APPLY_OUT_HOLE_H - diff --git a/huagao/ImageProcess/ImageApplySplit.cpp b/huagao/ImageProcess/ImageApplySplit.cpp index 569471a1..76ce8de9 100644 --- a/huagao/ImageProcess/ImageApplySplit.cpp +++ b/huagao/ImageProcess/ImageApplySplit.cpp @@ -10,27 +10,31 @@ CImageApplySplit::~CImageApplySplit(void) } -std::vector CImageApplySplit::apply(cv::Mat& pDib) +std::vector CImageApplySplit::apply(cv::Mat& pDib,int side) { if (pDib.empty()) return std::vector(); std::vector retMats; int heigth = pDib.rows; int width = pDib.cols; + cv::Mat matF,matB,temp; if (heigth > width) { - cv::Mat matF = pDib(cv::Rect(0, 0, width, (int)(0.5 * heigth))); - cv::Mat matB = pDib(cv::Rect(0, (int)(0.5 * heigth), width, (int)(0.5 * heigth))); - retMats.push_back(matF); - retMats.push_back(matB); + matF = pDib(cv::Rect(0, 0, width, (int)(0.5 * heigth))); + matB = pDib(cv::Rect(0, (int)(0.5 * heigth), width, (int)(0.5 * heigth))); } else { - cv::Mat matF = pDib(cv::Rect(0, 0, (int)(width*0.5), heigth)); - cv::Mat matB = pDib(cv::Rect((int)(width*0.5), 0, (int)(width * 0.5), heigth)); - retMats.push_back(matF); - retMats.push_back(matB); + matF = pDib(cv::Rect(0, 0, (int)(width*0.5), heigth)); + matB = pDib(cv::Rect((int)(width*0.5), 0, (int)(width * 0.5), heigth)); } + retMats.push_back(matF); + retMats.push_back(matB); + //for (int i = 0; i < retMats.size(); i++) { + // cv::flip(retMats[i], retMats[i], 0); + // cv::flip(retMats[i], retMats[i], 1); + // + //} return retMats; } diff --git a/huagao/ImageProcess/ImageApplySplit.h b/huagao/ImageProcess/ImageApplySplit.h index 1607adb8..1061c377 100644 --- a/huagao/ImageProcess/ImageApplySplit.h +++ b/huagao/ImageProcess/ImageApplySplit.h @@ -22,7 +22,7 @@ public: ~CImageApplySplit(void); - std::vector apply(cv::Mat& pDib); + std::vector apply(cv::Mat& pDib,int side); }; #endif // !IMAGE_APPLY_SPLIT_H diff --git a/huagao/huagaods.cpp b/huagao/huagaods.cpp index 9e248849..c0e881a5 100644 --- a/huagao/huagaods.cpp +++ b/huagao/huagaods.cpp @@ -62,6 +62,8 @@ enum class CapTypeEx : unsigned short { TwEx_CropModel=0x8106, TwEx_DogEarDistance = 0x8107, TwEx_ImageSplit = 0x8108, + TwEx_IFadeBack = 0x8109, + TwEx_IFadeBackValue = 0x8110, }; enum class PaperSizeEx : unsigned short { @@ -99,6 +101,8 @@ static constexpr const Identity srcIdent( "AUGE", #elif defined LANXUM "LANXUM", +#elif defined MAKERIGHTWAY + "RIGHTWAY", #else // MAKEHUAGAO "ZHIBEN", #endif @@ -172,7 +176,8 @@ static constexpr const Identity srcIdent( #else "HUAGOSCAN G300 TWAIN"// ݾɼ pm changed "HUAGOSCAN G300 TWAIN" #endif - +#elif defined UV && defined MAKERIGHTWAY + "RIGHTWAYSCAN G300 TWAIN" #elif defined HANVON "HANVONSCAN HW-7000W TAWIN" @@ -322,7 +327,7 @@ static std::vector DeviceID{ {0x3072,0x200}, #endif // ISG100 #elif defined G300 - {0x3072,0x0300} + {0x3072,0x0300}, #elif defined G400 {0x3072,0x400}, #endif // ISG100 @@ -410,13 +415,25 @@ void HuagaoDs::showmsg(std::string caption, std::string text, int retcode) if(!m_scanparam->en_fold) imgread /= 2; } - if (!(m_scanparam->is_autodiscradblank_normal || m_scanparam->is_autodiscradblank_vince)) + if (retcode == 200) { - text += "\nɨͳϢ\nֽţ" + to_string(scanner->get_scannum()) + - "\nɨ裨ţ" + to_string(imgread) + "\nɨţ" + to_string(scanner->get_scannum() - imgread) + - "\nϴҳ" + to_string(scanner->get_imgTransfered()) + "\nϴҳ" + to_string(num - scanner->get_imgTransfered()); - scanner->set_lose_image_num(0); - } + if (!(m_scanparam->is_autodiscradblank_normal || m_scanparam->is_autodiscradblank_vince)) + { + text += "ʵʹֽ\nɨͳϢ\nֽţ--\nɨ裨ţ" + to_string(imgread) + "\nɨţ--\nϴҳ" + + to_string(scanner->get_imgTransfered()) + "\nϴҳ" + to_string(num - scanner->get_imgTransfered()); + scanner->set_lose_image_num(0); + } + } + else + { + if (!(m_scanparam->is_autodiscradblank_normal || m_scanparam->is_autodiscradblank_vince)) + { + text += "\nɨͳϢ\nֽţ" + to_string(scanner->get_scannum()) + + "\nɨ裨ţ" + to_string(imgread) + "\nɨţ" + to_string(scanner->get_scannum() - imgread) + + "\nϴҳ" + to_string(scanner->get_imgTransfered()) + "\nϴҳ" + to_string(num - scanner->get_imgTransfered()); + scanner->set_lose_image_num(0); + } + } } ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), CString((text + " " + caption).c_str()), NULL, SW_HIDE); } @@ -866,7 +883,6 @@ Result HuagaoDs::identityOpenDs(const Identity&) { } } } - FileTools::writelog(log_INFO, "open ds find device vid=" + to_string(vid) + "\tpid=" + to_string(pid)); if (vid == 0 || pid == 0) { @@ -1041,17 +1057,8 @@ Result HuagaoDs::identityOpenDs(const Identity&) { } else{ m_scanparam->multi_output_red = 0;//Dzɫģʽ¶ - //if (m_scanparam->pixtype == (int)PixelType::BlackWhite) - // m_scanparam->sharpen = SharpenBlur::Sharpen_None; - - //if (m_scanparam->pixtype == (int)PixelType::BlackWhite) - //{ - // if (m_scanparam->filter == 3 && m_scanparam->enhance_color == 0) - // { - // m_scanparam->filter = (BYTE)Filter::None; - // m_scanparam->enhance_color = (BYTE)Enchace_Color::Enhance_Red; - // } - //} + m_scanparam->detachnoise.is_detachnoise = false; + m_scanparam->fadeback = false; } m_iBitdepth = mech == PixelType::Rgb ? 24 : (mech == PixelType::Gray ? 8 : 1); return success(); @@ -1701,6 +1708,33 @@ Result HuagaoDs::identityOpenDs(const Identity&) { } return CapSupGetAllResetEx(msg, data, m_scanparam->detachnoise.detachnoise, 10); }; + //Ƴ + m_query[(CapType)(CapTypeEx::TwEx_IFadeBack)] = msgSupportGetAllSetReset; + m_caps[(CapType)(CapTypeEx::TwEx_IFadeBack)] = [this](Msg msg, Capability& data)->Result { + CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_IFadeBack), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); + if (Msg::Set == msg) { + if (m_scanparam->pixtype != 2) + return badValue(); + auto mech = data.currentItem(); + m_scanparam->fadeback = mech; + return success(); + } + return CapSupGetAllResetEx(msg, data, m_scanparam->fadeback, false); + }; + + m_query[(CapType)(CapTypeEx::TwEx_IFadeBackValue)] = msgSupportGetAllSetReset; + m_caps[(CapType)(CapTypeEx::TwEx_IFadeBackValue)] = [this](Msg msg, Capability& data)->Result { + CapabilityPrintf(msg, enum2str(CapTypeEx::TwEx_IFadeBackValue), msg == Msg::Set ? to_string((int)data.currentItem()) : ""); + if (Msg::Set == msg) { + auto mech = data.currentItem(); + if (mech > 0 && mech < 129) { + m_scanparam->fadeback_range = (int)mech; + return success(); + } + return badValue(); + } + return CapSupGetAllResetEx(msg, data, m_scanparam->fadeback_range, 40); + }; // m_query[(CapType)(CapTypeEx::TwEx_IMultiOutputRed)] = msgSupportGetAllSetReset; m_caps[(CapType)(CapTypeEx::TwEx_IMultiOutputRed)] = [this](Msg msg, Capability& data)->Result { @@ -2093,9 +2127,9 @@ Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data) { guiIndicator->ShowWindow(SW_HIDE); if (ret != -1) { int index = scanner->geterrorindex(); - if (ret == 82) + if (ret == 82 && ((typeid(*scanner.get()) == typeid(GScanO1003399)))) showmsg("ʾ", "ڵ" + to_string(index) + "ҳ⵽۽ǣֹͣɨ裡", ret); - else if(ret==75) + else if(ret==75 && ((typeid(*scanner.get()) == typeid(GScanO1003399)))) showmsg("ʾ", "ڵ" + to_string(index) + "ҳ⵽ߴ粻ֹͣɨ裡", ret); else showmsg("ʾ", msgs[(UsbSupported)ret], ret); @@ -2139,7 +2173,7 @@ Result HuagaoDs::pendingXfersReset(const Identity&, PendingXfers& data) { if (scanner.get()) { scanner->Stop_scan(); - scanner->reset(); + //scanner->reset(); scanner->ResetScanner(); } //guiIndicator.reset(); @@ -2364,7 +2398,6 @@ Result HuagaoDs::imageNativeXferGet(const Identity& id, ImageNativeXfer& data) { data = ImageNativeXfer(bmpSize()); std::copy(bmpBegin(), bmpEnd(), data.data().data()); bmpData.reset(new std::vector); - //FileTools::write_log("ϴͼƬ ===> Twain transfered num of " + to_string(++xtfer) + " images"); FileTools::writelog(log_INFO, "ϴͼƬ ===> Twain transfered num of " + to_string(++xtfer) + " images"); return { ReturnCode::XferDone, ConditionCode::Success }; @@ -2551,8 +2584,9 @@ Twpp::Result HuagaoDs::showTwainUI(Twpp::UserInterface& ui, bool bUiOnly) TwGlue glueUiOnly = { confirmFunction, cancelFunction }; std::string serialnum = scanner->GetSerialNum(); std::string hardwareversion = scanner->GetFWVersion(); + std::string macadder = scanner->GetMacAdder(); uint32_t mbversion = scanner->GetMotorFPGA(); - guiTwain.reset(new CTwainUI(bUiOnly ? glueUiOnly : glue, *m_scanparam, bUiOnly ? "ȷ" : "ɨ", hardwareversion, serialnum,mbversion)); + guiTwain.reset(new CTwainUI(bUiOnly ? glueUiOnly : glue, *m_scanparam, bUiOnly ? "ȷ" : "ɨ", hardwareversion, serialnum,macadder,mbversion)); guiTwain->Create(IDD_TWAINUI, parent); CRect newRect; ::GetWindowRect(static_cast(ui.parent().raw()), &newRect); @@ -2678,9 +2712,47 @@ Twpp::Result HuagaoDs::startScan() config.setrollermsgdata(chrono::duration_cast>>(chrono::system_clock::now().time_since_epoch()).count()); } } - - + //m_scanparam->brightness = -142; + //m_scanparam->contrast = 1000; // Сר scanner->config_params(*m_scanparam); + std::string info = "papertype= " + to_string(m_scanparam->papertype) + + "\nAutoCrop_threshold= " + to_string(m_scanparam->AutoCrop_threshold) + + "\nautodescrew = " + to_string(m_scanparam->autodescrew) + + "\nautomaticcolor= " + to_string(m_scanparam->automaticcolor) + + "\nbrightness = " + to_string(m_scanparam->brightness) + + "\ncontrast = " + to_string(m_scanparam->contrast) + + "\nis_detachnoise = " + to_string(m_scanparam->detachnoise.is_detachnoise) + + "\ndetachnoise = " + to_string(m_scanparam->detachnoise.detachnoise) + + "\nen_fold = " + to_string(m_scanparam->en_fold) + + "\nen_sizecheck = " + to_string(m_scanparam->en_sizecheck) + + "\nenhance_color = " + to_string(m_scanparam->enhance_color) + + "\nfillbackground = " + to_string(m_scanparam->fillbackground) + + "\nfilter = " + to_string(m_scanparam->filter) + + "\nis_fillhole = " + to_string(m_scanparam->fillhole.is_fillhole) + + "\ngamma = " + to_string(m_scanparam->gamma) + + "\ncapturepixtype = " + to_string(m_scanparam->hardwarecaps.capturepixtype) + + "\nen_doublefeed = " + to_string(m_scanparam->hardwarecaps.en_doublefeed) + + "\nhsvcorrect = " + to_string(m_scanparam->hsvcorrect) + + "\nimageRotateDegree = " + to_string(m_scanparam->imageRotateDegree) + + "\nindent = " + to_string(m_scanparam->indent) + + "\nis_autocontrast = " + to_string(m_scanparam->is_autocontrast) + + "\nis_autocrop = " + to_string(m_scanparam->is_autocrop) + + "\nis_autocontrast = " + to_string(m_scanparam->is_autocontrast) + + "\nis_autodiscradblank_normal = " + to_string(m_scanparam->is_autodiscradblank_normal) + + "\nis_autodiscradblank_vince = " + to_string(m_scanparam->is_autodiscradblank_vince) + + "\nis_autotext = " + to_string(m_scanparam->is_autotext) + + "\nis_convex = " + to_string(m_scanparam->is_convex) + + "\nis_duplex = " + to_string(m_scanparam->is_duplex) + + "\nis_switchfrontback = " + to_string(m_scanparam->is_switchfrontback) + + "\nis_dogeardetection = " + to_string(m_scanparam->is_dogeardetection) + + "\nmulti_output_red = " + to_string(m_scanparam->multi_output_red) + + "\nnoise = " + to_string(m_scanparam->noise) + + "\npaperAlign = " + to_string(m_scanparam->paperAlign) + + "\npixtype = " + to_string(m_scanparam->pixtype) + + "\nresolution_dst = " + to_string(m_scanparam->resolution_dst) + + "\nscannum = " + to_string(m_scanparam->scannum) + + "\nsharpen = " + to_string(m_scanparam->sharpen); + FileTools::writelog(log_TRACE,info); if (m_bIndicator) { //!< cancel button push @@ -2723,9 +2795,9 @@ Twpp::Result HuagaoDs::startScan() m_haveError = true; //ShellExecute(guiTwain ? guiTwain->m_hWnd : NULL, TEXT("open"), GetHidedlgPath(), str, NULL, SW_HIDE); int index = scanner->geterrorindex(); - if (retCode == 82) + if (retCode == 82 && ((typeid(*scanner.get()) == typeid(GScanO1003399)))) showmsg("ʾ", "ڵ" + to_string(index) + "ҳ⵽۽ǣֹͣɨ裡", retCode); - else if (retCode == 75) + else if (retCode == 75 && ((typeid(*scanner.get()) == typeid(GScanO1003399)))) showmsg("ʾ", "ڵ" + to_string(index) + "ҳ⵽ߴ粻ֹͣɨ裡", retCode); else showmsg("ʾ", msgs[(UsbSupported)retCode], retCode); diff --git a/huagao/huagaotwds.rc b/huagao/huagaotwds.rc index c578dac8..9ec90f02 100644 Binary files a/huagao/huagaotwds.rc and b/huagao/huagaotwds.rc differ diff --git a/huagao/resource.h b/huagao/resource.h index 4e12d224..e72dccb7 100644 Binary files a/huagao/resource.h and b/huagao/resource.h differ diff --git a/huagao/stdafx.h b/huagao/stdafx.h index a9ccbd5e..869b2e46 100644 Binary files a/huagao/stdafx.h and b/huagao/stdafx.h differ