2021.7.19 增加双张,卡纸等异常时删除图像功能

合并twain3351代码
This commit is contained in:
masayume 2021-07-19 18:36:34 +08:00
parent 7d0e35e591
commit d3c784a8b2
22 changed files with 404 additions and 240 deletions

View File

@ -42,7 +42,7 @@ BOOL CAdvancedDLG::OnInitDialog()
CTabPageSSL::OnInitDialog(); CTabPageSSL::OnInitDialog();
m_Edit_noise.SetSlideLink(this, IDC_SLIDER_NOISE); m_Edit_noise.SetSlideLink(this, IDC_SLIDER_NOISE);
m_Edit_noise.SetParams(5, 50, 2); m_Edit_noise.SetParams(1, 10, 1);
m_Edit_noise.SetValue(noise); m_Edit_noise.SetValue(noise);
m_Edit_indent.SetSlideLink(this, IDC_SLIDER_INDENT); m_Edit_indent.SetSlideLink(this, IDC_SLIDER_INDENT);

View File

@ -92,6 +92,7 @@ BEGIN_MESSAGE_MAP(CFeedPaperPage, CTabPageSSL)
ON_BN_CLICKED(IDC_RDCONSISTSCAN, &CFeedPaperPage::OnBnClickedScanMode) ON_BN_CLICKED(IDC_RDCONSISTSCAN, &CFeedPaperPage::OnBnClickedScanMode)
ON_BN_CLICKED(IDC_RDSPECIFYSCANNUM, &CFeedPaperPage::OnBnClickedScanMode) ON_BN_CLICKED(IDC_RDSPECIFYSCANNUM, &CFeedPaperPage::OnBnClickedScanMode)
ON_BN_CLICKED(IDC_CKSKEWDETECT, &CFeedPaperPage::OnBnClickedCkskewdetect) ON_BN_CLICKED(IDC_CKSKEWDETECT, &CFeedPaperPage::OnBnClickedCkskewdetect)
ON_CBN_SELCHANGE(IDC_CMBORENTATION, &CFeedPaperPage::OnCbnSelchangeCmborentation)
END_MESSAGE_MAP() END_MESSAGE_MAP()
BOOL CFeedPaperPage::PreTranslateMessage(MSG* pMsg) BOOL CFeedPaperPage::PreTranslateMessage(MSG* pMsg)
@ -131,6 +132,16 @@ void CFeedPaperPage::FeedPaperPageUpdate(int val)
// m_tempBtn->SetCheck(0); // m_tempBtn->SetCheck(0);
//BOOL enable = (val == 0 || val == 4); //BOOL enable = (val == 0 || val == 4);
//m_tempBtn->EnableWindow(!enable); //m_tempBtn->EnableWindow(!enable);
comboxduplux = val;
if ((val > 0) && (val < 4) && (m_cmBoxOrentation.GetCurSel() != 4))
{
((CButton*)(GetDlgItem(IDC_CKBACKROTATION)))->EnableWindow(TRUE);
}
else
{
((CButton*)(GetDlgItem(IDC_CKBACKROTATION)))->EnableWindow(FALSE);
((CButton*)(GetDlgItem(IDC_CKBACKROTATION)))->SetCheck(FALSE);
}
} }
void CFeedPaperPage::FeedAutoDescrewUpdate(int val) void CFeedPaperPage::FeedAutoDescrewUpdate(int val)
@ -160,3 +171,10 @@ void CFeedPaperPage::OnBnClickedCkskewdetect()
m_sldSkrewDetecttion.SetPos(3); m_sldSkrewDetecttion.SetPos(3);
m_sldSkrewDetecttion.EnableWindow(m_cbSkew); m_sldSkrewDetecttion.EnableWindow(m_cbSkew);
} }
void CFeedPaperPage::OnCbnSelchangeCmborentation()
{
// TODO: 在此添加控件通知处理程序代码
FeedPaperPageUpdate(comboxduplux);
}

View File

@ -42,6 +42,9 @@ protected:
private: private:
virtual BOOL PreTranslateMessage(MSG* pMsg); virtual BOOL PreTranslateMessage(MSG* pMsg);
int comboxduplux;
/*std::function<void()> m_datachange;*/ /*std::function<void()> m_datachange;*/
public:
afx_msg void OnCbnSelchangeCmborentation();
}; };

View File

@ -50,8 +50,10 @@ CImageProcPage::~CImageProcPage()
{ {
} }
void CImageProcPage::ImageProcPageUpdate(int val,bool is_Crop) void CImageProcPage::ImageProcPageUpdate(int val,int twss, int cmduplexsel,bool is_Crop)
{ {
this->twss = twss;
this->cmduplexsel = cmduplexsel;
CComboBox* m_temp = (CComboBox*)(GetDlgItem(IDC_CMBFILTER)); CComboBox* m_temp = (CComboBox*)(GetDlgItem(IDC_CMBFILTER));
CButton* t_chMultiOutput = (CButton*)(GetDlgItem(IDC_CKMULTIOUTPUT)); CButton* t_chMultiOutput = (CButton*)(GetDlgItem(IDC_CKMULTIOUTPUT));
CComboBox* m_temp_sharpen = (CComboBox*)(GetDlgItem(IDC_CMBSHARPEN)); CComboBox* m_temp_sharpen = (CComboBox*)(GetDlgItem(IDC_CMBSHARPEN));
@ -63,6 +65,12 @@ void CImageProcPage::ImageProcPageUpdate(int val,bool is_Crop)
{ {
((CButton*)GetDlgItem(IDC_ADVANCEDSET))->EnableWindow(false); ((CButton*)GetDlgItem(IDC_ADVANCEDSET))->EnableWindow(false);
} }
if (val == 0)
GetDlgItem(IDC_CKHSVCORRECT)->EnableWindow(TRUE);
else {
GetDlgItem(IDC_CKHSVCORRECT)->EnableWindow(FALSE);
((CButton*)GetDlgItem(IDC_CKHSVCORRECT))->SetCheck(FALSE);
}
if (0 == val||val==3)//彩色 if (0 == val||val==3)//彩色
{ {
m_temp->SetCurSel(0); m_temp->SetCurSel(0);
@ -88,11 +96,18 @@ void CImageProcPage::ImageProcPageUpdate(int val,bool is_Crop)
m_edit_detachnoise.EnableWindow(false); m_edit_detachnoise.EnableWindow(false);
m_slider_detachnoise.EnableWindow(false); m_slider_detachnoise.EnableWindow(false);
} }
//bool enabele = ival <= 1;//彩色或灰度 #ifndef G300
//if (!enabele) { if (twss == 19 || twss == 20 || (cmduplexsel == 4) || ((CButton*)GetDlgItem(IDC_CKFILLBLACKRECT))->GetCheck() || ((CButton*)GetDlgItem(IDC_CKAUTODESKREW))->GetCheck())
// m_temp_sharpen->SetCurSel(0); #else
//} if (twss == 8 || (cmduplexsel == 4) || ((CButton*)GetDlgItem(IDC_CKFILLBLACKRECT))->GetCheck() || ((CButton*)GetDlgItem(IDC_CKAUTODESKREW))->GetCheck())
//m_temp_sharpen->EnableWindow(enabele); #endif // !G300
{
((CButton*)GetDlgItem(IDC_CKCROPMODEL))->SetCheck(false);
((CButton*)GetDlgItem(IDC_CKCROPMODEL))->EnableWindow(false);
}
else
((CButton*)GetDlgItem(IDC_CKCROPMODEL))->EnableWindow(true);
} }
void CImageProcPage::ImageAutoDescrewUpdate(int val) void CImageProcPage::ImageAutoDescrewUpdate(int val)
@ -130,7 +145,7 @@ BOOL CImageProcPage::OnInitDialog()
m_edit_hole.SetValue(0.10); m_edit_hole.SetValue(0.10);
m_edit_detachnoise.SetSlideLink(this, IDC_SLIDERDETACHNOISE); m_edit_detachnoise.SetSlideLink(this, IDC_SLIDERDETACHNOISE);
m_edit_detachnoise.SetParams(0, 50, 10); m_edit_detachnoise.SetParams(10, 50, 10);
m_edit_detachnoise.SetValue(detachnoise); m_edit_detachnoise.SetValue(detachnoise);
((CButton*)GetDlgItem(IDC_CHECKDETACHNOISE))->SetCheck(is_detachnoise); ((CButton*)GetDlgItem(IDC_CHECKDETACHNOISE))->SetCheck(is_detachnoise);
@ -222,6 +237,17 @@ void CImageProcPage::OnBnClickedCkfillblackrect()
{ {
((CButton*)GetDlgItem(IDC_ADVANCEDSET))->EnableWindow(false); ((CButton*)GetDlgItem(IDC_ADVANCEDSET))->EnableWindow(false);
} }
#ifndef G300
if (twss == 19 || twss == 20 || (cmduplexsel == 4) || ((CButton*)GetDlgItem(IDC_CKFILLBLACKRECT))->GetCheck() || ((CButton*)GetDlgItem(IDC_CKAUTODESKREW))->GetCheck())
#else
if (twss == 8|| (cmduplexsel == 4) || ((CButton*)GetDlgItem(IDC_CKFILLBLACKRECT))->GetCheck() || ((CButton*)GetDlgItem(IDC_CKAUTODESKREW))->GetCheck())
#endif // !G300
{
((CButton*)GetDlgItem(IDC_CKCROPMODEL))->SetCheck(false);
((CButton*)GetDlgItem(IDC_CKCROPMODEL))->EnableWindow(false);
}
else
((CButton*)GetDlgItem(IDC_CKCROPMODEL))->EnableWindow(true);
} }
@ -234,6 +260,17 @@ void CImageProcPage::OnBnClickedCkautodeskrew()
{ {
((CButton*)GetDlgItem(IDC_ADVANCEDSET))->EnableWindow(false); ((CButton*)GetDlgItem(IDC_ADVANCEDSET))->EnableWindow(false);
} }
#ifndef G300
if (twss == 19 || twss == 20 || (cmduplexsel == 4) || ((CButton*)GetDlgItem(IDC_CKFILLBLACKRECT))->GetCheck() || ((CButton*)GetDlgItem(IDC_CKAUTODESKREW))->GetCheck())
#else
if (twss == 8 || (cmduplexsel == 4) || ((CButton*)GetDlgItem(IDC_CKFILLBLACKRECT))->GetCheck() || ((CButton*)GetDlgItem(IDC_CKAUTODESKREW))->GetCheck())
#endif // !G300
{
((CButton*)GetDlgItem(IDC_CKCROPMODEL))->SetCheck(false);
((CButton*)GetDlgItem(IDC_CKCROPMODEL))->EnableWindow(false);
}
else
((CButton*)GetDlgItem(IDC_CKCROPMODEL))->EnableWindow(true);
} }

