diff --git a/huagao/CAdvancedDLG.cpp b/huagao/CAdvancedDLG.cpp new file mode 100644 index 00000000..8ae11823 --- /dev/null +++ b/huagao/CAdvancedDLG.cpp @@ -0,0 +1,96 @@ +// CAdvancedDLG.cpp: 实现文件 +// +#include "stdafx.h" +#include "CAdvancedDLG.h" +#include "afxdialogex.h" +#include "resource.h" + + +// CAdvancedDLG 对话框 + +IMPLEMENT_DYNAMIC(CAdvancedDLG, CTabPageSSL) + +CAdvancedDLG::CAdvancedDLG(int d, int n, int t, bool c, bool showconvex, CWnd* pParent /*=nullptr*/) + : CTabPageSSL(IDD_ADVANCED, pParent) + ,indent(d) + ,noise(n) + ,threshold(t) + ,is_convex(c) + ,showis_convex(showconvex) +{ + +} + +CAdvancedDLG::~CAdvancedDLG() +{ +} + +void CAdvancedDLG::DoDataExchange(CDataExchange* pDX) +{ + CTabPageSSL::DoDataExchange(pDX); + DDX_Control(pDX, IDC_EDIT_NOISE, m_Edit_noise); + DDX_Control(pDX, IDC_EDIT_INDENT, m_Edit_indent); + DDX_Control(pDX, IDC_EDIT_THRESHOLD, m_Edit_threshold); + DDX_Control(pDX, IDC_SLIDER_INDENT, m_Slider_indent); + DDX_Control(pDX, IDC_SLIDER_NOISE, m_Slider_noise); + DDX_Control(pDX, IDC_SLIDER_THRESHOLD, m_Slider_threshold); +} + +BOOL CAdvancedDLG::OnInitDialog() +{ + this->SetWindowTextW(L"高级设置"); + + CTabPageSSL::OnInitDialog(); + m_Edit_noise.SetSlideLink(this, IDC_SLIDER_NOISE); + m_Edit_noise.SetParams(30, 50, 2); + m_Edit_noise.SetValue(noise); + + m_Edit_indent.SetSlideLink(this, IDC_SLIDER_INDENT); + m_Edit_indent.SetParams(5, 30, 2); + m_Edit_indent.SetValue(indent); + + m_Edit_threshold.SetSlideLink(this, IDC_SLIDER_THRESHOLD); + m_Edit_threshold.SetParams(30, 50, 2); + m_Edit_threshold.SetValue(threshold); + if (showis_convex) + { + ((CButton*)GetDlgItem(IDC_CONVEXA))->SetCheck(is_convex); + ((CButton*)GetDlgItem(IDC_CONVEXB))->SetCheck(!is_convex); + } + else + { + ((CButton*)GetDlgItem(IDC_CONVEXA))->SetCheck(is_convex); + ((CButton*)GetDlgItem(IDC_CONVEXB))->SetCheck(!is_convex); + ((CButton*)GetDlgItem(IDC_CONVEXA))->EnableWindow(FALSE); + ((CButton*)GetDlgItem(IDC_CONVEXB))->EnableWindow(FALSE); + } + + return true; + +} + +BEGIN_MESSAGE_MAP(CAdvancedDLG, CTabPageSSL) + ON_BN_CLICKED(IDC_CONVEXA, &CAdvancedDLG::OnBnClickedConvexa) + ON_BN_CLICKED(IDC_CONVEXB, &CAdvancedDLG::OnBnClickedConvexb) +END_MESSAGE_MAP() + + +// CAdvancedDLG 消息处理程序 + + +void CAdvancedDLG::OnBnClickedConvexa() +{ + // TODO: 在此添加控件通知处理程序代码 + ((CButton*)GetDlgItem(IDC_CONVEXA))->SetCheck(true); + ((CButton*)GetDlgItem(IDC_CONVEXB))->SetCheck(false); + is_convex = true; +} + + +void CAdvancedDLG::OnBnClickedConvexb() +{ + // TODO: 在此添加控件通知处理程序代码 + ((CButton*)GetDlgItem(IDC_CONVEXA))->SetCheck(false); + ((CButton*)GetDlgItem(IDC_CONVEXB))->SetCheck(true); + is_convex = false; +} diff --git a/huagao/CAdvancedDLG.h b/huagao/CAdvancedDLG.h new file mode 100644 index 00000000..d93090b8 --- /dev/null +++ b/huagao/CAdvancedDLG.h @@ -0,0 +1,39 @@ +#pragma once +#include "TabPageSSL.h" +#include "Sliders.h" +#include "SmartEdit.h" + +// CAdvancedDLG 对话框 + +class CAdvancedDLG : public CTabPageSSL +{ + DECLARE_DYNAMIC(CAdvancedDLG) + +public: + CAdvancedDLG(int d,int n,int t,bool c,bool showconvex,CWnd* pParent = nullptr); // 标准构造函数 + virtual ~CAdvancedDLG(); + CSmartEdit m_Edit_indent; + CSmartEdit m_Edit_noise; + CSmartEdit m_Edit_threshold; + CLinkSlider m_Slider_noise; + CLinkSlider m_Slider_indent; + CLinkSlider m_Slider_threshold; + + int indent; + int noise; + int threshold; + bool is_convex; + bool showis_convex; +// 对话框数据 +#ifdef AFX_DESIGN_TIME + enum { IDD = IDD_ADVANCED }; +#endif + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 + virtual BOOL OnInitDialog(); + DECLARE_MESSAGE_MAP() +public: + afx_msg void OnBnClickedConvexa(); + afx_msg void OnBnClickedConvexb(); +}; diff --git a/huagao/CBasicPage.cpp b/huagao/CBasicPage.cpp index d3624bd8..ea708769 100644 --- a/huagao/CBasicPage.cpp +++ b/huagao/CBasicPage.cpp @@ -85,7 +85,9 @@ static std::vector reslutions{ _T("200"), _T("240"), _T("300"), - _T("600") +#ifndef LANXUM + //_T("600") +#endif // LANXUM }; static std::vector duplexs @@ -108,6 +110,7 @@ CBasicPage::CBasicPage(std::function dataChange, CWnd* pParent /*=nullpt , AreaNum(8) , DevnMax(200) , m_bswitchfrontback(FALSE) + ,discardblank_percent(10) { } @@ -212,9 +215,9 @@ void CBasicPage::OnCbnSelchangeCmbduplex() m_dataChange(); //} if (m_cmBoxDuplex->GetCurSel() == 2 || m_cmBoxDuplex->GetCurSel() == 3) - this->GetDlgItem(IDC_BTNDISCARDSETTING)->ShowWindow(SW_SHOW); + this->GetDlgItem(IDC_BTNDISCARDSETTING)->EnableWindow(true); else - this->GetDlgItem(IDC_BTNDISCARDSETTING)->ShowWindow(SW_HIDE); + this->GetDlgItem(IDC_BTNDISCARDSETTING)->EnableWindow(false); updateCmbDuplex(TRUE); } @@ -229,7 +232,7 @@ void CBasicPage::OnClickedBtndiscardsetting() //if (nRet == IDOK) { // dbs.GetParams(AreaNum, DevnMax); //} - CcardblankDlg settingdlg(discardblank_percent); + CcardblankDlg settingdlg(discardblank_percent,this); settingdlg.DoModal(); discardblank_percent = settingdlg.discardblank_percent; } diff --git a/huagao/CBrightnessPage.cpp b/huagao/CBrightnessPage.cpp index b5fa2abb..f67cdd5e 100644 --- a/huagao/CBrightnessPage.cpp +++ b/huagao/CBrightnessPage.cpp @@ -15,7 +15,7 @@ CBrightnessPage::CBrightnessPage(CWnd* pParent /*=nullptr*/) : CTabPageSSL(IDD_PAGEBRIGHTNESS, pParent) , m_cbAutoContrast(FALSE) { - + } CBrightnessPage::~CBrightnessPage() diff --git a/huagao/CFeedPaperPage.cpp b/huagao/CFeedPaperPage.cpp index 5ab7caec..f52ba26f 100644 --- a/huagao/CFeedPaperPage.cpp +++ b/huagao/CFeedPaperPage.cpp @@ -115,7 +115,7 @@ void CFeedPaperPage::FeedPaperPageUpdate(int val) //if (val == 0 || val == 4)//单面或对折 // m_tempBtn->SetCheck(0); //BOOL enable = (val == 0 || val == 4); - //m_tempBtn->EnableWindow(!enable); + //m_tempBtn->EnableWindow(!enable); } void CFeedPaperPage::FeedAutoDescrewUpdate(int val) diff --git a/huagao/CImageProcPage.cpp b/huagao/CImageProcPage.cpp index c06f75a2..30326d5a 100644 --- a/huagao/CImageProcPage.cpp +++ b/huagao/CImageProcPage.cpp @@ -36,7 +36,12 @@ CImageProcPage::CImageProcPage(CWnd* pParent /*=nullptr*/) , m_ckbAutoDeskrew(FALSE) , m_ckbMultioutput(FALSE) , m_ckbRemoveHole(FALSE) + , m_ckbDetachNoise(FALSE) , m_ckbHSVCorrect(FALSE) + , indent(5) + , noise(40) + ,threshold(40) + ,is_bw(false) { } @@ -45,15 +50,20 @@ CImageProcPage::~CImageProcPage() { } -void CImageProcPage::ImageProcPageUpdate(int val) +void CImageProcPage::ImageProcPageUpdate(int val,bool is_Crop) { CComboBox* m_temp = (CComboBox*)(GetDlgItem(IDC_CMBFILTER)); CButton* t_chMultiOutput = (CButton*)(GetDlgItem(IDC_CKMULTIOUTPUT)); CComboBox* m_temp_sharpen = (CComboBox*)(GetDlgItem(IDC_CMBSHARPEN)); - + is_bw = val == 2 ? true : false; int ival = (val == 0 ? 0 : (val == 1 ? 1 : 2)); - - + this->is_crop = is_Crop; + if (((CButton*)GetDlgItem(IDC_CKFILLBLACKRECT))->GetCheck() || ((CButton*)GetDlgItem(IDC_CKAUTODESKREW))->GetCheck() || is_crop) + ((CButton*)GetDlgItem(IDC_ADVANCEDSET))->EnableWindow(true); + else + { + ((CButton*)GetDlgItem(IDC_ADVANCEDSET))->EnableWindow(false); + } if (0 == ival)//彩色 { m_temp->SetCurSel(0); @@ -68,7 +78,17 @@ void CImageProcPage::ImageProcPageUpdate(int val) t_chMultiOutput->SetCheck(FALSE); t_chMultiOutput->EnableWindow(FALSE); } - + if (ival == 2) + { + ((CButton*)GetDlgItem(IDC_CHECKDETACHNOISE))->EnableWindow(true); + } + else + { + ((CButton*)GetDlgItem(IDC_CHECKDETACHNOISE))->SetCheck(false); + ((CButton*)GetDlgItem(IDC_CHECKDETACHNOISE))->EnableWindow(false); + m_edit_detachnoise.EnableWindow(false); + m_slider_detachnoise.EnableWindow(false); + } //bool enabele = ival <= 1;//彩色或灰度 //if (!enabele) { // m_temp_sharpen->SetCurSel(0); @@ -91,12 +111,15 @@ void CImageProcPage::DoDataExchange(CDataExchange* pDX) CTabPageSSL::DoDataExchange(pDX); DDX_Control(pDX, IDC_SLDOUTHOLE, m_slider_hole); 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_CMBFILTER, m_cmBoxFilter); DDX_Control(pDX, IDC_CMBSHARPEN, m_cmBoxSharpen); DDX_Check(pDX, IDC_CKFILLBLACKRECT, m_ckbFillBlack); DDX_Check(pDX, IDC_CKAUTODESKREW, m_ckbAutoDeskrew); DDX_Check(pDX, IDC_CKMULTIOUTPUT, m_ckbMultioutput); DDX_Check(pDX, IDC_CKREMOVEHOLE, m_ckbRemoveHole); + DDX_Check(pDX, IDC_CHECKDETACHNOISE,m_ckbDetachNoise); DDX_Check(pDX, IDC_CKHSVCORRECT, m_ckbHSVCorrect); } @@ -107,6 +130,11 @@ BOOL CImageProcPage::OnInitDialog() m_edit_hole.SetParams(0.01, 0.50, 10, _T("%0.2f")); m_edit_hole.SetValue(0.10); + m_edit_detachnoise.SetSlideLink(this, IDC_SLIDERDETACHNOISE); + m_edit_detachnoise.SetParams(10, 50, 10); + m_edit_detachnoise.SetValue(detachnoise); + + ((CButton*)GetDlgItem(IDC_CHECKDETACHNOISE))->SetCheck(is_detachnoise); for (int i = 0; i < filters.size(); i++) { m_cmBoxFilter.InsertString(i, filters[i]); @@ -123,6 +151,10 @@ BOOL CImageProcPage::OnInitDialog() BEGIN_MESSAGE_MAP(CImageProcPage, CTabPageSSL) ON_BN_CLICKED(IDC_CKREMOVEHOLE, &CImageProcPage::OnCtrlChange) + ON_BN_CLICKED(IDC_ADVANCEDSET, &CImageProcPage::OnBnClickedAdvancedset) + ON_BN_CLICKED(IDC_CKFILLBLACKRECT, &CImageProcPage::OnBnClickedCkfillblackrect) + ON_BN_CLICKED(IDC_CKAUTODESKREW, &CImageProcPage::OnBnClickedCkautodeskrew) + ON_BN_CLICKED(IDC_CHECKDETACHNOISE, &CImageProcPage::OnBnClickedCheckdetachnoise) END_MESSAGE_MAP() void CImageProcPage::EnableOutHoleCheckChanged(BOOL enable) @@ -164,4 +196,53 @@ void CImageProcPage::OnCtrlChange() UpdateData(); m_edit_hole.EnableWindow(m_ckbRemoveHole); m_slider_hole.EnableWindow(m_ckbRemoveHole); + +} + + +void CImageProcPage::OnBnClickedAdvancedset() +{ + // TODO: 在此添加控件通知处理程序代码 + CAdvancedDLG cb(indent, noise, threshold,is_convex,((CButton*)GetDlgItem(IDC_CKFILLBLACKRECT))->GetCheck(),this); + cb.DoModal(); + noise= cb.m_Slider_noise.m_iPosition; + indent = cb.m_Slider_indent.m_iPosition; + threshold = cb.m_Slider_threshold.m_iPosition; + is_convex = cb.is_convex; + +} + + + +void CImageProcPage::OnBnClickedCkfillblackrect() +{ + // TODO: 在此添加控件通知处理程序代码 + if(((CButton*)GetDlgItem(IDC_CKFILLBLACKRECT))->GetCheck()|| ((CButton*)GetDlgItem(IDC_CKAUTODESKREW))->GetCheck()||is_crop) + ((CButton*)GetDlgItem(IDC_ADVANCEDSET))->EnableWindow(true); + else + { + ((CButton*)GetDlgItem(IDC_ADVANCEDSET))->EnableWindow(false); + } +} + + +void CImageProcPage::OnBnClickedCkautodeskrew() +{ + // TODO: 在此添加控件通知处理程序代码 + if (((CButton*)GetDlgItem(IDC_CKFILLBLACKRECT))->GetCheck() || ((CButton*)GetDlgItem(IDC_CKAUTODESKREW))->GetCheck() || is_crop) + ((CButton*)GetDlgItem(IDC_ADVANCEDSET))->EnableWindow(true); + else + { + ((CButton*)GetDlgItem(IDC_ADVANCEDSET))->EnableWindow(false); + } +} + + +void CImageProcPage::OnBnClickedCheckdetachnoise() +{ + // TODO: 在此添加控件通知处理程序代码 + UpdateData(); + m_ckbDetachNoise = m_ckbDetachNoise && is_bw; + m_edit_detachnoise.EnableWindow(m_ckbDetachNoise); + m_slider_detachnoise.EnableWindow(m_ckbDetachNoise); } diff --git a/huagao/CImageProcPage.h b/huagao/CImageProcPage.h index 0070ddf7..56bf947a 100644 --- a/huagao/CImageProcPage.h +++ b/huagao/CImageProcPage.h @@ -1,7 +1,9 @@ #pragma once +#include #include "TabPageSSL.h" #include "Sliders.h" #include "SmartEdit.h" +#include "CAdvancedDLG.h" // CImageProcPage 对话框 @@ -15,6 +17,8 @@ public: CLinkSlider m_slider_hole; CSmartEdit m_edit_hole; + CLinkSlider m_slider_detachnoise; + CSmartEdit m_edit_detachnoise; CComboBox m_cmBoxFilter; CComboBox m_cmBoxSharpen; BOOL m_ckbFillBlack; @@ -22,12 +26,20 @@ public: BOOL m_ckbMultioutput; BOOL m_ckbRemoveHole; BOOL m_ckbHSVCorrect; - - void ImageProcPageUpdate(int val); + BOOL m_ckbDetachNoise; + void ImageProcPageUpdate(int val, bool is_Crop); void ImageAutoDescrewUpdate(int val); void EnableOutHoleCheckChanged(BOOL enable); void SetOutHoleValue(int value); void SetMultiOutputEnable(int pixtype, bool enable); + int detachnoise; + int indent; + int noise; + int threshold; + bool is_convex; + bool is_crop; + bool is_bw; + bool is_detachnoise; // 对话框数据 #ifdef AFX_DESIGN_TIME enum { IDD = IDD_PAGEIMGPROC }; @@ -42,4 +54,9 @@ protected: afx_msg void OnCtrlChange(); +public: + afx_msg void OnBnClickedAdvancedset(); + afx_msg void OnBnClickedCkfillblackrect(); + afx_msg void OnBnClickedCkautodeskrew(); + afx_msg void OnBnClickedCheckdetachnoise(); }; diff --git a/huagao/CMakeLists.txt b/huagao/CMakeLists.txt index bc04c6d7..34772fca 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 7012fc2f..fb5010ec 100644 --- a/huagao/CTwainUI.cpp +++ b/huagao/CTwainUI.cpp @@ -30,6 +30,13 @@ CTwainUI::CTwainUI(TwGlue glue, GScanCap caps, std::string confirmtitle, std::st m_hardwareVersion = hardwareversion; m_serialnum = serialnum; //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; + } CTwainUI::~CTwainUI() @@ -53,7 +60,8 @@ BOOL CTwainUI::OnInitDialog() this->SetWindowText(TWAIN_NAME); auto dataChangeFunction = [this]() { - m_pageImageProc->ImageProcPageUpdate(m_pageBasic->m_cmBoxColorMode->GetCurSel()); + m_pageImageProc->ImageProcPageUpdate(m_pageBasic->m_cmBoxColorMode->GetCurSel(), + (getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel())== TwSS::USStatement)||(getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::None)); m_pageFeedPaper->FeedPaperPageUpdate(m_pageBasic->m_cmBoxDuplex->GetCurSel()); m_pageImageProc->ImageAutoDescrewUpdate(m_pageBasic->m_cmBoxSS->GetCurSel()); //m_pageFeedPaper->FeedAutoDescrewUpdate(m_pageBasic->m_cmBoxSS->GetCurSel()); @@ -63,6 +71,7 @@ BOOL CTwainUI::OnInitDialog() int nPageID = 0; 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_tabCtrl->AddSSLPage(_T("基本"), nPageID++, m_pageBasic.get()); m_pageBrightness->Create(IDD_PAGEBRIGHTNESS, this); @@ -76,7 +85,7 @@ BOOL CTwainUI::OnInitDialog() UpdateUI(); UpdateListConfig(); - UpdateUi(); + dataChangeFunction(); return true; } @@ -110,6 +119,11 @@ void CTwainUI::OnBnClickedBtndefault() GscanJsonConfig js; GScanCap cf = js.GetDefaultGscancapValue(); settings.reset(new GScanCap(cf)); + m_pageImageProc->noise = 40; + m_pageImageProc->threshold = 40; + m_pageImageProc->indent = 5; + m_pageImageProc->is_convex = true; + m_pageBasic->discardblank_percent = 20; UpdateUI(); } @@ -145,7 +159,10 @@ void CTwainUI::UpdateUI() m_pageBasic->m_cmBoxSS->SetCurSel(getPaparSizeIndex(settings->papertype, settings->paperAlign)); //!< 纸张类型 m_pageBasic->m_bswitchfrontback = settings->is_switchfrontback ? TRUE : FALSE; //!< 交换正反面 m_pageBasic->UpdateData(FALSE); - + if(getCmbDuplexIndex()==2|| getCmbDuplexIndex()==3) + m_pageBasic->GetDlgItem(IDC_BTNDISCARDSETTING)->EnableWindow(true); + else + m_pageBasic->GetDlgItem(IDC_BTNDISCARDSETTING)->EnableWindow(false); //!< Page Breghtness m_pageBrightness->m_cbAutoContrast = settings->is_autocontrast==TRUE?TRUE:FALSE; //!< 自动亮度对比度 int brt = GetMappingBrightnessValue(settings->brightness); @@ -156,6 +173,7 @@ void CTwainUI::UpdateUI() m_pageBrightness->UpdateData(FALSE); //!< Page Proc + //! m_pageImageProc->m_ckbFillBlack = settings->fillbackground==TRUE ? TRUE : FALSE;//填充黑框 m_pageImageProc->m_ckbAutoDeskrew = settings->autodescrew ? TRUE : FALSE;//自动纠偏 UpdateFilterCmbx(); @@ -164,6 +182,10 @@ void CTwainUI::UpdateUI() m_pageImageProc->m_ckbRemoveHole = settings->fillhole.is_fillhole==TRUE?TRUE:FALSE;//除穿孔可用性 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->m_ckbDetachNoise = settings->detachnoise.is_detachnoise == TRUE ? TRUE : FALSE;//黑白降噪是否启用 + ((CButton*)m_pageImageProc->GetDlgItem(IDC_CHECKDETACHNOISE))->SetCheck(m_pageImageProc->m_ckbDetachNoise); + m_pageImageProc->m_edit_detachnoise.SetValue(settings->detachnoise.detachnoise); + m_pageImageProc->m_slider_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 @@ -276,6 +298,16 @@ int CTwainUI::getPaparSizeIndex(int papersize, int orentation) return 0; } +TwSS CTwainUI::getcombox_ss(int index) +{ + for (std::map::iterator it = paperStatusMap.begin(); it != paperStatusMap.end(); it++) { + if (it->first == index) { + return (TwSS)it->second.Paper; + } + } + return TwSS::A3; +} + int CTwainUI::getColorModelIndex(int pixtype) { return pixtype == 2 ? 0 : (pixtype == 1 ? 1 : 2); @@ -377,6 +409,7 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs) configItem->Sharpen = m_pageImageProc->m_cmBoxSharpen.GetCurSel();//锐化 configItem->EnOutHole = m_pageImageProc->m_ckbRemoveHole;//除穿孔可用性 configItem->OutHoleRatio = WndCtrl2f(&(m_pageImageProc->m_edit_hole)) * 100;//穿孔搜索范围比例系数 + configItem->EnMultiOutPutR = m_pageImageProc->m_ckbMultioutput;//多流除红 configItem->EnHsvCorrect = m_pageImageProc->m_ckbHSVCorrect;//答题卡除红 @@ -430,7 +463,10 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs) else { settings->imageRotateDegree = 0.0f; } - + settings->AutoCrop_threshold = m_pageImageProc->threshold; + settings->noise = m_pageImageProc->noise; + settings->indent = m_pageImageProc->indent; + settings->is_convex = m_pageImageProc->is_convex; settings->is_autotext = configItem->Orentation == 4; settings->is_backrotate180 =configItem->EnBackRotate180; settings->is_dogeardetection = m_pageFeedPaper->dogear.GetCheck(); @@ -467,7 +503,8 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs) settings->sharpen = configItem->Sharpen; if (configItem->Filter != 0 || configItem->EnMultiOutPutR) settings->hardwarecaps.capturepixtype = TWPT_RGB; - + settings->detachnoise.is_detachnoise = m_pageImageProc->m_ckbDetachNoise; + settings->detachnoise.detachnoise = m_pageImageProc->m_slider_detachnoise.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 742171d6..6f30e2c2 100644 --- a/huagao/CTwainUI.h +++ b/huagao/CTwainUI.h @@ -206,6 +206,7 @@ private: std::vector cfi; int getResolutionIndex(int resolution); int getPaparSizeIndex(int papersize, int orentation); + TwSS getcombox_ss(int index); int getColorModelIndex(int pixtype); int getRotateCmbIndex(float res); std::vector getConfigFiles(); diff --git a/huagao/Device/GScan.h b/huagao/Device/GScan.h index 5faac223..00ee8302 100644 --- a/huagao/Device/GScan.h +++ b/huagao/Device/GScan.h @@ -8,6 +8,7 @@ #include #include #include +#include "filetools.h" #include "PublicFunc.h" enum tagDevState @@ -110,11 +111,12 @@ public: void DoEvents() { MSG msg; if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - if (msg.message != WM_LBUTTONUP && bFilterMsg) - { - bFilterMsg = false; - return; - } + //if (msg.message != WM_LBUTTONUP && bFilterMsg) + //{ + // FileTools::write_log("C:\\Users\\666\\Desktop\\1.txt", to_string(msg.message)); + // bFilterMsg = false; + // return; + //} DispatchMessage(&msg); TranslateMessage(&msg); } diff --git a/huagao/Device/GScanO200.cpp b/huagao/Device/GScanO200.cpp index 0c4c2f97..2a0faff2 100644 --- a/huagao/Device/GScanO200.cpp +++ b/huagao/Device/GScanO200.cpp @@ -240,7 +240,7 @@ int GScanO200::aquire_bmpdata(std::vector& bmpdata) while (true) { if (m_pImages->empty()) { - DoEvents(); + //DoEvents(); this_thread::sleep_for(chrono::milliseconds(1)); if (sw.elapsed_s() > 20.00) { @@ -276,7 +276,7 @@ int GScanO200::aquire_bmpdata(std::vector& bmpdata) #endif // LOG return 0; } - DoEvents(); + //DoEvents(); this_thread::sleep_for(chrono::milliseconds(2)); } } @@ -365,6 +365,16 @@ void GScanO200::config_params(GScanCap& params) gcap = params; UINT32 cfgdata = cfg.GetData(); USBCB usbcb = { CONFIGURED_DATA,cfgdata,0 }; + FileTools::write_log("USB config_params:"+to_string(cfgdata)+"\npaper:"+to_string(cfgdata&0x1f) + + "\ncolor:" + to_string((cfgdata>>5) & 0x1) + + "\ndpi:" + to_string((cfgdata>>6) & 0x3) + + "\ndouble_feed_enbale:" + to_string((cfgdata>>8) & 0x1) + + "\nstable_enbale:" + to_string((cfgdata>>9) & 0x1) + + "\nscrew_detect_enable:" + to_string((cfgdata>>10) & 0x1) + + "\nscrew_detect_level:" + to_string((cfgdata>>11) & 0x7) + + "\nunused_one:" + to_string((cfgdata>>14) & 0x3F) + + "\npc_correct:" + to_string((cfgdata>>20) & 0x1) + + "\nunused_two:" + to_string((cfgdata>>21) & 0x7ff)); m_usb->write_bulk(&usbcb, sizeof(USBCB)); this_thread::sleep_for(std::chrono::milliseconds(200)); m_pImages->setparam(params); @@ -382,10 +392,8 @@ void GScanO200::Scanner_StartScan(UINT16 count) USBCB status = { GET_DSP_STATUS ,0,0 }; if (m_usb.get() && m_usb->is_connected()) m_usb->write_bulk(&status, sizeof(status)); - if (m_usb.get() && m_usb->is_connected()) m_usb->read_bulk(&status, sizeof(status)); - switch (status.u32_Data) { case COUNT_MODE: diff --git a/huagao/Device/ImageMatQueue.cpp b/huagao/Device/ImageMatQueue.cpp index 860a3cc3..21d68a11 100644 --- a/huagao/Device/ImageMatQueue.cpp +++ b/huagao/Device/ImageMatQueue.cpp @@ -171,7 +171,7 @@ void ImageMatQueue::setparam(const GScanCap& param) #else // REAL300DPI fixedSize = papersize.GetPaperSize(param.papertype, 200.0f, param.paperAlign); #endif - m_iaList.push_back(shared_ptr(new CImageApplyAutoCrop(islongcustomcrop ? islongcustomcrop : param.is_autocrop, param.autodescrew, param.fillbackground, cv::Size(fixedSize.cx, fixedSize.cy), true))); + m_iaList.push_back(shared_ptr(new CImageApplyAutoCrop(islongcustomcrop ? islongcustomcrop : param.is_autocrop, param.autodescrew, param.fillbackground, cv::Size(fixedSize.cx, fixedSize.cy), param.is_convex,param.AutoCrop_threshold,param.noise,param.indent))); } if (param.is_autodiscradblank_normal || param.is_autodiscradblank_vince) { @@ -217,7 +217,7 @@ void ImageMatQueue::setparam(const GScanCap& param) //òֵ disBlank->setMinArea(area); disBlank->setIntensity(intensity); - m_iaList.push_back(shared_ptr(new CImageApplyDiscardBlank())); + m_iaList.push_back(shared_ptr(disBlank)); //m_iaList.push_back(shared_ptr(new CImageApplyDiscardBlank(param.areanum,param.devnmax))); } @@ -230,9 +230,13 @@ void ImageMatQueue::setparam(const GScanCap& param) } if (param.brightness != 0 || param.contrast != 0 || param.gamma != 1.0) { - double aa = (254.0 / 2000.0) * param.brightness + 0.5; + double aa = (254 / 2000.0) * param.brightness + 0.5; int bright = ceil(aa);//[-127,128] 0.128=256.0/2000.0 - int contrast = (int)(param.contrast * 0.036);//[-36,36] 0.036=72.0/2000.0; + int contrast=0.0; //= (int)(param.contrast * 0.036);;//[-36,36] 0.036=72.0/2000.0; + if(param.contrast<0.0) // ݲ޸ĶԱȶȣɫĸɫƫ + contrast = (int)(param.contrast * 0.036); + else + contrast = (int)(param.contrast * 0.018); m_iaList.push_back(shared_ptr(new CImageApplyAdjustColors(bright, contrast, param.gamma))); } //⿨ @@ -248,7 +252,11 @@ void ImageMatQueue::setparam(const GScanCap& param) //ֵ if (param.pixtype == 0) //threshold m_iaList.push_back(shared_ptr(new CImageApplyBWBinaray(CImageApplyBWBinaray::ThresholdType::THRESH_BINARY))); - + //ڰ׽Ż + if (scanParam.detachnoise.is_detachnoise&&scanParam.pixtype==0) + { + m_iaList.push_back(shared_ptr(new CImageApplyDetachNoise(scanParam.detachnoise.detachnoise))); + } if (param.resolution_dst != param.resolution_native) { CImageApplyResize* apply; @@ -357,7 +365,7 @@ void ImageMatQueue::proc() writelog("decode image data error"); } #ifdef G200 - resize(mat, mat, cv::Size(), fx, fy);//ܻСƥ ϵ׶ + cv::resize(mat, mat, cv::Size(), fx, fy);//ܻСƥ ϵ׶ mats.push_back(mat); mat.release(); #else // G200 @@ -402,8 +410,16 @@ void ImageMatQueue::proc() for (int j = 0; j < m_iaList.size(); j++) { m_iaList[j]->apply(mats, scanParam.is_duplex); } - - + //if (scanParam.imageRotateDegree != 0.0 && scanParam.imageRotateDegree != 180.0) + //{ + // //cv::flip(mats[0], mats[0], -1); + // transpose(mats[0], mats[0]); + // flip(mats[0], mats[0], 1); + // transpose(mats[1], mats[1]); + // flip(mats[1], mats[1], 0); + + //} + for (int i = 0; i < mats.size(); i++) { if (!scanParam.is_duplex && i == 1) { mats[i].release(); diff --git a/huagao/Device/PublicFunc.h b/huagao/Device/PublicFunc.h index 307d4132..4b2eb14d 100644 --- a/huagao/Device/PublicFunc.h +++ b/huagao/Device/PublicFunc.h @@ -27,6 +27,7 @@ using namespace std; #define DUPLEX "iDuplex" #define DISCARBLANK "bDiscardBlank" #define DISCARBLANKVINCE "bDiscardBlankVince" +#define DISCARBLANK_VALUE "discardblank_percent" #define DB_AREANUM "iAreaNum" #define DB_DEVNMAX "iDevnMax" #define FLOD "bFlod" @@ -50,6 +51,8 @@ using namespace std; #define MULTIOUTPUT "iMultiOutPut" #define OUTHOLE "bOutHole" #define OUTHOLERATIO "iOutHoleRatio" +#define DETACHNOISE "detachnoise" +#define DETACHNOISEVALUE "detachnoisevalue" #define HSVCORRECT "bHsvCorrect" // #include +#include "filetools.h" UsbScanEx::UsbScanEx(int index) { @@ -79,6 +80,7 @@ bool UsbScanEx::open() CloseHandle(m_h_dev); m_h_dev = INVALID_HANDLE_VALUE; } + FileTools::write_log("USB Open!"); return m_h_dev; } @@ -131,6 +133,7 @@ bool UsbScanEx::close() } } m_b_is_connected = FALSE; + FileTools::write_log("USB Close!"); return b_ret; } @@ -150,10 +153,10 @@ int UsbScanEx::read_bulk(void* data, int len) lp_overlap->Offset = 0; lp_overlap->OffsetHigh = 0; lp_overlap->Pointer = 0; - + if (m_h_dev != NULL) { b_ret = ReadFile(h_pipe, data, len, &pdw_ret, lp_overlap); - + if (b_ret) { return pdw_ret; } @@ -187,12 +190,9 @@ int UsbScanEx::write_bulk(void* data, int len) HANDLE h_pipe = m_usb_pipes[BULK_OUT].h_pipe; void* p_data = data; unsigned long dw_size = len; - LPOVERLAPPED lp_overlap = ov + BULK_OUT; - if (m_h_dev == INVALID_HANDLE_VALUE) return TRUE; - b_ret = WriteFile(h_pipe, p_data, dw_size, &dw_size, lp_overlap); if (b_ret) { return dw_size; diff --git a/huagao/Device/filetools.h b/huagao/Device/filetools.h index 12d0061e..90f9f93f 100644 --- a/huagao/Device/filetools.h +++ b/huagao/Device/filetools.h @@ -3,6 +3,7 @@ #include #include #include +#include "PublicFunc.h" class FileTools { @@ -16,18 +17,28 @@ public: return files; } + static void write_log(std::string log) + { + TCHAR szIniFile[MAX_PATH] = { 0 }; + SHGetSpecialFolderPath(NULL, szIniFile, CSIDL_LOCAL_APPDATA, TRUE); + _tcscat(szIniFile, HUAGAO_SCAN); + _tcscat(szIniFile, TWAIN_INIPATH); + _tcscat(szIniFile, TEXT("\\")); + _tcscat(szIniFile, TWAIN_LOG_NAME); + std::string savepath = TCHAR2STRING(szIniFile); + write_log(savepath, log); + } static void write_log(std::string filename, std::string log) { //std::string savepath; //std::string str = "D:"; //savepath = str+"\\"+filename; std::ofstream ofs(filename, std::ios::app); - time_t timp; struct tm* p; time(&timp); p=localtime(&timp); - ofs << p->tm_year << "/" << p->tm_mon << "/" << p->tm_mday << " " << p->tm_hour << ":" << p->tm_min << ":" << p->tm_sec << " "<tm_year+1900 << "/" << p->tm_mon+1 << "/" << p->tm_mday << " " << p->tm_hour << ":" << p->tm_min << ":" << p->tm_sec << " "< cfgArray, const root["Config"].AddEmptySubArray(DUPLEX); root["Config"].AddEmptySubArray(DISCARBLANK); root["Config"].AddEmptySubArray(DISCARBLANKVINCE); + root["Config"].AddEmptySubArray(DISCARBLANK_VALUE); //root["Config"].AddEmptySubArray(DB_AREANUM); //root["Config"].AddEmptySubArray(DB_DEVNMAX); root["Config"].AddEmptySubArray(FLOD); root["Config"].AddEmptySubArray(SWITCHFRONTBACK); - + root["Config"].AddEmptySubArray(DETACHNOISE); + root["Config"].AddEmptySubArray(DETACHNOISEVALUE); /*< brightness setting*/ root["Config"].AddEmptySubArray(BRIGHTNESS); root["Config"].AddEmptySubArray(AUTOCONTRAST); @@ -160,6 +175,11 @@ void GscanJsonConfig::WriteJsonArrayToFile(std::vector cfgArray, const root["Config"].AddEmptySubArray(DOGEAR_DETECTION); root["Config"].AddEmptySubArray(SCREWDETECT); root["Config"].AddEmptySubArray(SCREWLEVEL); + root["Config"].AddEmptySubArray(NOISE); + root["Config"].AddEmptySubArray(INDENT); + root["Config"].AddEmptySubArray(AUTOCROP_THRESHOLD); + root["Config"].AddEmptySubArray(ISCONVEX); + /*< other settings*/ root["Config"].AddEmptySubArray(ITEMCAPTION); @@ -174,6 +194,7 @@ void GscanJsonConfig::WriteJsonArrayToFile(std::vector cfgArray, const root["Config"][DUPLEX].Add(i,(bool)cfgArray[i].is_duplex); root["Config"][DISCARBLANK].Add(i, (bool)cfgArray[i].is_autodiscradblank_normal); root["Config"][DISCARBLANKVINCE].Add(i, (bool)cfgArray[i].is_autodiscradblank_vince); + root["Config"][DISCARBLANK_VALUE].Add((int)cfgArray[i].discardblank_percent); //root["Config"][DB_AREANUM].Add(cfgArray[i].DBlank_AreaNum); //root["Config"][DB_DEVNMAX].Add(cfgArray[i].DBlank_DevnMax); root["Config"][FLOD].Add(i, (bool)cfgArray[i].en_fold); @@ -192,6 +213,8 @@ void GscanJsonConfig::WriteJsonArrayToFile(std::vector cfgArray, const root["Config"][MULTIOUTPUT].Add(i, (bool)cfgArray[i].multi_output_red); root["Config"][OUTHOLE].Add(i, (bool)cfgArray[i].fillhole.is_fillhole); 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"][HSVCORRECT].Add(i, (bool)cfgArray[i].hsvcorrect); root["Config"][ULTRADETECT].Add(i, (bool)cfgArray[i].hardwarecaps.en_doublefeed); @@ -200,6 +223,10 @@ 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"][NOISE].Add((int)cfgArray[i].noise); + root["Config"][INDENT].Add((int)cfgArray[i].indent); + root["Config"][ISCONVEX].Add(i, (bool)cfgArray[i].is_convex); + root["Config"][AUTOCROP_THRESHOLD].Add((int)cfgArray[i].AutoCrop_threshold); 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); @@ -312,6 +339,9 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str root["Config"].Get(FLOD, itmEnFlod); neb::CJsonObject itmEnSwitchFrontBack; root["Config"].Get(SWITCHFRONTBACK, itmEnSwitchFrontBack); + neb::CJsonObject itmdiscarbrank_value; + root["Config"].Get(DISCARBLANK_VALUE, itmdiscarbrank_value); + neb::CJsonObject itmBrtnes; root["Config"].Get(BRIGHTNESS, itmBrtnes); @@ -338,6 +368,10 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str root["Config"].Get(OUTHOLE, itmOutHole); neb::CJsonObject itmOutHoleRatio; root["Config"].Get(OUTHOLERATIO, itmOutHoleRatio); + neb::CJsonObject itmDetachNoise; + root["Config"].Get(DETACHNOISE, itmDetachNoise); + neb::CJsonObject itmDetachNoiseValue; + root["Config"].Get(DETACHNOISEVALUE, itmDetachNoiseValue); neb::CJsonObject itmHsvCorrect; root["Config"].Get(HSVCORRECT, itmHsvCorrect); @@ -353,6 +387,14 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str root["Config"].Get(AUTO_TEXT, itmAutotext); neb::CJsonObject itmBackRotate; root["Config"].Get(BACKROTATE180, itmBackRotate); + neb::CJsonObject itmNoise; + root["Config"].Get(NOISE, itmNoise); + neb::CJsonObject itmIndent; + root["Config"].Get(INDENT, itmIndent); + neb::CJsonObject itmisConvex; + root["Config"].Get(ISCONVEX, itmisConvex); + neb::CJsonObject itmAutoCrop_t; + root["Config"].Get(AUTOCROP_THRESHOLD, itmAutoCrop_t); neb::CJsonObject itmdogeardetection; root["Config"].Get(DOGEAR_DETECTION, itmdogeardetection); neb::CJsonObject itmScrewDetct; @@ -390,6 +432,8 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str cfp.resolution_dst = i_value; itmDulpex.Get(i, b_value); cfp.is_duplex = b_value ? 1 : 0; + itmdiscarbrank_value.Get(i, i_value); + cfp.discardblank_percent = i_value; itmDiscardBlk.Get(i, b_value); cfp.is_autodiscradblank_normal = b_value ? 1 : 0; itmDiscardBlkVince.Get(i, b_value); @@ -428,6 +472,10 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str cfp.fillhole.is_fillhole = b_value ? 1 : 0; itmOutHoleRatio.Get(i, i_value); cfp.fillhole.fillholeratio = i_value; + itmDetachNoise.Get(i, b_value); + cfp.detachnoise.is_detachnoise = b_value ? 1 : 0; + itmDetachNoiseValue.Get(i, i_value); + cfp.detachnoise.detachnoise = i_value; itmHsvCorrect.Get(i, b_value); cfp.hsvcorrect = b_value ? 1 : 0; @@ -439,10 +487,18 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str cfp.scannum = i_value; itmDocOrientation.Get(i, i_value); cfp.imageRotateDegree = i_value; + itmAutoCrop_t.Get(i, i_value); + cfp.AutoCrop_threshold = i_value; + itmNoise.Get(i, i_value); + cfp.noise = i_value; + itmIndent.Get(i, i_value); + cfp.indent = i_value; itmAutotext.Get(i, b_value); cfp.is_autotext = b_value?1:0; itmBackRotate.Get(i, b_value); cfp.is_backrotate180 = b_value ? 1 : 0; + itmisConvex.Get(i, b_value); + cfp.is_convex = b_value ? 1 : 0; itmdogeardetection.Get(i, b_value); cfp.is_dogeardetection = b_value ? 1 : 0; itmScrewDetct.Get(i, b_value); @@ -487,6 +543,8 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str cfp.is_autodiscradblank_normal = bvalue?1:0; root["Config"].Get(DISCARBLANKVINCE, bvalue); cfp.is_autodiscradblank_vince = bvalue?1:0; + root["Config"].Get(DISCARBLANK_VALUE, index); + cfp.discardblank_percent = index ; //root["Config"].Get(DB_AREANUM, index); //cfp.DBlank_AreaNum = index; //root["Config"].Get(DB_DEVNMAX, index); @@ -521,9 +579,18 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str cfp.fillhole.is_fillhole = bvalue?1:0; root["Config"].Get(OUTHOLERATIO, index); cfp.fillhole.fillholeratio = index; + root["Config"].Get(DETACHNOISE, bvalue); + cfp.detachnoise.is_detachnoise = bvalue ? 1 : 0; + root["Config"].Get(DETACHNOISEVALUE, index); + cfp.detachnoise.detachnoise = index; root["Config"].Get(HSVCORRECT, bvalue); cfp.hsvcorrect = bvalue ? 1 : 0; - + root["Config"].Get(NOISE, index); + cfp.noise = index; + root["Config"].Get(INDENT, index); + cfp.indent = index; + root["Config"].Get(AUTOCROP_THRESHOLD, index); + cfp.AutoCrop_threshold = index; root["Config"].Get(ULTRADETECT, bvalue); cfp.hardwarecaps.en_doublefeed = bvalue?1:0; @@ -537,6 +604,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(ISCONVEX, bvalue); + cfp.is_convex = bvalue ? 1 : 0; root["Config"].Get(DOGEAR_DETECTION, bvalue); cfp.is_dogeardetection = bvalue ? 1 : 0; root["Config"].Get(SCREWDETECT, bvalue); diff --git a/huagao/ImageProcess/ImageApplyAutoCrop.cpp b/huagao/ImageProcess/ImageApplyAutoCrop.cpp index 5fc5f12e..accd9f88 100644 --- a/huagao/ImageProcess/ImageApplyAutoCrop.cpp +++ b/huagao/ImageProcess/ImageApplyAutoCrop.cpp @@ -1,8 +1,6 @@ #include "ImageApplyAutoCrop.h" #include "ImageProcess_Public.h" -#define RE 2 - CImageApplyAutoCrop::CImageApplyAutoCrop() : m_isCrop(false) , m_isDesaskew(false) @@ -32,45 +30,27 @@ CImageApplyAutoCrop::~CImageApplyAutoCrop() void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side) { -#ifdef LOG - FileTools::write_log("imgprc.txt", "enter CImageApplyAutoCrop apply"); -#endif // LOG - if (pDib.empty()) - { -#ifdef LOG - FileTools::write_log("imgprc.txt", "exit CImageApplyAutoCrop apply"); -#endif // LOG - return; - } + (void)side; + if (pDib.empty()) return; + if (!m_isCrop && !m_isDesaskew && !m_isFillBlank && m_fixedSize.empty()) return; cv::Mat src = pDib; + cv::Mat thre; cv::Mat dst; - cv::Mat src_resize; - cv::resize(src, src_resize, cv::Size(src.cols / RE, src.rows / RE)); - cv::Mat scale_mat; - cv::Mat thre(src_resize.size(), CV_8UC1); - hg::threshold_Mat(src_resize, thre, m_threshold); - src_resize.release(); + hg::threshold_Mat(src, thre, m_threshold); - if (m_noise > RE) + if (m_noise > 0) { - cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(m_noise / RE, m_noise / RE)); + cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(m_noise, m_noise)); cv::morphologyEx(thre, thre, cv::MORPH_OPEN, element); - element.release(); } std::vector hierarchy; std::vector> contours; hg::findContours(thre, contours, hierarchy, cv::RETR_EXTERNAL); - std::vector maxContour = hg::getMaxContour(contours, hierarchy); + m_maxContour = hg::getMaxContour(contours, hierarchy); - for (cv::Point& item : maxContour) - { - item.x = item.x * RE - RE / 2; - item.y = item.y * RE - RE / 2; - } - - if (maxContour.size() == 0) + if (m_maxContour.size() == 0) { thre.release(); #ifdef LOG @@ -81,9 +61,14 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side) thre.release(); dst.release(); - cv::RotatedRect rect = hg::getBoundingRect(maxContour); + cv::RotatedRect rect = hg::getBoundingRect(m_maxContour); + cv::Rect boudingRect = cv::boundingRect(m_maxContour); + boudingRect.x -= 1; + boudingRect.y -= 1; + boudingRect.width += 2; + boudingRect.height += 2; - if (m_isDesaskew) + if (m_isDesaskew && rect.angle != 0) { cv::Point2f srcTri[4]; cv::Point2f dstTri[3]; @@ -92,57 +77,71 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side) dstTri[0] = cv::Point2f(0, rect.size.height - 1); dstTri[1] = cv::Point2f(0, 0); dstTri[2] = cv::Point2f(rect.size.width - 1, 0); - cv::Mat warp_mat; warp_mat = cv::getAffineTransform(srcTri, dstTri); cv::warpAffine(src, dst, warp_mat, rect.size); } else - dst = src(rect.boundingRect() & cv::Rect(0, 0, src.cols, src.rows)); + dst = src(boudingRect & cv::Rect(0, 0, src.cols, src.rows)); + + m_maxContour.clear(); + m_maxContour.push_back(cv::Point(-1, dst.rows)); + m_maxContour.push_back(cv::Point(-1, -1)); + m_maxContour.push_back(cv::Point(dst.cols, -1)); + m_maxContour.push_back(cv::Point(dst.cols, dst.rows)); if (m_isFillBlank) { cv::Mat thre_dst; hg::threshold_Mat(dst, thre_dst, m_threshold); - cv::erode(thre_dst, thre_dst, cv::Mat(), cv::Point(-1, -1), m_indent); + + if (m_indent > 0) + { + std::vector rectEdge{ cv::Point(0, 0) ,cv::Point(thre_dst.cols - 1, 0), + cv::Point(thre_dst.cols - 1, thre_dst.rows - 1), cv::Point(0, thre_dst.rows - 1) }; + std::vector> rectEdges{ rectEdge }; + cv::drawContours(thre_dst, rectEdges, 0, cv::Scalar::all(0)); + cv::Mat element = cv::getStructuringElement(cv::MorphShapes::MORPH_RECT, cv::Size(m_indent * 2, m_indent * 2)); + cv::erode(thre_dst, thre_dst, element, cv::Point(-1, -1), 1); + } hierarchy.clear(); contours.clear(); - maxContour.clear(); + m_maxContour.clear(); + hg::findContours(thre_dst, contours, hierarchy, cv::RETR_EXTERNAL); - thre_dst.release(); - - maxContour = hg::getMaxContour(contours, hierarchy); if (m_isConvexHull) - hg::convexHull(maxContour, maxContour); + { + m_maxContour = hg::getMaxContour(contours, hierarchy); + hg::convexHull(m_maxContour, m_maxContour); + contours.clear(); + contours.push_back(m_maxContour); + } - contours.clear(); - contours.resize(2); - contours[0] = maxContour; - contours[1].push_back(cv::Point(0, dst.rows - 1)); - contours[1].push_back(cv::Point(0, 0)); - contours[1].push_back(cv::Point(dst.cols - 1, 0)); - contours[1].push_back(cv::Point(dst.cols - 1, dst.rows - 1)); + contours.push_back(std::vector()); + contours[contours.size() - 1].push_back(cv::Point(-1, dst.rows - 1)); + contours[contours.size() - 1].push_back(cv::Point(-1, -1)); + contours[contours.size() - 1].push_back(cv::Point(dst.cols, -1)); + contours[contours.size() - 1].push_back(cv::Point(dst.cols, dst.rows)); hg::fillPolys(dst, contours, cv::Scalar(255, 255, 255)); } pDib.release(); - if ((m_isCrop && side == 0) || (side == 1 && m_fixedSize.width * m_fixedSize.height == 0)) - { + if (/*(m_isCrop && side == 0) || (side == 1 && m_fixedSize.width * m_fixedSize.height == 0)*/ m_isCrop) pDib = dst.clone(); - dst.release(); - } else { +#if 0 if (m_isCrop && side == 1 && !m_fixedSize.empty()) if (std::abs(m_fixedSize.width - dst.cols) > 50 || std::abs(m_fixedSize.height - dst.rows) > 50) { - pDib = dst.clone(); + pDib = dst.clone(); #ifdef LOG FileTools::write_log("imgprc.txt", "exit CImageApplyAutoCrop apply"); #endif // LOG return; } +#endif pDib = cv::Mat(m_fixedSize, dst.type(), m_isFillBlank ? cv::Scalar(255, 255, 255) : cv::Scalar(0, 0, 0)); cv::Rect roi; @@ -151,18 +150,20 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side) roi.y = dst.rows > pDib.rows ? (dst.rows - pDib.rows) / 2 : 0; roi.height = cv::min(pDib.rows, dst.rows); cv::Rect rect((pDib.cols - roi.width) / 2, (pDib.rows - roi.height) / 2, roi.width, roi.height); + + for (cv::Point& p : m_maxContour) + p += roi.tl(); #if 0 - std::string outrectinfo ="copy to rect x: "+std::to_string(rect.x) + "y: "+std::to_string(rect.y) + "width: "+std::to_string(rect.width) + "height: "+std::to_string(rect.height); + std::string outrectinfo = "copy to rect x: " + std::to_string(rect.x) + "y: " + std::to_string(rect.y) + "width: " + std::to_string(rect.width) + "height: " + std::to_string(rect.height); std::string outroiinfo = "roi x: " + std::to_string(roi.x) + "y: " + std::to_string(roi.y) + "width: " + std::to_string(roi.width) + "height: " + std::to_string(roi.height); std::string dstsize = "dst size: width:" + std::to_string(dst.cols) + "height: " + std::to_string(dst.rows); - std::string pDibszie= "pDib size: width: " + std::to_string(pDib.cols) + "height: " + std::to_string(pDib.rows); + std::string pDibszie = "pDib size: width: " + std::to_string(pDib.cols) + "height: " + std::to_string(pDib.rows); FileTools::write_log("imgprc.txt", dstsize); FileTools::write_log("imgprc.txt", pDibszie); FileTools::write_log("imgprc.txt", outrectinfo); FileTools::write_log("imgprc.txt", outroiinfo); #endif // LOG dst(roi).copyTo(pDib(rect)); - dst.release(); } #ifdef LOG @@ -175,23 +176,18 @@ void CImageApplyAutoCrop::apply(std::vector& mats, bool isTwoSide) if (mats.empty()) return; if (!mats[0].empty()) { apply(mats[0], 0); - //cv::imwrite("1.bmp", mats[0]); } - if (isTwoSide && mats.size() > 1) { cv::Size dSize = m_fixedSize; if (!mats[0].empty()) m_fixedSize = mats[0].size(); - if (!mats[1].empty()) { apply(mats[1], 1); - //cv::imwrite("1.bmp", mats[0]); } - if (!mats[0].empty()) m_fixedSize = dSize; } -} \ No newline at end of file +} diff --git a/huagao/ImageProcess/ImageApplyAutoCrop.h b/huagao/ImageProcess/ImageApplyAutoCrop.h index 81bed3f6..08028944 100644 --- a/huagao/ImageProcess/ImageApplyAutoCrop.h +++ b/huagao/ImageProcess/ImageApplyAutoCrop.h @@ -1,13 +1,41 @@ +/* + * ==================================================== + + * 功能:自动裁剪、纠偏、除黑底 + * 作者:刘丁维 + * 生成时间:2020/4/21 + * 最近修改时间:2020/4/21 v1.0 + 2020/7/22 v1.1 增加获取图像有效区域轮廓的接口maxContour(用于配合一体机的“跳过空白页”算法,PC端暂时无需使用) + 2020/10/16 v1.2 修复自动裁剪尺寸精度丢失的BUG;提高除黑底缩进精度。 + 2020/10/28 v1.2.1 修复凹凸多边形填充背景的逻辑BUG。 + 2020/10/28 v1.2.2 修复图像处理必定会缩小尺寸的BUG。 + 2020/10/29 v1.2.3 避免无谓的纠偏(0°纠偏)。 + 2020/11/09 v1.2.4 避免无谓的处理(裁剪、纠偏、除黑底均为false) + * 版本号:v1.2.4 + + * ==================================================== + */ + #ifndef IMAGE_APPLY_AUTO_CROP_H #define IMAGE_APPLY_AUTO_CROP_H #include "ImageApply.h" -class CImageApplyAutoCrop : public CImageApply +class CImageApplyAutoCrop : public CImageApply { public: CImageApplyAutoCrop(); + /* + * isCrop [in]:自动幅面裁剪使能,true自动裁剪,false为固定裁剪 + * isDesaskew [in]:自动纠偏使能,true自动纠偏,false为不纠偏 + * isFillBlank [in]:黑底填充使能,true为填充,false为不填充 + * fixedSize [in]:固定幅面尺寸,当isCrop为false时生效,结果尺寸按fixedSize大小输出,单位像素 + * isConvex [in]:黑底填充时的填充方式,true为凸多边形填充,false为凹多边形填充,默认true + * threshold [in]:二值化阈值,取值范围(0, 255),默认40 + * noise [in]:除噪像素,能够消除noise宽度的背景竖条纹干扰,默认40 + * indent [in]:轮廓缩进,裁剪、纠偏或者黑底填充时,对探索到的纸张轮廓进行缩进indent像素,默认5 + */ CImageApplyAutoCrop(bool isCrop, bool isDesaskew, bool isFillBlank, const cv::Size& fixedSize, bool isConvex = true, double threshold = 40, int noise = 40, int indent = 5); virtual ~CImageApplyAutoCrop(); @@ -64,5 +92,3 @@ private: }; #endif // !IMAGE_APPLY_AUTO_CROP_H - - diff --git a/huagao/ImageProcess/ImageApplyBWBinaray.cpp b/huagao/ImageProcess/ImageApplyBWBinaray.cpp index 7dfee1da..4bd73cf2 100644 --- a/huagao/ImageProcess/ImageApplyBWBinaray.cpp +++ b/huagao/ImageProcess/ImageApplyBWBinaray.cpp @@ -56,8 +56,10 @@ void CImageApplyBWBinaray::apply(cv::Mat& pDib, int side) int* idata2 = integ.ptr(j + halfSize + 1); for (int i = halfSize; i < integ.cols - halfSize - 1; i++) { - if (data[i] < low) data[i] = 0; - else if (data[i] > up) data[i] = 255; + if (data[i] < low) + data[i] = 0; + else if (data[i] > up) + data[i] = 255; else data[i] = data[i] < ((idata2[i + halfSize + 1] - idata2[i - halfSize] - idata1[i + halfSize + 1] + idata1[i - halfSize]) / square_blockSize - threshold) ? 0 : 255; } diff --git a/huagao/ImageProcess/ImageApplyDetachNoise.h b/huagao/ImageProcess/ImageApplyDetachNoise.h index 1238afbe..c795b8e2 100644 --- a/huagao/ImageProcess/ImageApplyDetachNoise.h +++ b/huagao/ImageProcess/ImageApplyDetachNoise.h @@ -19,7 +19,7 @@ class CImageApplyDetachNoise : public CImageApply { public: - CImageApplyDetachNoise(int noise = 4); + CImageApplyDetachNoise(int noise = 1); inline int getNoise() { return m_noise; } diff --git a/huagao/ImageProcess/ImageApplyDiscardBlank.cpp b/huagao/ImageProcess/ImageApplyDiscardBlank.cpp index 02052262..81a7e846 100644 --- a/huagao/ImageProcess/ImageApplyDiscardBlank.cpp +++ b/huagao/ImageProcess/ImageApplyDiscardBlank.cpp @@ -111,7 +111,7 @@ cv::Mat CImageApplyDiscardBlank::getRoiMat(const cv::Mat& image) processRectR(image, rect, contour, scale, thresh, blobSize); cv::Rect rect2 = rect.boundingRect(); cv::Rect inRect = rect2 & cv::Rect(0, 0, image.cols, image.rows); - gap = cv::max(inRect.width - rect.size.width, inRect.height - rect.size.height) + 100; + gap = cv::max(inRect.width - rect.size.width, inRect.height - rect.size.height) + 20; inRect = cv::Rect(inRect.x + gap, inRect.y + gap, inRect.width - gap * 2, inRect.height - gap * 2); return image(inRect); } diff --git a/huagao/ImageProcess/ImageApplyHeaders.h b/huagao/ImageProcess/ImageApplyHeaders.h index 10a5f972..b581c0e4 100644 --- a/huagao/ImageProcess/ImageApplyHeaders.h +++ b/huagao/ImageProcess/ImageApplyHeaders.h @@ -15,5 +15,6 @@ #include "ImageApplySharpen.h" #include "ImageApplyConcatenation.h" #include "ImageApplyHSVCorrect.h" +#include "ImageApplyDetachNoise.h" #endif diff --git a/huagao/ImageProcess/ImageApplyRotation.cpp b/huagao/ImageProcess/ImageApplyRotation.cpp index a5554f2b..78f2e517 100644 --- a/huagao/ImageProcess/ImageApplyRotation.cpp +++ b/huagao/ImageProcess/ImageApplyRotation.cpp @@ -104,8 +104,16 @@ void CImageApplyRotation::apply(cv::Mat & pDib, int side) { if (m_rotation == RotationType::Rotate_90_clockwise || m_rotation == RotationType::Rotate_90_anti_clockwise) //90�� -90�� { - transpose(pDib, pDib); - flip(pDib, pDib, m_rotation == RotationType::Rotate_90_clockwise ? 1 : 0); + if (side == 0) + { + transpose(pDib, pDib); + flip(pDib, pDib, m_rotation == RotationType::Rotate_90_clockwise ? 1 : 0); + } + else + { + transpose(pDib, pDib); + flip(pDib, pDib, m_rotation == RotationType::Rotate_90_clockwise ? 0 : 1); + } } else if (m_rotation == RotationType::Rotate_180) { diff --git a/huagao/huagaods.cpp b/huagao/huagaods.cpp index 21ff8167..aeac6c77 100644 --- a/huagao/huagaods.cpp +++ b/huagao/huagaods.cpp @@ -7,10 +7,8 @@ #endif #include - #include "huagaods.hpp" #include "twglue.hpp" - #include "resource.h" #include "CTwainUI.h" #include "CIndicatorDlg.h" @@ -44,7 +42,13 @@ enum class CapTypeEx : unsigned short { TwEx_UVModel = 0x8093, TwEx_SwitchFrontBack = 0x8094, TwEx_HsvCorrect = 0x8095, - TwEx_DogEarDelection=0x8096, + TwEx_DogEarDelection = 0x8096, + TwEx_FillBacngroundMode = 0x8097, + TwEx_CroporDesaskewIndent = 0x8098, + TwEx_CropNoise=0x8099, + TwEx_CroporDesaskewThreshold=0x8100, + TwEx_IDetachNoise = 0x8101, + TwEx_IDetachNoiseValue = 0x8102, }; using namespace Twpp; @@ -89,7 +93,12 @@ static constexpr const Identity srcIdent( #endif #elif defined(G400) // G200 - "G400 Series", + #ifdef LANXUM + "G4260F Series", + #else // ISG100 + "G400 Series", + #endif + #endif #ifdef G200 @@ -115,10 +124,12 @@ static constexpr const Identity srcIdent( "ZhibenScan G300 TWAIN" #endif #elif defined(G400) // G200 - #ifndef MAKEHUAGAO - "ZhibenScan G400 TWAIN" - #else // !MAKEHUAGAO + #ifdef MAKEHUAGAO "HUAGOSCAN G400 TWAIN" + #elif defined LANXUM //!LANXUM + "LANXUM G52XXF TWAIN" + #else // !MAKEHUAGAO + "ZhibenScan G400 TWAIN" #endif #endif @@ -136,7 +147,13 @@ static constexpr UInt32 RESOLUTIONX = 85; //static std::unique_ptr application(new CWinApp()); +#ifdef LANXUM +static list resList = { 100.0,150.0,200.0,240.0,300.0 }; +#else static list resList = { 100.0,150.0,200.0,240.0,300.0,600.0 }; +#endif // LANXUM + + //G200 G300G400ֽŷ #ifdef G200 @@ -152,7 +169,7 @@ static list paperSizeList = { (UInt16)PaperSize::A4,(UInt16)PaperSize::A 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 }; + (UInt16)PaperSize::None }; #endif // G200 static list imageRotateList = { 0.0,90.0,180.0,270.0 }; @@ -235,6 +252,7 @@ const Identity& HuagaoDs::defaultIdentity() noexcept { Result HuagaoDs::call(const Identity& origin, DataGroup dg, Dat dat, Msg msg, void* data) { try { // we can override almost anything from SourceFromThis, even the top-most source instance call + //FileTools::write_log("D:\\1.txt", "call:datagroup-"+to_string((int)dg)+"dat-"+to_string(int(dat))+"msg-"+to_string(int(msg))); return Base::call(origin, dg, dat, msg, data); } catch (const CapabilityException&) { @@ -444,9 +462,13 @@ Result HuagaoDs::eventProcess(const Identity&, Event& event) { if (guiTwain) { // // QApplication::processEvents(); - TODO: needs more investigation; results in freeze when attempting to scan using old DSM // QApplication::sendPostedEvents(); + //guiTwain->PostMessageW((UINT)(event.message())); guiTwain->SendMessage((UINT)(event.message())); } - event.setMessage(Msg::Null); + //if (inState(DsState::XferReady)) + // event.setMessage(Msg::XferReady); + //else + event.setMessage(Msg::Null); return { ReturnCode::NotDsEvent, ConditionCode::Success }; } @@ -850,10 +872,15 @@ Result HuagaoDs::identityOpenDs(const Identity&) { } } 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 + (UInt16)PaperSize::IsoB5,(UInt16)PaperSize::IsoB6,(UInt16)PaperSize::UsLetter, + (UInt16)PaperSize::UsLegal,(UInt16)PaperSize::None #ifndef G300 +#if define G200 ,(UInt16)PaperSize::UsLedger,(UInt16)PaperSize::IsoB4, (UInt16)PaperSize::MaxSize,(UInt16)PaperSize::UsStatement +#elif define G400 + ,(UInt16)PaperSize::UsLedger,(UInt16)PaperSize::IsoB4 +#endif #endif // }, index == -1 ? 0 : index, @@ -1051,7 +1078,7 @@ Result HuagaoDs::identityOpenDs(const Identity&) { switch (msg) { case Msg::Get: data = Capability::createEnumeration( - { Bool(), Bool(true) }, Bool(m_bIndicator)); + { Bool(true), Bool(false) }, Bool(m_bIndicator),true); return success(); // fallthrough @@ -1612,7 +1639,111 @@ Result HuagaoDs::identityOpenDs(const Identity&) { return capBadOperation(); } }; + //üƫ + m_query[(CapType)(CapTypeEx::TwEx_CroporDesaskewIndent)] = msgSupportGetAllSetReset; + m_caps[(CapType)(CapTypeEx::TwEx_CroporDesaskewIndent)] = [this](Msg msg, Capability& data)->Result { + switch (msg) { + case Msg::Get: + data = Capability::createEnumeration((CapType)(CapTypeEx::TwEx_CroporDesaskewIndent), m_scanparam->indent); + return success(); + case Msg::GetCurrent: + data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_CroporDesaskewIndent), m_scanparam->indent); + return success(); + case Msg::Reset: + case Msg::GetDefault: + m_scanparam->indent = 5; + data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_CroporDesaskewIndent), UInt8(5)); + return success(); + case Msg::Set: { + auto mech = data.currentItem(); + + if (mech > 30 || mech < 5) + return badValue(); + m_scanparam->indent = mech; + return success(); + } + default: + return capBadOperation(); + } + }; + //Զü + m_query[(CapType)(CapTypeEx::TwEx_CropNoise)] = msgSupportGetAllSetReset; + m_caps[(CapType)(CapTypeEx::TwEx_CropNoise)] = [this](Msg msg, Capability& data)->Result { + switch (msg) { + case Msg::Get: + data = Capability::createEnumeration((CapType)(CapTypeEx::TwEx_CropNoise), m_scanparam->noise); + return success(); + case Msg::GetCurrent: + data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_CropNoise), m_scanparam->noise); + return success(); + case Msg::Reset: + case Msg::GetDefault: + m_scanparam->noise = 40; + data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_CropNoise), UInt8(40)); + return success(); + case Msg::Set: { + auto mech = data.currentItem(); + if (mech > 50 || mech < 30) + return badValue(); + m_scanparam->noise = mech; + return success(); + } + default: + return capBadOperation(); + } + }; + //Զк;ƫĶֵֵ + m_query[(CapType)(CapTypeEx::TwEx_CroporDesaskewThreshold)] = msgSupportGetAllSetReset; + m_caps[(CapType)(CapTypeEx::TwEx_CroporDesaskewThreshold)] = [this](Msg msg, Capability& data)->Result { + switch (msg) { + case Msg::Get: + data = Capability::createEnumeration((CapType)(CapTypeEx::TwEx_CroporDesaskewThreshold), m_scanparam->AutoCrop_threshold); + return success(); + case Msg::GetCurrent: + data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_CroporDesaskewThreshold), m_scanparam->AutoCrop_threshold); + return success(); + case Msg::Reset: + case Msg::GetDefault: + m_scanparam->AutoCrop_threshold = 40; + data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_CroporDesaskewThreshold), UInt8(40)); + return success(); + case Msg::Set: { + auto mech = data.currentItem(); + + if (mech > 50 || mech < 30) + return badValue(); + m_scanparam->AutoCrop_threshold = mech; + return success(); + } + default: + return capBadOperation(); + } + }; + //ڿ䷽ʽ + m_query[(CapType)(CapTypeEx::TwEx_FillBacngroundMode)] = msgSupportGetAllSetReset; + m_caps[(CapType)(CapTypeEx::TwEx_FillBacngroundMode)] = [this](Msg msg, Capability& data)->Result { + switch (msg) { + case Msg::Get: + data = Capability::createEnumeration((CapType)(CapTypeEx::TwEx_FillBacngroundMode), { Bool(),Bool(true) }, Bool(m_scanparam->is_convex), true); + return success(); + case Msg::GetCurrent: + data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_FillBacngroundMode), m_scanparam->is_convex); + return success(); + case Msg::GetDefault: + case Msg::Reset: + m_scanparam->is_convex = true; + data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_FillBacngroundMode), Bool(true)); + return success(); + case Msg::Set: { + auto mech = data.currentItem(); + m_scanparam->is_convex = mech; + return success(); + } + default: + return capBadOperation(); + } + }; // m_query[(CapType)(CapTypeEx::TwEx_IFillHole)] = msgSupportGetAllSetReset; m_caps[(CapType)(CapTypeEx::TwEx_IFillHole)] = [this](Msg msg, Capability& data)->Result { @@ -1665,6 +1796,63 @@ Result HuagaoDs::identityOpenDs(const Identity&) { } }; + //Ż + m_query[(CapType)(CapTypeEx::TwEx_IDetachNoise)] = msgSupportGetAllSetReset; + m_caps[(CapType)(CapTypeEx::TwEx_IDetachNoise)] = [this](Msg msg, Capability& data)->Result { + switch (msg) { + case Msg::Get: + data = Capability::createEnumeration((CapType)(CapTypeEx::TwEx_IDetachNoise), { Bool(),Bool(true) }, Bool(m_scanparam->fillhole.is_fillhole), 0); + return success(); + case Msg::GetCurrent: + data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_IDetachNoise), m_scanparam->detachnoise.is_detachnoise); + return success(); + case Msg::GetDefault: + case Msg::Reset: + m_scanparam->detachnoise.is_detachnoise = false; + data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_IDetachNoise), Bool(false)); + return success(); + case Msg::Set: { + if (m_scanparam->pixtype != 0) + return badValue(); + auto mech = data.currentItem(); + m_scanparam->detachnoise.is_detachnoise = mech; + return success(); + } + default: + return capBadOperation(); + } + }; + + m_query[(CapType)(CapTypeEx::TwEx_IDetachNoiseValue)] = msgSupportGetAllSetReset; + m_caps[(CapType)(CapTypeEx::TwEx_IDetachNoiseValue)] = [this](Msg msg, Capability& data)->Result { + switch (msg) { + case Msg::Get: + data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_IDetachNoiseValue), m_scanparam->detachnoise.detachnoise); + return success(); + case Msg::GetCurrent: + data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_IDetachNoiseValue), m_scanparam->detachnoise.detachnoise); + return success(); + case Msg::GetDefault: + case Msg::Reset: + m_scanparam->fillhole.fillholeratio = 10; + data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_IDetachNoiseValue), Int32(3)); + return success(); + case Msg::Set: { + if (m_scanparam->detachnoise.is_detachnoise) + { + auto mech = data.currentItem(); + if (mech > 9 && mech < 51) { + m_scanparam->detachnoise.detachnoise = (int)mech; + return success(); + } + } + return badValue(); + } + default: + return capBadOperation(); + } + }; + // m_query[(CapType)(CapTypeEx::TwEx_IMultiOutputRed)] = msgSupportGetAllSetReset; m_caps[(CapType)(CapTypeEx::TwEx_IMultiOutputRed)] = [this](Msg msg, Capability& data)->Result { @@ -2189,6 +2377,24 @@ Result HuagaoDs::userInterfaceEnable(const Identity&, UserInterface& ui) { m_pendingXfers = 1; m_memXferYOff = 0; scanner->ResetMsgFiter(); + + //if (m_capXferMech == Twpp::XferMech::Native) + //{ + // MessageBox(NULL, TEXT("Native"), _T("bb"), MB_OK); + //} + //else if (m_capXferMech == Twpp::XferMech::File) + //{ + // MessageBox(NULL, TEXT("File"), _T("bb"), MB_OK); + + //} + //else if (m_capXferMech == Twpp::XferMech::Memory) + //{ + // MessageBox(NULL, TEXT("Memory"), _T("bb"), MB_OK); + //} + //else + //{ + // MessageBox(NULL, TEXT("MemoryFile"), _T("bb"), MB_OK); + //} if (!ui.showUi()) { // this is an exception when we want to set state explicitly, notifyXferReady can be called only in enabled state // with hidden UI, the usual workflow DsState::Enabled -> notifyXferReady() -> DsState::XferReady is a single step @@ -2196,16 +2402,16 @@ Result HuagaoDs::userInterfaceEnable(const Identity&, UserInterface& ui) { auto ret = startScan(); if (ret.status().condition() == Twpp::CC::NoMedia) return ret; - //if (ret == success()) { - //m_pendingXfers = 1; + 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); @@ -2368,11 +2574,9 @@ Result HuagaoDs::imageNativeXferGet(const Identity& id, ImageNativeXfer& data) { data = ImageNativeXfer(bmpSize()); std::copy(bmpBegin(), bmpEnd(), data.data().data()); bmpData.reset(new std::vector); -#ifdef LOG_NORMAL -#endif // LOG //std::string info = "Twain transfered num of " + to_string(++xtfer)+" images"; - //FileTools::write_log("D:\\1.txt", info); + FileTools::write_log("Twain transfered num of " + to_string(++xtfer) + " images"); return { ReturnCode::XferDone, ConditionCode::Success }; } @@ -2386,7 +2590,6 @@ Twpp::Result HuagaoDs::pendingXfersStopFeeder(const Identity& origin, PendingXfe } data.setCount(scanner->Get_IsImageQueueEmpty() ? 0 : 1); - //FileTools::write_log("D:\\1.txt", "pendingXfersStopFeeder exit"); return success(); } @@ -2613,7 +2816,49 @@ Twpp::Result HuagaoDs::startScan() } scanner->ResetScanner(); - + std::string info = "\n m_scanparam->is_autocrop :" + to_string(m_scanparam->is_autocrop); + info += "\n m_scanparam->papertype :" + to_string(m_scanparam->papertype); + info += "\n m_scanparam->fillbackground :" + to_string(m_scanparam->fillbackground); + info += "\n m_scanparam->autodescrew :" + to_string(m_scanparam->autodescrew); + info += "\n m_scanparam->brightness :" + to_string(m_scanparam->brightness); + info += "\n m_scanparam->Caption :" + m_scanparam->Caption; + info += "\n m_scanparam->contrast :" + to_string(m_scanparam->contrast); + info += "\n m_scanparam->discardblank_percent :" + to_string(m_scanparam->discardblank_percent); + info += "\n m_scanparam->enhance_color :" + to_string(m_scanparam->enhance_color); + info += "\n m_scanparam->en_fold :" + to_string(m_scanparam->en_fold); + info += "\n m_scanparam->hardwarecaps.capturepixtype :" + to_string(m_scanparam->hardwarecaps.capturepixtype); + info += "\n m_scanparam->hardwarecaps.en_doublefeed :" + to_string(m_scanparam->hardwarecaps.en_doublefeed); + info += "\n m_scanparam->hardwarecaps.en_stapledetect :" + to_string(m_scanparam->hardwarecaps.en_stapledetect); + info += "\n m_scanparam->hardwarecaps.en_skrewdetect :" + to_string(m_scanparam->hardwarecaps.en_skrewdetect); + info += "\n m_scanparam->hardwarecaps.skrewdetectlevel :" + to_string(m_scanparam->hardwarecaps.skrewdetectlevel); + info += "\n m_scanparam->imageRotateDegree :" + to_string(m_scanparam->imageRotateDegree); + info += "\n m_scanparam->is_duplex :" + to_string(m_scanparam->is_duplex); + info += "\n m_scanparam->pixtype :" + to_string(m_scanparam->pixtype); + info += "\n m_scanparam->resolution_dst :" + to_string(m_scanparam->resolution_dst); + info += "\n m_scanparam->resolution_native :" + to_string(m_scanparam->resolution_native); + info += "\n m_scanparam->paperAlign :" + to_string((int)m_scanparam->paperAlign); + info += "\n m_scanparam->gamma :" + to_string(m_scanparam->gamma); + info += "\n m_scanparam->threshold :" + to_string(m_scanparam->threshold); + info += "\n m_scanparam->is_autocontrast :" + to_string(m_scanparam->is_autocontrast); + info += "\n m_scanparam->is_autocrop :" + to_string(m_scanparam->is_autocrop); + info += "\n m_scanparam->fillhole.fillholeratio :" + to_string(m_scanparam->fillhole.fillholeratio); + info += "\n m_scanparam->fillhole.is_fillhole :" + to_string(m_scanparam->fillhole.is_fillhole); + info += "\n m_scanparam->is_autodiscradblank_normal :" + to_string(m_scanparam->is_autodiscradblank_normal); + info += "\n m_scanparam->is_autodiscradblank_vince :" + to_string(m_scanparam->is_autodiscradblank_vince); + info += "\n m_scanparam->is_switchfrontback :" + to_string(m_scanparam->is_switchfrontback); + info += "\n m_scanparam->multi_output_red :" + to_string(m_scanparam->multi_output_red); + info += "\n m_scanparam->hsvcorrect :" + to_string(m_scanparam->hsvcorrect); + info += "\n m_scanparam->filter :" + to_string(m_scanparam->filter); + info += "\n m_scanparam->sharpen :" + to_string(m_scanparam->sharpen); + info += "\n m_scanparam->scannum :" + to_string(m_scanparam->scannum); + info += "\n m_scanparam->is_backrotate180 :" + to_string(m_scanparam->is_backrotate180); + info += "\n m_scanparam->is_autotext :" + to_string(m_scanparam->is_autotext); + info += "\n m_scanparam->SavePath :" + m_scanparam->SavePath; + info += "\n m_scanparam->noise :" + to_string(m_scanparam->noise); + info += "\n m_scanparam->indent :" + to_string(m_scanparam->indent); + info += "\n m_scanparam->AutoCrop_threshold :" + to_string(m_scanparam->AutoCrop_threshold); + info += "\n m_scanparam->is_convex :" + to_string(m_scanparam->is_convex); + FileTools::write_log(info); #ifndef G200 scanner->clear_hwerror(); #endif // diff --git a/huagao/huagaotwds.rc b/huagao/huagaotwds.rc index ee890778..0833c2f8 100644 Binary files a/huagao/huagaotwds.rc and b/huagao/huagaotwds.rc differ diff --git a/huagao/resource.h b/huagao/resource.h index d5dde030..28574377 100644 Binary files a/huagao/resource.h and b/huagao/resource.h differ diff --git a/huagao/stdafx.h b/huagao/stdafx.h index 993a51d0..93eaf021 100644 Binary files a/huagao/stdafx.h and b/huagao/stdafx.h differ