View File

@ -27,7 +27,7 @@ public:
BOOL m_ckbRemoveHole; BOOL m_ckbRemoveHole;
BOOL m_ckbHSVCorrect; BOOL m_ckbHSVCorrect;
BOOL m_ckbDetachNoise; BOOL m_ckbDetachNoise;
void ImageProcPageUpdate(int val, bool is_Crop); void ImageProcPageUpdate(int val,int twss,int cmduplexsel, bool is_Crop);
void ImageAutoDescrewUpdate(int val); void ImageAutoDescrewUpdate(int val);
void EnableOutHoleCheckChanged(BOOL enable); void EnableOutHoleCheckChanged(BOOL enable);
void SetOutHoleValue(int value); void SetOutHoleValue(int value);
@ -36,6 +36,8 @@ public:
int indent; int indent;
int noise; int noise;
int threshold; int threshold;
int twss;
int cmduplexsel;
bool is_convex; bool is_convex;
bool is_crop; bool is_crop;
bool is_bw; bool is_bw;

View File

@ -60,7 +60,7 @@ BOOL CTwainUI::OnInitDialog()
this->SetWindowText(TWAIN_NAME); this->SetWindowText(TWAIN_NAME);
auto dataChangeFunction = [this]() { auto dataChangeFunction = [this]() {
m_pageImageProc->ImageProcPageUpdate(m_pageBasic->m_cmBoxColorMode->GetCurSel(), m_pageImageProc->ImageProcPageUpdate(m_pageBasic->m_cmBoxColorMode->GetCurSel(),m_pageBasic->m_cmBoxSS->GetCurSel(),m_pageBasic->m_cmBoxDuplex->GetCurSel(),
(getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel())== TwSS::USStatement)||(getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::None)); (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_pageFeedPaper->FeedPaperPageUpdate(m_pageBasic->m_cmBoxDuplex->GetCurSel());
m_pageImageProc->ImageAutoDescrewUpdate(m_pageBasic->m_cmBoxSS->GetCurSel()); m_pageImageProc->ImageAutoDescrewUpdate(m_pageBasic->m_cmBoxSS->GetCurSel());
@ -186,9 +186,16 @@ void CTwainUI::UpdateUI()
m_pageImageProc->is_convex = settings->is_convex; m_pageImageProc->is_convex = settings->is_convex;
m_pageBasic->discardblank_percent = settings->discardblank_percent; m_pageBasic->discardblank_percent = settings->discardblank_percent;
((CButton*)m_pageImageProc->GetDlgItem(IDC_CKCROPMODEL))->SetCheck(settings->normalCrop);
m_pageImageProc->m_ckbFillBlack = settings->fillbackground==TRUE ? TRUE : FALSE;//填充黑框 m_pageImageProc->m_ckbFillBlack = settings->fillbackground==TRUE ? TRUE : FALSE;//填充黑框
m_pageImageProc->m_ckbAutoDeskrew = settings->autodescrew ? TRUE : FALSE;//自动纠偏 m_pageImageProc->m_ckbAutoDeskrew = settings->autodescrew ? TRUE : FALSE;//自动纠偏
UpdateFilterCmbx(); UpdateFilterCmbx();
if (settings->fillbackground || settings->autodescrew || settings->is_autocrop) {
m_pageImageProc->GetDlgItem(IDC_ADVANCEDSET)->EnableWindow(TRUE);
}
else {
m_pageImageProc->GetDlgItem(IDC_ADVANCEDSET)->EnableWindow(FALSE);
}
m_pageImageProc->m_cmBoxSharpen.SetCurSel(settings->sharpen); m_pageImageProc->m_cmBoxSharpen.SetCurSel(settings->sharpen);
//UpdateSharpenCmbx(); //UpdateSharpenCmbx();
m_pageImageProc->m_ckbRemoveHole = settings->fillhole.is_fillhole==TRUE?TRUE:FALSE;//除穿孔可用性 m_pageImageProc->m_ckbRemoveHole = settings->fillhole.is_fillhole==TRUE?TRUE:FALSE;//除穿孔可用性
@ -206,11 +213,15 @@ void CTwainUI::UpdateUI()
m_pageImageProc->m_ckbMultioutput = FALSE;//多流除红 m_pageImageProc->m_ckbMultioutput = FALSE;//多流除红
m_pageImageProc->m_ckbHSVCorrect = settings->hsvcorrect == TRUE ? TRUE : FALSE;//答题卡除红 m_pageImageProc->m_ckbHSVCorrect = settings->hsvcorrect == TRUE ? TRUE : FALSE;//答题卡除红
m_pageImageProc->GetDlgItem(IDC_CKMULTIOUTPUT)->EnableWindow(settings->pixtype == 2);//彩色可用 m_pageImageProc->GetDlgItem(IDC_CKMULTIOUTPUT)->EnableWindow(settings->pixtype == 2);//彩色可用
((CButton*)m_pageImageProc->GetDlgItem(IDC_CKMULTIOUTPUT))->SetCheck(settings->pixtype == 2);
m_pageImageProc->UpdateData(FALSE); m_pageImageProc->UpdateData(FALSE);
m_pageFeedPaper->dogear.SetCheck(settings->is_dogeardetection); m_pageFeedPaper->dogear.SetCheck(settings->is_dogeardetection);
//!< Page feed paper //!< Page feed paper
if(settings->is_duplex==TRUE) if (settings->is_duplex || settings->is_autodiscradblank_normal ||settings->is_autodiscradblank_vince)
m_pageFeedPaper->m_cbRotation = settings->is_backrotate180==TRUE ? TRUE : FALSE;//背面旋转180 {
m_pageFeedPaper->m_cbRotation = settings->is_backrotate180 == TRUE ? TRUE : FALSE;//背面旋转180
m_pageFeedPaper->GetDlgItem(IDC_CKBACKROTATION)->EnableWindow(settings->is_autotext ? FALSE : TRUE);
}
else else
{ {
m_pageFeedPaper->GetDlgItem(IDC_CKBACKROTATION)->EnableWindow(FALSE); m_pageFeedPaper->GetDlgItem(IDC_CKBACKROTATION)->EnableWindow(FALSE);
@ -241,6 +252,8 @@ void CTwainUI::UpdateUI()
m_pageFeedPaper->UpdateData(FALSE); m_pageFeedPaper->UpdateData(FALSE);
m_pageBasic->updateCmbDuplex(TRUE); m_pageBasic->updateCmbDuplex(TRUE);
m_pageImageProc->ImageProcPageUpdate(m_pageBasic->m_cmBoxColorMode->GetCurSel(), m_pageBasic->m_cmBoxSS->GetCurSel(), m_pageBasic->m_cmBoxDuplex->GetCurSel(),
(getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::USStatement) || (getcombox_ss(m_pageBasic->m_cmBoxSS->GetCurSel()) == TwSS::None));
} }
void CTwainUI::UpdateFilterCmbx() void CTwainUI::UpdateFilterCmbx()
@ -469,6 +482,7 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs)
settings->contrast = configItem->Contrast; settings->contrast = configItem->Contrast;
settings->brightness = (configItem->Brightness); settings->brightness = (configItem->Brightness);
settings->gamma = (configItem->Gamma); settings->gamma = (configItem->Gamma);
settings->normalCrop = ((CButton*)m_pageImageProc->GetDlgItem(IDC_CKCROPMODEL))->GetCheck();
settings->is_autocrop = paper.Paper == TwSS::None; settings->is_autocrop = paper.Paper == TwSS::None;
settings->is_duplex = configItem->Duplex >= 1; settings->is_duplex = configItem->Duplex >= 1;
settings->is_autodiscradblank_normal = configItem->Duplex == 2; settings->is_autodiscradblank_normal = configItem->Duplex == 2;
@ -541,13 +555,13 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs)
settings->resolution_native = 200.0f; settings->resolution_native = 200.0f;
#endif #endif
if (settings->pixtype == TWPT_BW) if (settings->pixtype == TWPT_BW)
{ //{
if (settings->filter == 3 && settings->enhance_color <=1) // if (settings->filter == 3 && settings->enhance_color <=1)
{ // {
settings->enhance_color = Enchace_Color::Enhance_Red; // settings->enhance_color = Enchace_Color::Enhance_Red;
settings->filter = 3;//none // settings->filter = 3;//none
} // }
} //}
UpdateUi(); UpdateUi();
} }
@ -587,18 +601,25 @@ void CTwainUI::UpdateUi()
m_pageImageProc->m_cmBoxFilter.EnableWindow((m_pageBasic->m_cmBoxColorMode->GetCurSel() != 0) && (m_pageBasic->m_cmBoxColorMode->GetCurSel() != 3)); m_pageImageProc->m_cmBoxFilter.EnableWindow((m_pageBasic->m_cmBoxColorMode->GetCurSel() != 0) && (m_pageBasic->m_cmBoxColorMode->GetCurSel() != 3));
INT dupindex = m_pageBasic->m_cmBoxDuplex->GetCurSel(); INT dupindex = m_pageBasic->m_cmBoxDuplex->GetCurSel();
BOOL enableback = dupindex == 0 || dupindex == 4; BOOL enableback = dupindex == 0 || dupindex == 4;
if (enableback) if ((dupindex==0)||(dupindex==4))
{ {
((CButton*)(m_pageFeedPaper->GetDlgItem(IDC_CKBACKROTATION)))->SetCheck(!enableback); ((CButton*)(m_pageFeedPaper->GetDlgItem(IDC_CKBACKROTATION)))->SetCheck(FALSE);
if (dupindex == 4) { m_pageFeedPaper->GetDlgItem(IDC_CKBACKROTATION)->EnableWindow(FALSE);
((CButton*)m_pageImageProc->GetDlgItem(IDC_CKAUTODESKREW))->SetCheck(dupindex == 4 ? TRUE : FALSE);
}
} }
((CButton*)m_pageImageProc->GetDlgItem(IDC_CKAUTODESKREW))->EnableWindow(!(dupindex == 4)); else
m_pageFeedPaper->GetDlgItem(IDC_CKBACKROTATION)->EnableWindow(!enableback); m_pageFeedPaper->GetDlgItem(IDC_CKBACKROTATION)->EnableWindow(m_pageFeedPaper->m_cmBoxOrentation.GetCurSel()==4? FALSE:TRUE);
if (dupindex == 4) {
((CButton*)m_pageImageProc->GetDlgItem(IDC_CKAUTODESKREW))->SetCheck(TRUE);
((CButton*)m_pageImageProc->GetDlgItem(IDC_CKAUTODESKREW))->EnableWindow(FALSE);
}
else
((CButton*)m_pageImageProc->GetDlgItem(IDC_CKAUTODESKREW))->EnableWindow(TRUE);
m_pageImageProc->GetDlgItem(IDC_SLDOUTHOLE)->EnableWindow(((CButton*)m_pageImageProc->GetDlgItem(IDC_CKREMOVEHOLE))->GetCheck() == TRUE); m_pageImageProc->GetDlgItem(IDC_SLDOUTHOLE)->EnableWindow(((CButton*)m_pageImageProc->GetDlgItem(IDC_CKREMOVEHOLE))->GetCheck() == TRUE);
m_pageFeedPaper->GetDlgItem(IDC_SLDDETECTLEVEL)->EnableWindow(((CButton*)m_pageFeedPaper->GetDlgItem(IDC_CKSKEWDETECT))->GetCheck() == TRUE); m_pageFeedPaper->GetDlgItem(IDC_SLDDETECTLEVEL)->EnableWindow(((CButton*)m_pageFeedPaper->GetDlgItem(IDC_CKSKEWDETECT))->GetCheck() == TRUE);
m_pageImageProc->GetDlgItem(IDC_CKMULTIOUTPUT)->EnableWindow(m_pageBasic->m_cmBoxColorMode->GetCurSel() == 0); m_pageImageProc->GetDlgItem(IDC_CKMULTIOUTPUT)->EnableWindow(m_pageBasic->m_cmBoxColorMode->GetCurSel() == 0);
if(m_pageBasic->m_cmBoxColorMode->GetCurSel() != 0)
((CButton*)m_pageImageProc->GetDlgItem(IDC_CKMULTIOUTPUT))->SetCheck(FALSE);
} }
void CTwainUI::setvisable_size(bool flag) void CTwainUI::setvisable_size(bool flag)

View File

@ -139,7 +139,16 @@ public:
virtual ~IScanner() virtual ~IScanner()
{ {
} }
/// <summary>
/// 设置本批次扫描的样张数量
/// </summary>
/// <param name="val">样张数量</param>
void set_scannum(int val) { scannum = val; };
/// <summary>
/// 获取本批次扫描的样张数量
/// </summary>
/// <returns>样张数量</returns>
int get_scannum() { return scannum; };
/// <summary> /// <summary>
/// 获取PC获取的图像数量页计数 /// 获取PC获取的图像数量页计数
/// </summary> /// </summary>
@ -238,6 +247,7 @@ protected:
int imgreadednum; int imgreadednum;
int imgtransfered; int imgtransfered;
int roller_num; int roller_num;
int scannum;
int lose_image_num; int lose_image_num;
bool is_AndroidOrLinux; bool is_AndroidOrLinux;

View File

@ -2,6 +2,7 @@
#include "ImageProcess/ImageApplyHeaders.h" #include "ImageProcess/ImageApplyHeaders.h"
#include "ImageMultiOutput.h" #include "ImageMultiOutput.h"
#include "scn_config.h" #include "scn_config.h"
#include "UsbScanEx.h"
#include "PaperSize.h" #include "PaperSize.h"
#include "GScan.h" #include "GScan.h"
@ -45,8 +46,6 @@ GScanO1003399::~GScanO1003399()
m_usbthread->join(); m_usbthread->join();
m_usbthread.reset(); m_usbthread.reset();
} }
if (fu_rx.valid())
fu_rx.wait();
} }
void GScanO1003399::open(int vid, int pid) void GScanO1003399::open(int vid, int pid)
@ -59,7 +58,8 @@ void GScanO1003399::open(int vid, int pid)
//} //}
if (m_usb.get()&&m_usb->is_connected()) if (m_usb.get()&&m_usb->is_connected())
return; return;
auto lsusb = CyUsbList::find_all(); //auto lsusb = CyUsbList::find_all();
auto lsusb = UsbScan_List::find_vid_pid(0x3072, 0x0139);
if (!lsusb.empty()) if (!lsusb.empty())
{ {
m_usb = *lsusb.begin(); m_usb = *lsusb.begin();
@ -81,12 +81,14 @@ int GScanO1003399::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
StopWatch sw; StopWatch sw;
while (true) while (true)
{ {
if ((m_imagedata.Size() < 1)&&(!is_runing())) if ((image==0)&&(!is_runing())&&(!scanflag))
{ {
DoEvents(); DoEvents();
this_thread::sleep_for(chrono::milliseconds(1)); this_thread::sleep_for(chrono::milliseconds(1));
if (!is_runing()) if (!is_runing())
{ {
int roller_num_new= count();
set_scannum(abs(roller_num_new - roller_num));
if (devState == DEV_WRONG) if (devState == DEV_WRONG)
return get_ErrorCode(); return get_ErrorCode();
return -1; return -1;
@ -94,10 +96,10 @@ int GScanO1003399::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
if (sw.elapsed_s() > 30.0) if (sw.elapsed_s() > 30.0)
{ {
devState = DEV_STOP; devState = DEV_STOP;
if (fu_rx.valid())
fu_rx.wait();
Stop_scan(); Stop_scan();
ResetScanner(); ResetScanner();
int roller_num_new = count();
set_scannum(abs(roller_num_new - roller_num));
return AQUIRE_IMAGE_TIMEOUT; return AQUIRE_IMAGE_TIMEOUT;
} }
} }
@ -108,6 +110,7 @@ int GScanO1003399::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
FileTools::writelog(log_INFO, "aquire_bmpdata num =" + to_string(aquirenum++)); FileTools::writelog(log_INFO, "aquire_bmpdata num =" + to_string(aquirenum++));
bmpdata = *(m_imagedata.Take()); bmpdata = *(m_imagedata.Take());
UpdateScanInfo(get_imgnReaded(), countNTransfered()); UpdateScanInfo(get_imgnReaded(), countNTransfered());
image--;
return 0; return 0;
} }
DoEvents(); DoEvents();
@ -165,12 +168,13 @@ bool GScanO1003399::is_scan()
BOOL GScanO1003399::Get_Scanner_PaperOn() BOOL GScanO1003399::Get_Scanner_PaperOn()
{ {
return scanner_read_reg(m_usb, SR_PAPER_READY); //return scanner_read_reg(m_usb, SR_PAPER_READY);
return true;
} }
int GScanO1003399::Get_Roller_num() int GScanO1003399::Get_Roller_num()
{ {
return 0; return count();
} }
void GScanO1003399::config_params(GScanCap& param) void GScanO1003399::config_params(GScanCap& param)
@ -269,12 +273,13 @@ void GScanO1003399::config_params(GScanCap& param)
void GScanO1003399::Scanner_StartScan(UINT16 count) void GScanO1003399::Scanner_StartScan(UINT16 count)
{ {
roller_num = this->count();
scanflag = true; scanflag = true;
Set_ErrorCode(0); Set_ErrorCode(0);
getimgnum = 0; getimgnum = 0;
aquirenum = 0; aquirenum = 0;
image = 0;
keeplastimg = true;
reset(); reset();
devState = DEV_ISRUNNING; devState = DEV_ISRUNNING;
if (scan_mode()) if (scan_mode())
@ -299,13 +304,11 @@ void GScanO1003399::Scanner_StartScan(UINT16 count)
void GScanO1003399::Stop_scan() void GScanO1003399::Stop_scan()
{ {
if (devState != DEV_ISRUNNING)
return;
stop(); stop();
scanflag = false; scanflag = false;
if (fu_rx.valid()) if ((devState == DEV_WRONG) || (devState == DEV_STOP))
fu_rx.wait(); return;
devState == DEV_ISRUNNING ? devState = DEV_STOP : devState = DEV_WRONG; devState = DEV_STOP;
} }
int GScanO1003399::notifyscan() int GScanO1003399::notifyscan()
@ -376,13 +379,16 @@ void GScanO1003399::usb_run()
auto length = m_usb->read_int(buff, sizeof(buff)); auto length = m_usb->read_int(buff, sizeof(buff));
if (((length) == sizeof(buff)) || im_dev_count()) if (((length) == sizeof(buff)) || im_dev_count())
{ {
if (im_dev_count()) //将取图消息提前防止未接收到img信息后不取图导致程序无法退出 2021.7.16
if (is_runing())
im_rx();
HGEIntInfo info = *(HGEIntInfo*)&buff; HGEIntInfo info = *(HGEIntInfo*)&buff;
switch (info.From) switch (info.From)
{ {
case IMG: //case IMG:
if (is_runing()) // if (is_runing())
im_rx(); // im_rx();
break; // break;
case MtBoard: case MtBoard:
FileTools::writelog(log_ERROR, "Got MotorBoard error code = " + to_string(info.Code)); FileTools::writelog(log_ERROR, "Got MotorBoard error code = " + to_string(info.Code));
break; break;
@ -392,19 +398,37 @@ void GScanO1003399::usb_run()
case V4L2: case V4L2:
FileTools::writelog(log_ERROR, "Got V4L2 Error code = " + to_string(info.Code)); FileTools::writelog(log_ERROR, "Got V4L2 Error code = " + to_string(info.Code));
break; break;
case STOPSCAN:
FileTools::writelog(log_INFO, "StopScan");
break;
default: default:
FileTools::writelog(log_ERROR, "Got Unkown error code ! From =" + to_string(info.From) + " Code = " + to_string(info.Code)); FileTools::writelog(log_ERROR, "Got Unkown error code ! From =" + to_string(info.From) + " Code = " + to_string(info.Code));
break; break;
} }
if ((codeconvter(info) != 0)) if ((codeconvter(info) != 0))
{ {
if (info.Code==0x10||info.Code==0x20||info.Code==0x40)
{
while (scanner_read_reg(m_usb, SR_STATUS) & 0x1)
this_thread::sleep_for(chrono::microseconds(10));
if (m_param.is_duplex)
pop_dev_im();
pop_dev_im();
}
else
{
keeplastimg = false;
im_rx();
}
scanflag = false; scanflag = false;
devState = codeconvter(info) == -1 ? DEV_STOP : DEV_WRONG; if ((devState != DEV_WRONG) && (codeconvter(info) < 0))
devState = DEV_STOP;
else if ((devState != DEV_WRONG) && (codeconvter(info) > 0))
devState = DEV_WRONG;
} }
if (codeconvter(info) > 0) if (codeconvter(info) > 0)
{ {
Set_ErrorCode(codeconvter(info)); Set_ErrorCode(codeconvter(info));
stop();
} }
this_thread::sleep_for(chrono::microseconds(10)); this_thread::sleep_for(chrono::microseconds(10));
} }
@ -424,7 +448,8 @@ void GScanO1003399::stop()
bool GScanO1003399::is_runing() bool GScanO1003399::is_runing()
{ {
return scanner_read_reg(m_usb, SR_STATUS) & 0x01; int val = scanner_read_reg(m_usb, SR_STATUS) & 0x3;
return (val > 0) && (val < 4);
} }
int GScanO1003399::scan_mode() int GScanO1003399::scan_mode()
@ -473,9 +498,18 @@ void GScanO1003399::im_rx()
if (!is_rx() && !is_dev_tx()) if (!is_rx() && !is_dev_tx())
{ {
fu_rx = m_imgthread.enqueue([this] { fu_rx = m_imgthread.enqueue([this] {
do while (im_dev_count()){
{
/* code */ /* code */
if (keeplastimg)
{
this_thread::sleep_for(chrono::microseconds(10));
if (m_param.is_duplex) {
if(im_dev_count()<3)
continue;
}
if(im_dev_count()<2)
continue;
}
auto &buffi = im_data; auto &buffi = im_data;
int count = front_datasize(); int count = front_datasize();
buffi->resize(count); buffi->resize(count);
@ -485,9 +519,13 @@ void GScanO1003399::im_rx()
pop_dev_im(); pop_dev_im();
vector<cv::Mat> mats; vector<cv::Mat> mats;
auto& buffs = G400Decode(buffi).getImageBuffs(); auto& buffs = G400Decode(buffi).getImageBuffs();
if (m_param.multi_output_red)
image += 2;
else
image++;
UpdateScanInfo(countNReaded(), get_imgTransfered()); UpdateScanInfo(countNReaded(), get_imgTransfered());
imgproce(buffs); imgproce(buffs);
} while (im_dev_count()); }
}); });
} }
} }
@ -526,25 +564,24 @@ int GScanO1003399::im_dev_count()
void GScanO1003399::imgproce(std::vector<std::shared_ptr<std::vector<char>>>& buffs) void GScanO1003399::imgproce(std::vector<std::shared_ptr<std::vector<char>>>& buffs)
{ {
vector<cv::Mat> mats; vector<cv::Mat> mats;
bool isbwimg = false;
for (auto& buf : buffs) { for (auto& buf : buffs) {
cv::ImreadModes rmc; cv::ImreadModes rmc = m_param.pixtype == 2 ? cv::IMREAD_COLOR : cv::IMREAD_GRAYSCALE;
//int rm;
if (m_param.filter != 3 || m_param.enhance_color || m_param.hsvcorrect) {
rmc = cv::IMREAD_COLOR;
//rm = 1;
}
else {
rmc = m_param.pixtype == 2 ? cv::IMREAD_COLOR : cv::IMREAD_GRAYSCALE;
//rm = scanParam.pixtype == 2 ? 1 : 6;
}
try try
{ {
if (buf->at(0) == -119 && buf->at(1) == 0x50 && buf->at(2) == 0x4e && buf->at(3) == 0x47)
{
isbwimg = true;
rmc = cv::IMREAD_GRAYSCALE;
}
cv::Mat mat = cv::imdecode(*buf, rmc); cv::Mat mat = cv::imdecode(*buf, rmc);
if (mat.empty()) { if (mat.empty()) {
FileTools::writelog(log_ERROR, "decode image data error"); FileTools::writelog(log_ERROR, "decode image data error");
continue; continue;
} }
buf.reset(); buf.reset();
//if (isbwimg)
// cv::flip(mat, mat, 0);
mats.push_back(mat); mats.push_back(mat);
FileTools::writelog(log_INFO, "push_back image num= " + to_string(getimgnum++)); FileTools::writelog(log_INFO, "push_back image num= " + to_string(getimgnum++));
} }
@ -558,7 +595,6 @@ void GScanO1003399::imgproce(std::vector<std::shared_ptr<std::vector<char>>>& bu
if (m_param.automaticcolor) if (m_param.automaticcolor)
{ {
CImageApplyColorRecognition(m_param.automaticcolortype == 1 ? CImageApplyColorRecognition::ColorRecognitionMode::Color_Gray : CImageApplyColorRecognition::ColorRecognitionMode::Color_Mono).apply(mats,m_param.is_duplex); CImageApplyColorRecognition(m_param.automaticcolortype == 1 ? CImageApplyColorRecognition::ColorRecognitionMode::Color_Gray : CImageApplyColorRecognition::ColorRecognitionMode::Color_Mono).apply(mats,m_param.is_duplex);
} }
for (int i = 0; i < mats.size(); i++) { for (int i = 0; i < mats.size(); i++) {
//if (!m_param.is_duplex && i == 1) { //if (!m_param.is_duplex && i == 1) {
@ -570,7 +606,7 @@ void GScanO1003399::imgproce(std::vector<std::shared_ptr<std::vector<char>>>& bu
if (m_param.pixtype == 1 && m_param.hsvcorrect) if (m_param.pixtype == 1 && m_param.hsvcorrect)
if (mats[i].channels() == 3) if (mats[i].channels() == 3)
cvtColor(mats[i], mats[i], cv::COLOR_BGR2GRAY); cvtColor(mats[i], mats[i], cv::COLOR_BGR2GRAY);
idata = (m_param.pixtype == 0 || (((m_param.automaticcolortype == 0) && (m_param.automaticcolor == true)) && (mats[i].channels() == 1))) ? (IMat2Bmp)Mat2BmpBw(mats[i], m_param.resolution_dst) : Mat2Bmp(mats[i], m_param.resolution_dst); idata = (isbwimg|| m_param.pixtype == 0 || (((m_param.automaticcolortype == 0) && (m_param.automaticcolor == true)) && (mats[i].channels() == 1))) ? (IMat2Bmp)Mat2BmpBw(mats[i], m_param.resolution_dst) : Mat2Bmp(mats[i], m_param.resolution_dst);
//if (!m_param.multi_output_red) //if (!m_param.multi_output_red)
// mats[i].release(); // mats[i].release();
@ -647,6 +683,7 @@ int GScanO1003399::codeconvter(HGEIntInfo code)
break; break;
} }
} }
if (code.From == HGType::STOPSCAN)
return -1;
return 0; return 0;
} }

View File

@ -72,6 +72,7 @@ private:
volatile int devState; volatile int devState;
volatile int Error_Code; volatile int Error_Code;
volatile bool scanflag; volatile bool scanflag;
volatile bool keeplastimg;
GScanCap m_param; GScanCap m_param;
std::shared_ptr<IUsb> m_usb; std::shared_ptr<IUsb> m_usb;
volatile bool b_usbthread; volatile bool b_usbthread;
@ -80,6 +81,7 @@ private:
std::shared_ptr<std::thread> m_usbthread; std::shared_ptr<std::thread> m_usbthread;
std::shared_ptr<std::vector<char>> im_data; std::shared_ptr<std::vector<char>> im_data;
BlockingQueue<std::shared_ptr<std::vector<unsigned char>>> m_imagedata; BlockingQueue<std::shared_ptr<std::vector<unsigned char>>> m_imagedata;
std::atomic_int image;
}; };

View File

@ -220,12 +220,13 @@ int GScanO200::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
Stop_scan();//ֹͣɨÃè Stop_scan();//ֹͣɨÃè
ResetScanner(); ResetScanner();
auto rollernew = Get_Roller_num(); auto rollernew = Get_Roller_num();
if (get_imgnReaded() != (rollernew - roller_num)) set_scannum(abs(rollernew - roller_num));
set_lose_image_num(std::abs((rollernew - roller_num) - get_imgnReaded()));
return HARDWARE_ERROR; return HARDWARE_ERROR;
} }
if (!is_scan()) { if (!is_scan()) {
auto rollernew = Get_Roller_num();
set_scannum(abs(rollernew - roller_num));
if (devState == DEV_WRONG) { if (devState == DEV_WRONG) {
return get_ErrorCode(); return get_ErrorCode();
} }
@ -631,13 +632,6 @@ void GScanO200::usbmain()
{ {
m_pImages->setscanflags(false); m_pImages->setscanflags(false);
std::this_thread::sleep_for(std::chrono::milliseconds(1500)); std::this_thread::sleep_for(std::chrono::milliseconds(1500));
auto rollernew= Get_Roller_num();
if (get_imgnReaded() != (rollernew - roller_num))
{
Set_ErrorCode(LOSE_IMAGE);
set_lose_image_num(std::abs((rollernew - roller_num) - get_imgnReaded()));
haveError = true;
}
devState = haveError ? DevState::DEV_WRONG : DevState::DEV_STOP; devState = haveError ? DevState::DEV_WRONG : DevState::DEV_STOP;
//m_pImages->setscanflags(false); //m_pImages->setscanflags(false);
//devState = DEV_STOP; //devState = DEV_STOP;

View File

@ -212,6 +212,7 @@ int GScanO400::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
this_thread::sleep_for(chrono::milliseconds(1)); this_thread::sleep_for(chrono::milliseconds(1));
if (sw.elapsed_s() > 30.00) if (sw.elapsed_s() > 30.00)
{ {
int roller_num_new = Get_Roller_num();
if (m_threadUsb && m_threadUsb->joinable()) { if (m_threadUsb && m_threadUsb->joinable()) {
devState = DEV_STOP; devState = DEV_STOP;
m_threadUsb->join(); m_threadUsb->join();
@ -220,10 +221,13 @@ int GScanO400::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
} }
Stop_scan();//ֹͣɨÃè Stop_scan();//ֹͣɨÃè
ResetScanner(); ResetScanner();
set_scannum(abs(roller_num_new - roller_num));
return HARDWARE_ERROR; return HARDWARE_ERROR;
} }
if (!is_scan()) { if (!is_scan()) {
int roller_num_new = Get_Roller_num();
set_scannum(abs(roller_num_new - roller_num));
if (devState == DEV_WRONG) { if (devState == DEV_WRONG) {
return get_ErrorCode(); return get_ErrorCode();
} }
@ -680,13 +684,6 @@ void GScanO400::usbmain()
{ {
m_pImages->setscanflags(false); m_pImages->setscanflags(false);
std::this_thread::sleep_for(std::chrono::milliseconds(1500)); std::this_thread::sleep_for(std::chrono::milliseconds(1500));
auto rollernew = Get_Roller_num();
if (get_imgnReaded() != (rollernew - roller_num))
{
Set_ErrorCode(LOSE_IMAGE);
set_lose_image_num(std::abs((rollernew - roller_num) - get_imgnReaded()));
haveError = true;
}
devState = haveError ? DevState::DEV_WRONG : DevState::DEV_STOP; devState = haveError ? DevState::DEV_WRONG : DevState::DEV_STOP;
break; break;
} }

View File

@ -24,15 +24,16 @@ static std::map<PaperStatus, unsigned int> SupPaperTyps = {
{{TwSS::B6,PaperAlign::Rot0},10}, {{TwSS::B6,PaperAlign::Rot0},10},
{{TwSS::B6,PaperAlign::Rot270},11}, {{TwSS::B6,PaperAlign::Rot270},11},
{{TwSS::USLetter,PaperAlign::Rot0},14}, {{TwSS::USLetter,PaperAlign::Rot0},14},
{{TwSS::USLetter,PaperAlign::Rot270},15},
{{TwSS::USLedger,PaperAlign::Rot0},12}, {{TwSS::USLedger,PaperAlign::Rot0},12},
{{TwSS::USLegal,PaperAlign::Rot0},13}, {{TwSS::USLegal,PaperAlign::Rot0},13},
{{TwSS::None,PaperAlign::Rot0},0}, {{TwSS::None,PaperAlign::Rot0},0},
#ifdef G1003399 #ifdef G1003399
{{TwSS::USLetter,PaperAlign::Rot270},14},
{{TwSS::USStatement,PaperAlign::Rot0},17}, {{TwSS::USStatement,PaperAlign::Rot0},17},
{{TwSS::MaxSize,PaperAlign::Rot0},19}, {{TwSS::MaxSize,PaperAlign::Rot0},19},
{{TwSS::Trigeminy,PaperAlign::Rot0},17} {{TwSS::Trigeminy,PaperAlign::Rot0},17}
#else #else
{ {TwSS::USLetter,PaperAlign::Rot270},15},
{{TwSS::USStatement,PaperAlign::Rot0},16}, {{TwSS::USStatement,PaperAlign::Rot0},16},
{{TwSS::MaxSize,PaperAlign::Rot0},16}, {{TwSS::MaxSize,PaperAlign::Rot0},16},
{{TwSS::Trigeminy,PaperAlign::Rot0},16} {{TwSS::Trigeminy,PaperAlign::Rot0},16}
@ -118,6 +119,7 @@ enum HGType
FPGA, FPGA,
V4L2, V4L2,
IMG, IMG,
AutoCorrect,
STOPSCAN, STOPSCAN,
}; };
@ -161,7 +163,13 @@ enum Scanner_Reg_Defs
SR_GET_SERIALNUM, SR_GET_SERIALNUM,
SR_SET_SERIALNUM, SR_SET_SERIALNUM,
SR_CONFIF_IMGPROCPARAM, SR_CONFIF_IMGPROCPARAM,
SR_PAPER_READY, SC_AUTOCORRECT,
SR_KEEP_LAST_IMG,
SR_UPDATA_START = 0x100,
SR_UPDATA_STAUTUS = 0x101,
SR_UPDATA_MD5_RELUST = 0x102,
SR_UPDATA_RECOVERY = 0x103,
SR_UPDATA_REBOOT = 0x104,
}; };
enum Scanner_Cmd_Defs enum Scanner_Cmd_Defs

View File

@ -173,8 +173,9 @@ void ImageMatQueue::setparam(const GScanCap& param)
#else // REAL300DPI #else // REAL300DPI
fixedSize = papersize.GetPaperSize(param.papertype, 200.0f, param.paperAlign); fixedSize = papersize.GetPaperSize(param.papertype, 200.0f, param.paperAlign);
#endif #endif
bool normalCrop = ((param.autodescrew) || (islongcustomcrop ? islongcustomcrop : param.is_autocrop)||(param.fillbackground)) ? false : param.normalCrop;
m_iaList.push_back(shared_ptr<CImageApply>(new CImageApplyAutoCrop(islongcustomcrop ? islongcustomcrop : param.is_autocrop, m_iaList.push_back(shared_ptr<CImageApply>(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))); param.autodescrew, param.fillbackground, cv::Size(fixedSize.cx, fixedSize.cy), param.is_convex,false,param.AutoCrop_threshold,param.noise,param.indent,normalCrop)));
/* m_iaList.push_back(shared_ptr<CImageApply>(new CImageApplyAutoCrop(true, param.autodescrew, param.fillbackground, cv::Size(fixedSize.cx, fixedSize.cy), param.is_convex, false, param.AutoCrop_threshold, param.noise, param.indent))); /* m_iaList.push_back(shared_ptr<CImageApply>(new CImageApplyAutoCrop(true, param.autodescrew, param.fillbackground, cv::Size(fixedSize.cx, fixedSize.cy), param.is_convex, false, param.AutoCrop_threshold, param.noise, param.indent)));
if(!(islongcustomcrop ? islongcustomcrop : param.is_autocrop)) if(!(islongcustomcrop ? islongcustomcrop : param.is_autocrop))

View File

@ -54,6 +54,7 @@ const std::string GAMMA_ = "dGamma";
//<!图像处理选项卡 //<!图像处理选项卡
const std::string CROPMODEL = "bcropmodel";
const std::string FILTERTYPE = "iFilter"; const std::string FILTERTYPE = "iFilter";
const std::string ENHANCECOLOR = "iEnhance"; const std::string ENHANCECOLOR = "iEnhance";
const std::string SHARPENTYPE = "iSharpen"; const std::string SHARPENTYPE = "iSharpen";
@ -231,6 +232,7 @@ struct GScanCap
float threshold; /**< Threshold */ float threshold; /**< Threshold */
uint8_t is_autocontrast; /**< 自动对比度*/ uint8_t is_autocontrast; /**< 自动对比度*/
uint8_t is_autocrop; /**< 自动裁切*/ uint8_t is_autocrop; /**< 自动裁切*/
bool normalCrop; /**<传统模式自动裁切*/
uint8_t is_autodiscradblank_normal; /**< 自动丢弃空白页通用*/ uint8_t is_autodiscradblank_normal; /**< 自动丢弃空白页通用*/
int discardblank_percent; /**<跳过空白页阀值*/ int discardblank_percent; /**<跳过空白页阀值*/
uint8_t is_autodiscradblank_vince;/**自动丢弃空白页发票*/ uint8_t is_autodiscradblank_vince;/**自动丢弃空白页发票*/

View File

@ -20,67 +20,68 @@ GscanJsonConfig::~GscanJsonConfig()
GScanCap GscanJsonConfig::GetDefaultGscancapValue() GScanCap GscanJsonConfig::GetDefaultGscancapValue()
{ {
GScanCap gcap; GScanCap gcap;
gcap = JsonToGscancap(GetDefaultJson());
/*< basic page setting*/
gcap.pixtype = 2;//默认彩色
gcap.automaticcolor = FALSE;
gcap.automaticcolortype = 1;
gcap.paperAlign = PaperAlign::Rot0;
gcap.papertype = 0;//TwSS::NONE
gcap.en_sizecheck = FALSE;
#ifdef UV
gcap.hardwarecaps.en_uv = FALSE;
#endif
gcap.is_autocrop = TRUE;//默认自动裁切
gcap.is_duplex = TRUE;
gcap.is_autodiscradblank_normal = FALSE;
gcap.is_autodiscradblank_vince = FALSE;
gcap.discardblank_percent = 20;
gcap.is_switchfrontback = FALSE;
gcap.resolution_dst = 200.0f;
gcap.resolution_native = 200.0f;
/*< brightness setting*/
gcap.brightness = 0.0f;//默认亮度为0
gcap.contrast = 0.0f;//默认对比度为0
gcap.threshold = 128;
gcap.gamma = 1.0;
gcap.is_autocontrast = FALSE;//默认不自动对比度
/*< image proecss setting*/
gcap.autodescrew = TRUE;//自动纠偏 可用
gcap.enhance_color = EnchaceColor::Enhance_None;//默认不进行颜色增强
gcap.en_fold = FALSE;//默认不对折
gcap.fillbackground = true;//默认不填黑框
gcap.fillhole.is_fillhole = FALSE;
gcap.fillhole.fillholeratio = 10;
gcap.detachnoise.detachnoise = 30;
gcap.detachnoise.is_detachnoise = FALSE;
gcap.filter = 3;//对应Filter::None
gcap.multi_output_red = FALSE;
gcap.sharpen = SharpenBlur::Sharpen_None;
gcap.hsvcorrect = FALSE;//默认不开启答题卡除红
/*< feeder setting*/
gcap.hardwarecaps.en_doublefeed = TRUE;//默认开启双张
gcap.hardwarecaps.en_skrewdetect = TRUE;//默认开启歪斜检测
gcap.hardwarecaps.en_stapledetect = FALSE;//默认不开启订书针检测
gcap.hardwarecaps.skrewdetectlevel = 3;//默认处于3挡
gcap.hardwarecaps.capturepixtype = 2;//彩色模式
gcap.imageRotateDegree = 0.0f;//默认不进行旋转
gcap.is_autotext = FALSE;
gcap.is_backrotate180 = FALSE;
gcap.AutoCrop_threshold = 40;
gcap.is_convex = TRUE;
gcap.noise = 8;
gcap.indent = 5;
gcap.is_dogeardetection = FALSE;
gcap.scannum = -1;//默认连续扫描
gcap.hardwarecaps.lowpowermode = (LowPowerMode)4;
//gcap.scanrect = { 0 };
return gcap; return gcap;
// /*< basic page setting*/
// gcap.pixtype = 2;//默认彩色
// gcap.automaticcolor = FALSE;
// gcap.automaticcolortype = 1;
// gcap.paperAlign = PaperAlign::Rot0;
// gcap.papertype = 0;//TwSS::NONE
// gcap.en_sizecheck = FALSE;
//
//#ifdef UV
// gcap.hardwarecaps.en_uv = FALSE;
//#endif
// gcap.is_autocrop = TRUE;//默认自动裁切
// gcap.is_duplex = TRUE;
// gcap.is_autodiscradblank_normal = FALSE;
// gcap.is_autodiscradblank_vince = FALSE;
// gcap.discardblank_percent = 20;
// gcap.is_switchfrontback = FALSE;
// gcap.resolution_dst = 200.0f;
// gcap.resolution_native = 200.0f;
//
// /*< brightness setting*/
// gcap.brightness = 0.0f;//默认亮度为0
// gcap.contrast = 0.0f;//默认对比度为0
// gcap.threshold = 128;
// gcap.gamma = 1.0;
// gcap.is_autocontrast = FALSE;//默认不自动对比度
//
// /*< image proecss setting*/
// gcap.autodescrew = TRUE;//自动纠偏 可用
// gcap.enhance_color = EnchaceColor::Enhance_None;//默认不进行颜色增强
// gcap.en_fold = FALSE;//默认不对折
// gcap.fillbackground = true;//默认不填黑框
// gcap.fillhole.is_fillhole = FALSE;
// gcap.fillhole.fillholeratio = 10;
// gcap.detachnoise.detachnoise = 30;
// gcap.detachnoise.is_detachnoise = FALSE;
// gcap.filter = 3;//对应Filter::None
// gcap.multi_output_red = FALSE;
// gcap.sharpen = SharpenBlur::Sharpen_None;
// gcap.hsvcorrect = FALSE;//默认不开启答题卡除红
//
// /*< feeder setting*/
// gcap.hardwarecaps.en_doublefeed = TRUE;//默认开启双张
// gcap.hardwarecaps.en_skrewdetect = TRUE;//默认开启歪斜检测
// gcap.hardwarecaps.en_stapledetect = FALSE;//默认不开启订书针检测
// gcap.hardwarecaps.skrewdetectlevel = 3;//默认处于3挡
// gcap.hardwarecaps.capturepixtype = 2;//彩色模式
// gcap.imageRotateDegree = 0.0f;//默认不进行旋转
// gcap.is_autotext = FALSE;
// gcap.is_backrotate180 = FALSE;
// gcap.AutoCrop_threshold = 40;
// gcap.is_convex = TRUE;
// gcap.noise = 8;
// gcap.indent = 5;
// gcap.is_dogeardetection = FALSE;
// gcap.scannum = -1;//默认连续扫描
// gcap.hardwarecaps.lowpowermode = (LowPowerMode)4;
// //gcap.scanrect = { 0 };
//
// return gcap;
} }
void GscanJsonConfig::SaveGscanCapConfig(const GScanCap & gcap, const std::string path) void GscanJsonConfig::SaveGscanCapConfig(const GScanCap & gcap, const std::string path)

View File

@ -8,21 +8,24 @@ CImageApplyAutoCrop::CImageApplyAutoCrop()
, m_isConvexHull(true) , m_isConvexHull(true)
, m_isFillColor(false) , m_isFillColor(false)
, m_threshold(40) , m_threshold(40)
, m_noise(2) , m_noise(8)
, m_indent(5) , m_indent(5)
, m_normalCrop(false)
{ {
} }
CImageApplyAutoCrop::CImageApplyAutoCrop(bool isCrop, bool isDesaskew, bool isFillBlank, const cv::Size& fixedSize, bool isConvex, double threshold, int noise, int indent) CImageApplyAutoCrop::CImageApplyAutoCrop(bool isCrop, bool isDesaskew, bool isFillBlank, const cv::Size& fixedSize, bool isConvex, bool isFillColor,
double threshold, int noise, int indent, bool normalCrop)
: m_isCrop(isCrop) : m_isCrop(isCrop)
, m_isDesaskew(isDesaskew) , m_isDesaskew(isDesaskew)
, m_isFillBlank(isFillBlank) , m_isFillBlank(isFillBlank)
, m_isConvexHull(isConvex) , m_isConvexHull(isConvex)
, m_isFillColor(false) , m_isFillColor(isFillColor)
, m_threshold(threshold) , m_threshold(threshold)
, m_noise(noise) , m_noise(noise)
, m_indent(indent) , m_indent(indent)
, m_fixedSize(fixedSize) , m_fixedSize(fixedSize)
, m_normalCrop(normalCrop)
{ {
} }
@ -34,7 +37,11 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side)
{ {
(void)side; (void)side;
if (pDib.empty()) return; if (pDib.empty()) return;
if (!m_isCrop && !m_isDesaskew && !m_isFillBlank && m_fixedSize.empty()) return; if (!m_isCrop && !m_isDesaskew && !m_isFillBlank && m_normalCrop/* && m_fixedSize.empty()*/)
{
pDib = pDib(cv::Rect((pDib.cols - m_fixedSize.width) / 2, side == 0 ? 75 : 145, m_fixedSize.width, m_fixedSize.height) & cv::Rect(0, 0, pDib.cols, pDib.rows)).clone();
return;
}
cv::Mat src = pDib; cv::Mat src = pDib;
cv::Mat thre; cv::Mat thre;
@ -43,7 +50,7 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side)
if (m_noise > 0) if (m_noise > 0)
{ {
cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(m_noise, m_noise)); cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(m_noise, 1));
cv::morphologyEx(thre, thre, cv::MORPH_OPEN, element); cv::morphologyEx(thre, thre, cv::MORPH_OPEN, element);
} }
std::vector<cv::Vec4i> hierarchy; std::vector<cv::Vec4i> hierarchy;
@ -55,6 +62,12 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side)
if (m_maxContour.size() == 0) if (m_maxContour.size() == 0)
{ {
thre.release(); thre.release();
//如果是固定幅面,须返回裁切后的尺寸
if (!m_isCrop)
pDib = pDib(cv::Rect((pDib.cols - m_fixedSize.width) / 2, (pDib.rows - m_fixedSize.height) / 2, m_fixedSize.width, m_fixedSize.height) & cv::Rect(0, 0, pDib.cols, pDib.rows)).clone();
#ifdef LOG
FileTools::write_log("imgprc.txt", "exit CImageApplyAutoCrop apply");
#endif // LOG
return; return;
} }
thre.release(); thre.release();
@ -96,6 +109,8 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side)
m_maxContour.push_back(cv::Point(dst.cols, -1)); m_maxContour.push_back(cv::Point(dst.cols, -1));
m_maxContour.push_back(cv::Point(dst.cols, dst.rows)); m_maxContour.push_back(cv::Point(dst.cols, dst.rows));
cv::Scalar autoBGColor;
if (m_isFillBlank) if (m_isFillBlank)
{ {
cv::Mat thre_dst; cv::Mat thre_dst;
@ -129,7 +144,8 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side)
contours[contours.size() - 1].push_back(cv::Point(dst.cols, -1)); contours[contours.size() - 1].push_back(cv::Point(dst.cols, -1));
contours[contours.size() - 1].push_back(cv::Point(dst.cols, dst.rows)); contours[contours.size() - 1].push_back(cv::Point(dst.cols, dst.rows));
hg::fillPolys(dst, contours, m_isFillColor ? getBackGroudColor(pDib, rect.size.area()) : cv::Scalar(255, 255, 255)); autoBGColor = m_isFillColor ? getBackGroudColor(pDib, rect.size.area()) : cv::Scalar(255, 255, 255);
hg::fillPolys(dst, contours, autoBGColor);
} }
pDib.release(); pDib.release();
@ -137,7 +153,7 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side)
pDib = dst.clone(); pDib = dst.clone();
else else
{ {
pDib = cv::Mat(m_fixedSize, dst.type(), m_isFillBlank ? cv::Scalar(255, 255, 255) : cv::Scalar(0, 0, 0)); pDib = cv::Mat(m_fixedSize, dst.type(), m_isFillBlank ? autoBGColor : cv::Scalar(0, 0, 0));
cv::Rect roi; cv::Rect roi;
roi.x = dst.cols > pDib.cols ? (dst.cols - pDib.cols) / 2 : 0; roi.x = dst.cols > pDib.cols ? (dst.cols - pDib.cols) / 2 : 0;
@ -154,12 +170,9 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side)
void CImageApplyAutoCrop::apply(std::vector<cv::Mat>& mats, bool isTwoSide) void CImageApplyAutoCrop::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
{ {
m_rects.clear();
if (mats.empty()) return; if (mats.empty()) return;
if (!mats[0].empty()) { if (!mats[0].empty()) {
apply(mats[0], 0); apply(mats[0], 0);
m_rects.push_back(m_rect);
//cv::imwrite("1.bmp", mats[0]);
} }
if (isTwoSide && mats.size() > 1) if (isTwoSide && mats.size() > 1)
@ -167,11 +180,8 @@ void CImageApplyAutoCrop::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
cv::Size dSize = m_fixedSize; cv::Size dSize = m_fixedSize;
if (!mats[0].empty()) if (!mats[0].empty())
m_fixedSize = mats[0].size(); m_fixedSize = mats[0].size();
if (!mats[1].empty()) { if (!mats[1].empty()) {
apply(mats[1], 1); apply(mats[1], 1);
m_rects.push_back(m_rect);
//cv::imwrite("1.bmp", mats[0]);
} }
if (!mats[0].empty()) if (!mats[0].empty())

View File

@ -26,6 +26,7 @@ class CImageApplyAutoCrop : public CImageApply
public: public:
CImageApplyAutoCrop(); CImageApplyAutoCrop();
/* /*
* isCrop [in]:使true自动裁剪false为固定裁剪 * isCrop [in]:使true自动裁剪false为固定裁剪
* isDesaskew [in]:使true自动纠偏false为不纠偏 * isDesaskew [in]:使true自动纠偏false为不纠偏
@ -34,10 +35,12 @@ public:
* isConvex [in]:,true为凸多边形填充false为凹多边形填充true * isConvex [in]:,true为凸多边形填充false为凹多边形填充true
* isFillColor [in]:false为白色填充true为自适应文稿底色填充false * isFillColor [in]:false为白色填充true为自适应文稿底色填充false
* threshold [in]:(0, 255)40 * threshold [in]:(0, 255)40
* noise [in]:noise宽度的背景竖条纹干扰40 * noise [in]:noise宽度的背景竖条纹干扰2
* indent [in]:indent像素5 * indent [in]:indent像素5
* normalCrop [in]:true且m_isCrop m_isDesaskew m_isFillBlank均为false时生效false
*/ */
CImageApplyAutoCrop(bool isCrop, bool isDesaskew, bool isFillBlank, const cv::Size& fixedSize, bool isConvex = true, double threshold = 40, int noise = 8, int indent = 5); CImageApplyAutoCrop(bool isCrop, bool isDesaskew, bool isFillBlank, const cv::Size& fixedSize, bool isConvex = true,
bool isFillColor = false, double threshold = 40, int noise = 8, int indent = 5, bool normalCrop = false);
virtual ~CImageApplyAutoCrop(); virtual ~CImageApplyAutoCrop();
@ -98,6 +101,7 @@ private:
double m_threshold; double m_threshold;
int m_noise; int m_noise;
int m_indent; int m_indent;
bool m_normalCrop; //为true且m_isCrop m_isDesaskew m_isFillBlank均为false时生效固定裁切采用最传统的裁切方式
cv::Size m_fixedSize; cv::Size m_fixedSize;
cv::RotatedRect m_rect; cv::RotatedRect m_rect;
std::vector<cv::Point> m_maxContour; std::vector<cv::Point> m_maxContour;

View File

@ -59,6 +59,7 @@ enum class CapTypeEx : unsigned short {
TwEx_SizeDetect = 0x8103, TwEx_SizeDetect = 0x8103,
TwEx_LowPowerMode = 0x8104, TwEx_LowPowerMode = 0x8104,
TwEx_ENCODE = 0x8105, TwEx_ENCODE = 0x8105,
TwEx_CropModel=0x8106,
}; };
enum class PaperSizeEx : unsigned short { enum class PaperSizeEx : unsigned short {
@ -86,7 +87,7 @@ using namespace std::placeholders;
TWPP_ENTRY_MFC(HuagaoDs) TWPP_ENTRY_MFC(HuagaoDs)
static constexpr const Identity srcIdent( static constexpr const Identity srcIdent(
Version(3, 3, Language::English, Country::China, "v3.3.5.0"), Version(3, 3, Language::English, Country::China, "v3.3.5.1"),
DataGroup::Image, DataGroup::Image,
#ifdef MAKEHUAGAO #ifdef MAKEHUAGAO
"HUAGO", "HUAGO",
@ -344,36 +345,40 @@ HuagaoDs::HuagaoDs()
void HuagaoDs::showmsg(std::string caption, std::string text, int retcode) void HuagaoDs::showmsg(std::string caption, std::string text, int retcode)
{ {
if (scanner.get()) { if (scanner.get()) {
int losemun = scanner->get_lose_image_num(); int num = scanner->get_scannum() * (m_scanparam->is_duplex ? 2 : 1) * (m_scanparam->multi_output_red ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1);
int num = 0;
bool is_duplex = m_scanparam->is_duplex;
#ifdef G1003399 #ifdef G1003399
is_duplex = false; int readnum =scanner->get_scannum()* (m_scanparam->is_duplex ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1);
#else
int readnum = scanner->get_scannum();
#endif // G1003399 #endif // G1003399
if ((retcode == 64 || retcode == 8 || retcode == 16) && losemun > 0)//64 ->SStop
losemun--;
if (!(m_scanparam->is_autodiscradblank_normal || m_scanparam->is_autodiscradblank_vince)) if (!(m_scanparam->is_autodiscradblank_normal || m_scanparam->is_autodiscradblank_vince))
{ {
if (is_duplex && m_scanparam->en_fold && m_scanparam->multi_output_red) if ((retcode == 64 || retcode == 8 || retcode == 16)) {
num = scanner->get_imgnReaded() * 2 - scanner->get_imgTransfered(); num = (scanner->get_scannum()-1) * (m_scanparam->is_duplex ? 2 : 1) * (m_scanparam->multi_output_red ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1);
else if (is_duplex && m_scanparam->en_fold) #ifdef G1003399
num = scanner->get_imgnReaded() - scanner->get_imgTransfered(); int readnum = (scanner->get_scannum() -1)* (m_scanparam->is_duplex ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1);
else if (is_duplex && m_scanparam->multi_output_red) #else
num = scanner->get_imgnReaded() * 4 - scanner->get_imgTransfered(); int readnum = scanner->get_scannum()-1;
else if ((!is_duplex) && m_scanparam->multi_output_red) #endif // G1003399
num = scanner->get_imgnReaded() * 2 - scanner->get_imgTransfered(); if (((num - scanner->get_imgTransfered()) > 0)||((readnum-scanner->get_imgnReaded())>0)) {
else if (!is_duplex) text += "进纸" + to_string(scanner->get_scannum()-1) +
num = scanner->get_imgnReaded() - scanner->get_imgTransfered(); ",扫描" + to_string(scanner->get_imgnReaded()) + ",上传" + to_string(scanner->get_imgTransfered()) +
else ",扫描相差" + to_string(readnum - scanner->get_imgnReaded()) + "份文件,上传相差" + to_string(num - scanner->get_imgTransfered()) + "份文件!";
num = scanner->get_imgnReaded() * 2 - scanner->get_imgTransfered(); scanner->set_lose_image_num(0);
} }
if ((losemun != 0) || (num != 0)) { }
text += "进纸" + to_string(scanner->get_lose_image_num() + scanner->get_imgnReaded()) + else{
",扫描" + to_string(scanner->get_imgnReaded()) + ",上传" + to_string(scanner->get_imgTransfered()) + if (((num - scanner->get_imgTransfered()) != 0) || ((readnum - scanner->get_imgnReaded()) != 0)) {
",扫描相差" + to_string(losemun) + "份文件,上传相差" + to_string(num) + "份文件!"; text += "进纸" + to_string(scanner->get_scannum()) +
scanner->set_lose_image_num(0); ",扫描" + to_string(scanner->get_imgnReaded()) + ",上传" + to_string(scanner->get_imgTransfered()) +
} ",扫描相差" + to_string(readnum - scanner->get_imgnReaded()) + "份文件,上传相差" + 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); ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), CString((text + " " + caption).c_str()), NULL, SW_HIDE);
} }
@ -766,6 +771,18 @@ void HuagaoDs::SetResoluton(const char* path, int resolution)
delete[]buf; delete[]buf;
} }
void HuagaoDs::dogear_callback(int indexpaper)
{
CString text;
text.Format(_T("74 %d"), indexpaper);
//ShellExecute(NULL, TEXT("open"), GetHidedlgPath(), text, NULL, SW_HIDE);
showmsg("警告",""+to_string(indexpaper)+"检测到折角!");
scanner->Stop_scan();
//scanner->reset();
scanner->ResetScanner();
onDeviceEvent(DOG_EAR);
}
Result HuagaoDs::identityOpenDs(const Identity&) { Result HuagaoDs::identityOpenDs(const Identity&) {
hMutex = CreateMutex(NULL, FALSE, _T("LookitApp")); hMutex = CreateMutex(NULL, FALSE, _T("LookitApp"));
@ -951,33 +968,34 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
m_query[CapType::IPixelType] = msgSupportGetAllSetReset; m_query[CapType::IPixelType] = msgSupportGetAllSetReset;
m_caps[CapType::IPixelType] = [this](Msg msg, Capability& data) -> Result { m_caps[CapType::IPixelType] = [this](Msg msg, Capability& data) -> Result {
if (Msg::Set == msg) { if( Msg::Set==msg) {
auto mech = data.currentItem<CapType::IPixelType>(); auto mech = data.currentItem<CapType::IPixelType>();
if (mech == PixelType::Rgb || mech == PixelType::Gray || mech == PixelType::BlackWhite) if (mech == PixelType::Rgb || mech == PixelType::Gray || mech == PixelType::BlackWhite)
{ {
m_scanparam->pixtype = (int)mech; m_scanparam->pixtype = (int)mech;
if (m_scanparam->pixtype == (int)PixelType::Rgb) { if (m_scanparam->pixtype == (int)PixelType::Rgb){
m_scanparam->filter = (BYTE)Filter::None; m_scanparam->filter = (BYTE)Filter::None;
m_scanparam->enhance_color = (BYTE)Enchace_Color::Enhance_None; m_scanparam->enhance_color = (BYTE)Enchace_Color::Enhance_None;
m_scanparam->automaticcolor = FALSE; m_scanparam->automaticcolor = FALSE;
}
else {
m_scanparam->multi_output_red = 0;//非彩色模式下多流输出不可用
//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_iBitdepth = mech == PixelType::Rgb ? 24 : (mech == PixelType::Gray ? 8 : 1);
return success();
} }
return badValue(); else{
m_scanparam->multi_output_red = 0;//非彩色模式下多流输出不可用
//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_iBitdepth = mech == PixelType::Rgb ? 24 : (mech == PixelType::Gray ? 8 : 1);
return success();
}
return badValue();
} }
return CapSupGetAllReset<int, PixelType, CapType::IPixelType>(msg, data, { PixelType::BlackWhite,PixelType::Gray,PixelType::Rgb }, m_scanparam->pixtype, PixelType::Rgb, return CapSupGetAllReset<int, PixelType, CapType::IPixelType>(msg, data, { PixelType::BlackWhite,PixelType::Gray,PixelType::Rgb }, m_scanparam->pixtype, PixelType::Rgb,
m_scanparam->pixtype == (int)PixelType::Rgb ? 2 : (m_scanparam->pixtype == (int)PixelType::Gray ? 1 : 0), 2); m_scanparam->pixtype == (int)PixelType::Rgb ? 2 : (m_scanparam->pixtype == (int)PixelType::Gray ? 1 : 0), 2);
@ -1499,7 +1517,7 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
m_caps[(CapType)(CapTypeEx::TwEx_CropNoise)] = [this](Msg msg, Capability& data)->Result { m_caps[(CapType)(CapTypeEx::TwEx_CropNoise)] = [this](Msg msg, Capability& data)->Result {
if (Msg::Set == msg) { if (Msg::Set == msg) {
auto mech = data.currentItem<UInt32>(); auto mech = data.currentItem<UInt32>();
if ((mech > 50 || mech < 0) && ((bool)m_scanparam->is_autocrop == true)) if ((mech > 10 || mech < 0) && ((bool)m_scanparam->is_autocrop == true))
return badValue(); return badValue();
m_scanparam->noise = mech; m_scanparam->noise = mech;
return success(); return success();
@ -1640,13 +1658,13 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
if (mech != (BYTE)Enchace_Color::Enhance_None) if (mech != (BYTE)Enchace_Color::Enhance_None)
m_scanparam->filter = (BYTE)Filter::None; m_scanparam->filter = (BYTE)Filter::None;
if (m_scanparam->pixtype == (int)PixelType::BlackWhite)//黑白默认开启红色增强 其他增强不生效 //if (m_scanparam->pixtype == (int)PixelType::BlackWhite)
{ //{
if (m_scanparam->enhance_color == (BYTE)Enchace_Color::Enhance_None) // if (m_scanparam->enhance_color == (BYTE)Enchace_Color::Enhance_None)
{ // {
m_scanparam->enhance_color = (BYTE)Enchace_Color::Enhance_Red; // m_scanparam->enhance_color = (BYTE)Enchace_Color::Enhance_Red;
} // }
} //}
return success(); return success();
} }
} }
@ -1843,6 +1861,22 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
}; };
#endif // LANXUM #endif // LANXUM
m_query[(CapType)(CapTypeEx::TwEx_CropModel)] = msgSupportGetAllSetReset;
m_caps[(CapType)(CapTypeEx::TwEx_CropModel)] = [this](Msg msg, Capability& data)->Result {
if (Msg::Set == msg) {
auto mech = data.currentItem<UInt32>();
if (m_scanparam->fillbackground ||
m_scanparam->autodescrew ||
m_scanparam->is_autocrop ||
m_scanparam->en_fold)
{
return badValue();
}
m_scanparam->normalCrop = (bool)mech;
return success();
}
return CapSupGetAllResetEx<bool, UInt32, (CapType)CapTypeEx::TwEx_CropModel>(msg, data, m_scanparam->normalCrop, false);
};
#ifdef UV #ifdef UV
m_query[(CapType)(CapTypeEx::TwEx_UVModel)] = msgSupportGetAllSetReset; m_query[(CapType)(CapTypeEx::TwEx_UVModel)] = msgSupportGetAllSetReset;
m_caps[(CapType)(CapTypeEx::TwEx_UVModel)] = [this](Msg msg, Capability& data)->Result { m_caps[(CapType)(CapTypeEx::TwEx_UVModel)] = [this](Msg msg, Capability& data)->Result {
@ -1925,25 +1959,8 @@ Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data) {
{ {
if (!(m_scanparam->is_autodiscradblank_normal || m_scanparam->is_autodiscradblank_vince)) if (!(m_scanparam->is_autodiscradblank_normal || m_scanparam->is_autodiscradblank_vince))
{ {
int num = 0; int num = scanner->get_scannum() * (m_scanparam->is_duplex ? 2 : 1) * (m_scanparam->multi_output_red ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1);
bool is_duplex = m_scanparam->is_duplex; if ((num - scanner->get_imgTransfered()) != 0)
#ifdef G1003399
is_duplex = false;
#endif // G1003399
if (is_duplex && m_scanparam->en_fold && m_scanparam->multi_output_red)
num = scanner->get_imgnReaded() * 2 - scanner->get_imgTransfered();
else if (is_duplex && m_scanparam->en_fold)
num = scanner->get_imgnReaded() - scanner->get_imgTransfered();
else if (is_duplex && m_scanparam->multi_output_red)
num = scanner->get_imgnReaded() * 4 - scanner->get_imgTransfered();
else if ((!is_duplex) && m_scanparam->multi_output_red)
num = scanner->get_imgnReaded() * 2 - scanner->get_imgTransfered();
else if (!is_duplex)
num = scanner->get_imgnReaded() - scanner->get_imgTransfered();
else
num = scanner->get_imgnReaded() * 2 - scanner->get_imgTransfered();
if (num != 0)
{ {
showmsg("¾¯¸æ", msgs[LOSE_IMAGE]); showmsg("¾¯¸æ", msgs[LOSE_IMAGE]);
FileTools::writelog(log_ERROR, msgs[LOSE_IMAGE]); FileTools::writelog(log_ERROR, msgs[LOSE_IMAGE]);
@ -2519,7 +2536,6 @@ Twpp::Result HuagaoDs::startScan()
if (guiTwain.get()) { if (guiTwain.get()) {
((CTwainUI*)(guiTwain.get()))->EnableID_OKorID_Cancel(false); ((CTwainUI*)(guiTwain.get()))->EnableID_OKorID_Cancel(false);
} }
int retCode = scanner->aquire_bmpdata(*bmpData.get()); int retCode = scanner->aquire_bmpdata(*bmpData.get());
if (retCode != 0) { if (retCode != 0) {
scanner->Set_ErrorCode(0); scanner->Set_ErrorCode(0);

View File

@ -91,6 +91,7 @@ private://method
Twpp::UInt32 bmpSize() const noexcept; Twpp::UInt32 bmpSize() const noexcept;
const char* bmpBegin() const noexcept; const char* bmpBegin() const noexcept;
const char* bmpEnd() const noexcept; const char* bmpEnd() const noexcept;
void dogear_callback(int indexpaper);
void updataGscanCap(); void updataGscanCap();
Twpp::Result capCommon(const Twpp::Identity& origin, Twpp::Msg msg, Twpp::Capability& data); Twpp::Result capCommon(const Twpp::Identity& origin, Twpp::Msg msg, Twpp::Capability& data);
void showmsg(std::string caption, std::string text, int retcode=0); void showmsg(std::string caption, std::string text, int retcode=0);

Binary file not shown.

Binary file not shown.

Binary file not shown.