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();
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_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_RDSPECIFYSCANNUM, &CFeedPaperPage::OnBnClickedScanMode)
ON_BN_CLICKED(IDC_CKSKEWDETECT, &CFeedPaperPage::OnBnClickedCkskewdetect)
ON_CBN_SELCHANGE(IDC_CMBORENTATION, &CFeedPaperPage::OnCbnSelchangeCmborentation)
END_MESSAGE_MAP()
BOOL CFeedPaperPage::PreTranslateMessage(MSG* pMsg)
@ -131,6 +132,16 @@ void CFeedPaperPage::FeedPaperPageUpdate(int val)
// m_tempBtn->SetCheck(0);
//BOOL enable = (val == 0 || val == 4);
//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)
@ -160,3 +171,10 @@ void CFeedPaperPage::OnBnClickedCkskewdetect()
m_sldSkrewDetecttion.SetPos(3);
m_sldSkrewDetecttion.EnableWindow(m_cbSkew);
}
void CFeedPaperPage::OnCbnSelchangeCmborentation()
{
// TODO: 在此添加控件通知处理程序代码
FeedPaperPageUpdate(comboxduplux);
}

View File

@ -42,6 +42,9 @@ protected:
private:
virtual BOOL PreTranslateMessage(MSG* pMsg);
int comboxduplux;
/*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));
CButton* t_chMultiOutput = (CButton*)(GetDlgItem(IDC_CKMULTIOUTPUT));
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);
}
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)//彩色
{
m_temp->SetCurSel(0);
@ -88,11 +96,18 @@ void CImageProcPage::ImageProcPageUpdate(int val,bool is_Crop)
m_edit_detachnoise.EnableWindow(false);
m_slider_detachnoise.EnableWindow(false);
}
//bool enabele = ival <= 1;//彩色或灰度
//if (!enabele) {
// m_temp_sharpen->SetCurSel(0);
//}
//m_temp_sharpen->EnableWindow(enabele);
#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);
}
void CImageProcPage::ImageAutoDescrewUpdate(int val)
@ -130,7 +145,7 @@ BOOL CImageProcPage::OnInitDialog()
m_edit_hole.SetValue(0.10);
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);
((CButton*)GetDlgItem(IDC_CHECKDETACHNOISE))->SetCheck(is_detachnoise);
@ -222,6 +237,17 @@ void CImageProcPage::OnBnClickedCkfillblackrect()
{
((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);
}
#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_ckbHSVCorrect;
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 EnableOutHoleCheckChanged(BOOL enable);
void SetOutHoleValue(int value);
@ -36,6 +36,8 @@ public:
int indent;
int noise;
int threshold;
int twss;
int cmduplexsel;
bool is_convex;
bool is_crop;
bool is_bw;

View File

@ -60,7 +60,7 @@ 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(),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));
m_pageFeedPaper->FeedPaperPageUpdate(m_pageBasic->m_cmBoxDuplex->GetCurSel());
m_pageImageProc->ImageAutoDescrewUpdate(m_pageBasic->m_cmBoxSS->GetCurSel());
@ -186,9 +186,16 @@ void CTwainUI::UpdateUI()
m_pageImageProc->is_convex = settings->is_convex;
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_ckbAutoDeskrew = settings->autodescrew ? TRUE : FALSE;//自动纠偏
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);
//UpdateSharpenCmbx();
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_ckbHSVCorrect = settings->hsvcorrect == TRUE ? TRUE : FALSE;//答题卡除红
m_pageImageProc->GetDlgItem(IDC_CKMULTIOUTPUT)->EnableWindow(settings->pixtype == 2);//彩色可用
((CButton*)m_pageImageProc->GetDlgItem(IDC_CKMULTIOUTPUT))->SetCheck(settings->pixtype == 2);
m_pageImageProc->UpdateData(FALSE);
m_pageFeedPaper->dogear.SetCheck(settings->is_dogeardetection);
//!< Page feed paper
if(settings->is_duplex==TRUE)
m_pageFeedPaper->m_cbRotation = settings->is_backrotate180==TRUE ? TRUE : FALSE;//背面旋转180
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->GetDlgItem(IDC_CKBACKROTATION)->EnableWindow(settings->is_autotext ? FALSE : TRUE);
}
else
{
m_pageFeedPaper->GetDlgItem(IDC_CKBACKROTATION)->EnableWindow(FALSE);
@ -241,6 +252,8 @@ void CTwainUI::UpdateUI()
m_pageFeedPaper->UpdateData(FALSE);
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()
@ -469,6 +482,7 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs)
settings->contrast = configItem->Contrast;
settings->brightness = (configItem->Brightness);
settings->gamma = (configItem->Gamma);
settings->normalCrop = ((CButton*)m_pageImageProc->GetDlgItem(IDC_CKCROPMODEL))->GetCheck();
settings->is_autocrop = paper.Paper == TwSS::None;
settings->is_duplex = configItem->Duplex >= 1;
settings->is_autodiscradblank_normal = configItem->Duplex == 2;
@ -541,13 +555,13 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs)
settings->resolution_native = 200.0f;
#endif
if (settings->pixtype == TWPT_BW)
{
if (settings->filter == 3 && settings->enhance_color <=1)
{
settings->enhance_color = Enchace_Color::Enhance_Red;
settings->filter = 3;//none
}
}
//{
// if (settings->filter == 3 && settings->enhance_color <=1)
// {
// settings->enhance_color = Enchace_Color::Enhance_Red;
// settings->filter = 3;//none
// }
//}
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));
INT dupindex = m_pageBasic->m_cmBoxDuplex->GetCurSel();
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);
m_pageFeedPaper->GetDlgItem(IDC_CKBACKROTATION)->EnableWindow(FALSE);
}
else
m_pageFeedPaper->GetDlgItem(IDC_CKBACKROTATION)->EnableWindow(m_pageFeedPaper->m_cmBoxOrentation.GetCurSel()==4? FALSE:TRUE);
if (dupindex == 4) {
((CButton*)m_pageImageProc->GetDlgItem(IDC_CKAUTODESKREW))->SetCheck(dupindex == 4 ? TRUE : FALSE);
((CButton*)m_pageImageProc->GetDlgItem(IDC_CKAUTODESKREW))->SetCheck(TRUE);
((CButton*)m_pageImageProc->GetDlgItem(IDC_CKAUTODESKREW))->EnableWindow(FALSE);
}
}
((CButton*)m_pageImageProc->GetDlgItem(IDC_CKAUTODESKREW))->EnableWindow(!(dupindex == 4));
m_pageFeedPaper->GetDlgItem(IDC_CKBACKROTATION)->EnableWindow(!enableback);
else
((CButton*)m_pageImageProc->GetDlgItem(IDC_CKAUTODESKREW))->EnableWindow(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_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)

View File

@ -139,7 +139,16 @@ public:
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>
/// 获取PC获取的图像数量页计数
/// </summary>
@ -238,6 +247,7 @@ protected:
int imgreadednum;
int imgtransfered;
int roller_num;
int scannum;
int lose_image_num;
bool is_AndroidOrLinux;

View File

@ -2,6 +2,7 @@
#include "ImageProcess/ImageApplyHeaders.h"
#include "ImageMultiOutput.h"
#include "scn_config.h"
#include "UsbScanEx.h"
#include "PaperSize.h"
#include "GScan.h"
@ -45,8 +46,6 @@ GScanO1003399::~GScanO1003399()
m_usbthread->join();
m_usbthread.reset();
}
if (fu_rx.valid())
fu_rx.wait();
}
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())
return;
auto lsusb = CyUsbList::find_all();
//auto lsusb = CyUsbList::find_all();
auto lsusb = UsbScan_List::find_vid_pid(0x3072, 0x0139);
if (!lsusb.empty())
{
m_usb = *lsusb.begin();
@ -81,12 +81,14 @@ int GScanO1003399::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
StopWatch sw;
while (true)
{
if ((m_imagedata.Size() < 1)&&(!is_runing()))
if ((image==0)&&(!is_runing())&&(!scanflag))
{
DoEvents();
this_thread::sleep_for(chrono::milliseconds(1));
if (!is_runing())
{
int roller_num_new= count();
set_scannum(abs(roller_num_new - roller_num));
if (devState == DEV_WRONG)
return get_ErrorCode();
return -1;
@ -94,10 +96,10 @@ int GScanO1003399::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
if (sw.elapsed_s() > 30.0)
{
devState = DEV_STOP;
if (fu_rx.valid())
fu_rx.wait();
Stop_scan();
ResetScanner();
int roller_num_new = count();
set_scannum(abs(roller_num_new - roller_num));
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++));
bmpdata = *(m_imagedata.Take());
UpdateScanInfo(get_imgnReaded(), countNTransfered());
image--;
return 0;
}
DoEvents();
@ -165,12 +168,13 @@ bool GScanO1003399::is_scan()
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()
{
return 0;
return count();
}
void GScanO1003399::config_params(GScanCap& param)
@ -269,12 +273,13 @@ void GScanO1003399::config_params(GScanCap& param)
void GScanO1003399::Scanner_StartScan(UINT16 count)
{
roller_num = this->count();
scanflag = true;
Set_ErrorCode(0);
getimgnum = 0;
aquirenum = 0;
image = 0;
keeplastimg = true;
reset();
devState = DEV_ISRUNNING;
if (scan_mode())
@ -299,13 +304,11 @@ void GScanO1003399::Scanner_StartScan(UINT16 count)
void GScanO1003399::Stop_scan()
{
if (devState != DEV_ISRUNNING)
return;
stop();
scanflag = false;
if (fu_rx.valid())
fu_rx.wait();
devState == DEV_ISRUNNING ? devState = DEV_STOP : devState = DEV_WRONG;
if ((devState == DEV_WRONG) || (devState == DEV_STOP))
return;
devState = DEV_STOP;
}
int GScanO1003399::notifyscan()
@ -376,13 +379,16 @@ void GScanO1003399::usb_run()
auto length = m_usb->read_int(buff, sizeof(buff));
if (((length) == sizeof(buff)) || im_dev_count())
{
if (im_dev_count()) //将取图消息提前防止未接收到img信息后不取图导致程序无法退出 2021.7.16
if (is_runing())
im_rx();
HGEIntInfo info = *(HGEIntInfo*)&buff;
switch (info.From)
{
case IMG:
if (is_runing())
im_rx();
break;
//case IMG:
// if (is_runing())
// im_rx();
// break;
case MtBoard:
FileTools::writelog(log_ERROR, "Got MotorBoard error code = " + to_string(info.Code));
break;
@ -392,19 +398,37 @@ void GScanO1003399::usb_run()
case V4L2:
FileTools::writelog(log_ERROR, "Got V4L2 Error code = " + to_string(info.Code));
break;
case STOPSCAN:
FileTools::writelog(log_INFO, "StopScan");
break;
default:
FileTools::writelog(log_ERROR, "Got Unkown error code ! From =" + to_string(info.From) + " Code = " + to_string(info.Code));
break;
}
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;
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)
{
Set_ErrorCode(codeconvter(info));
stop();
}
this_thread::sleep_for(chrono::microseconds(10));
}
@ -424,7 +448,8 @@ void GScanO1003399::stop()
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()
@ -473,9 +498,18 @@ void GScanO1003399::im_rx()
if (!is_rx() && !is_dev_tx())
{
fu_rx = m_imgthread.enqueue([this] {
do
{
while (im_dev_count()){
/* 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;
int count = front_datasize();
buffi->resize(count);
@ -485,9 +519,13 @@ void GScanO1003399::im_rx()
pop_dev_im();
vector<cv::Mat> mats;
auto& buffs = G400Decode(buffi).getImageBuffs();
if (m_param.multi_output_red)
image += 2;
else
image++;
UpdateScanInfo(countNReaded(), get_imgTransfered());
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)
{
vector<cv::Mat> mats;
bool isbwimg = false;
for (auto& buf : buffs) {
cv::ImreadModes rmc;
//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;
}
cv::ImreadModes rmc = m_param.pixtype == 2 ? cv::IMREAD_COLOR : cv::IMREAD_GRAYSCALE;
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);
if (mat.empty()) {
FileTools::writelog(log_ERROR, "decode image data error");
continue;
}
buf.reset();
//if (isbwimg)
// cv::flip(mat, mat, 0);
mats.push_back(mat);
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)
{
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++) {
//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 (mats[i].channels() == 3)
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)
// mats[i].release();
@ -647,6 +683,7 @@ int GScanO1003399::codeconvter(HGEIntInfo code)
break;
}
}
if (code.From == HGType::STOPSCAN)
return -1;
return 0;
}

View File

@ -72,6 +72,7 @@ private:
volatile int devState;
volatile int Error_Code;
volatile bool scanflag;
volatile bool keeplastimg;
GScanCap m_param;
std::shared_ptr<IUsb> m_usb;
volatile bool b_usbthread;
@ -80,6 +81,7 @@ private:
std::shared_ptr<std::thread> m_usbthread;
std::shared_ptr<std::vector<char>> im_data;
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();//ֹͣɨÃè
ResetScanner();
auto rollernew = Get_Roller_num();
if (get_imgnReaded() != (rollernew - roller_num))
set_lose_image_num(std::abs((rollernew - roller_num) - get_imgnReaded()));
set_scannum(abs(rollernew - roller_num));
return HARDWARE_ERROR;
}
if (!is_scan()) {
auto rollernew = Get_Roller_num();
set_scannum(abs(rollernew - roller_num));
if (devState == DEV_WRONG) {
return get_ErrorCode();
}
@ -631,13 +632,6 @@ void GScanO200::usbmain()
{
m_pImages->setscanflags(false);
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;
//m_pImages->setscanflags(false);
//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));
if (sw.elapsed_s() > 30.00)
{
int roller_num_new = Get_Roller_num();
if (m_threadUsb && m_threadUsb->joinable()) {
devState = DEV_STOP;
m_threadUsb->join();
@ -220,10 +221,13 @@ int GScanO400::aquire_bmpdata(std::vector<unsigned char>& bmpdata)
}
Stop_scan();//ֹͣɨÃè
ResetScanner();
set_scannum(abs(roller_num_new - roller_num));
return HARDWARE_ERROR;
}
if (!is_scan()) {
int roller_num_new = Get_Roller_num();
set_scannum(abs(roller_num_new - roller_num));
if (devState == DEV_WRONG) {
return get_ErrorCode();
}
@ -680,13 +684,6 @@ void GScanO400::usbmain()
{
m_pImages->setscanflags(false);
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;
break;
}

View File

@ -24,15 +24,16 @@ static std::map<PaperStatus, unsigned int> SupPaperTyps = {
{{TwSS::B6,PaperAlign::Rot0},10},
{{TwSS::B6,PaperAlign::Rot270},11},
{{TwSS::USLetter,PaperAlign::Rot0},14},
{{TwSS::USLetter,PaperAlign::Rot270},15},
{{TwSS::USLedger,PaperAlign::Rot0},12},
{{TwSS::USLegal,PaperAlign::Rot0},13},
{{TwSS::None,PaperAlign::Rot0},0},
#ifdef G1003399
{{TwSS::USLetter,PaperAlign::Rot270},14},
{{TwSS::USStatement,PaperAlign::Rot0},17},
{{TwSS::MaxSize,PaperAlign::Rot0},19},
{{TwSS::Trigeminy,PaperAlign::Rot0},17}
#else
{ {TwSS::USLetter,PaperAlign::Rot270},15},
{{TwSS::USStatement,PaperAlign::Rot0},16},
{{TwSS::MaxSize,PaperAlign::Rot0},16},
{{TwSS::Trigeminy,PaperAlign::Rot0},16}
@ -118,6 +119,7 @@ enum HGType
FPGA,
V4L2,
IMG,
AutoCorrect,
STOPSCAN,
};
@ -161,7 +163,13 @@ enum Scanner_Reg_Defs
SR_GET_SERIALNUM,
SR_SET_SERIALNUM,
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

View File

@ -173,8 +173,9 @@ void ImageMatQueue::setparam(const GScanCap& param)
#else // REAL300DPI
fixedSize = papersize.GetPaperSize(param.papertype, 200.0f, param.paperAlign);
#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,
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)));
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 ENHANCECOLOR = "iEnhance";
const std::string SHARPENTYPE = "iSharpen";
@ -231,6 +232,7 @@ struct GScanCap
float threshold; /**< Threshold */
uint8_t is_autocontrast; /**< 自动对比度*/
uint8_t is_autocrop; /**< 自动裁切*/
bool normalCrop; /**<传统模式自动裁切*/
uint8_t is_autodiscradblank_normal; /**< 自动丢弃空白页通用*/
int discardblank_percent; /**<跳过空白页阀值*/
uint8_t is_autodiscradblank_vince;/**自动丢弃空白页发票*/

View File

@ -20,67 +20,68 @@ GscanJsonConfig::~GscanJsonConfig()
GScanCap GscanJsonConfig::GetDefaultGscancapValue()
{
GScanCap 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 };
gcap = JsonToGscancap(GetDefaultJson());
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)

View File

@ -8,21 +8,24 @@ CImageApplyAutoCrop::CImageApplyAutoCrop()
, m_isConvexHull(true)
, m_isFillColor(false)
, m_threshold(40)
, m_noise(2)
, m_noise(8)
, 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_isDesaskew(isDesaskew)
, m_isFillBlank(isFillBlank)
, m_isConvexHull(isConvex)
, m_isFillColor(false)
, m_isFillColor(isFillColor)
, m_threshold(threshold)
, m_noise(noise)
, m_indent(indent)
, m_fixedSize(fixedSize)
, m_normalCrop(normalCrop)
{
}
@ -34,7 +37,11 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side)
{
(void)side;
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 thre;
@ -43,7 +50,7 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side)
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);
}
std::vector<cv::Vec4i> hierarchy;
@ -55,6 +62,12 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side)
if (m_maxContour.size() == 0)
{
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;
}
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, dst.rows));
cv::Scalar autoBGColor;
if (m_isFillBlank)
{
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, 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();
@ -137,7 +153,7 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side)
pDib = dst.clone();
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;
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)
{
m_rects.clear();
if (mats.empty()) return;
if (!mats[0].empty()) {
apply(mats[0], 0);
m_rects.push_back(m_rect);
//cv::imwrite("1.bmp", mats[0]);
}
if (isTwoSide && mats.size() > 1)
@ -167,11 +180,8 @@ void CImageApplyAutoCrop::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
cv::Size dSize = m_fixedSize;
if (!mats[0].empty())
m_fixedSize = mats[0].size();
if (!mats[1].empty()) {
apply(mats[1], 1);
m_rects.push_back(m_rect);
//cv::imwrite("1.bmp", mats[0]);
}
if (!mats[0].empty())

View File

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

View File

@ -59,6 +59,7 @@ enum class CapTypeEx : unsigned short {
TwEx_SizeDetect = 0x8103,
TwEx_LowPowerMode = 0x8104,
TwEx_ENCODE = 0x8105,
TwEx_CropModel=0x8106,
};
enum class PaperSizeEx : unsigned short {
@ -86,7 +87,7 @@ using namespace std::placeholders;
TWPP_ENTRY_MFC(HuagaoDs)
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,
#ifdef MAKEHUAGAO
"HUAGO",
@ -344,37 +345,41 @@ HuagaoDs::HuagaoDs()
void HuagaoDs::showmsg(std::string caption, std::string text, int retcode)
{
if (scanner.get()) {
int losemun = scanner->get_lose_image_num();
int num = 0;
bool is_duplex = m_scanparam->is_duplex;
int num = scanner->get_scannum() * (m_scanparam->is_duplex ? 2 : 1) * (m_scanparam->multi_output_red ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1);
#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
if ((retcode == 64 || retcode == 8 || retcode == 16) && losemun > 0)//64 ->SStop
losemun--;
if (!(m_scanparam->is_autodiscradblank_normal || m_scanparam->is_autodiscradblank_vince))
{
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 ((losemun != 0) || (num != 0)) {
text += "进纸" + to_string(scanner->get_lose_image_num() + scanner->get_imgnReaded()) +
if ((retcode == 64 || retcode == 8 || retcode == 16)) {
num = (scanner->get_scannum()-1) * (m_scanparam->is_duplex ? 2 : 1) * (m_scanparam->multi_output_red ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1);
#ifdef G1003399
int readnum = (scanner->get_scannum() -1)* (m_scanparam->is_duplex ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1);
#else
int readnum = scanner->get_scannum()-1;
#endif // G1003399
if (((num - scanner->get_imgTransfered()) > 0)||((readnum-scanner->get_imgnReaded())>0)) {
text += "进纸" + to_string(scanner->get_scannum()-1) +
",扫描" + to_string(scanner->get_imgnReaded()) + ",上传" + to_string(scanner->get_imgTransfered()) +
",扫描相差" + to_string(losemun) + "份文件,上传相差" + to_string(num) + "份文件!";
",扫描相差" + to_string(readnum - scanner->get_imgnReaded()) + "份文件,上传相差" + to_string(num - scanner->get_imgTransfered()) + "份文件!";
scanner->set_lose_image_num(0);
}
}
else{
if (((num - scanner->get_imgTransfered()) != 0) || ((readnum - scanner->get_imgnReaded()) != 0)) {
text += "进纸" + to_string(scanner->get_scannum()) +
",扫描" + 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);
}
@ -766,6 +771,18 @@ void HuagaoDs::SetResoluton(const char* path, int resolution)
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&) {
hMutex = CreateMutex(NULL, FALSE, _T("LookitApp"));
@ -951,28 +968,29 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
m_query[CapType::IPixelType] = msgSupportGetAllSetReset;
m_caps[CapType::IPixelType] = [this](Msg msg, Capability& data) -> Result {
if (Msg::Set == msg) {
if( Msg::Set==msg) {
auto mech = data.currentItem<CapType::IPixelType>();
if (mech == PixelType::Rgb || mech == PixelType::Gray || mech == PixelType::BlackWhite)
{
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->enhance_color = (BYTE)Enchace_Color::Enhance_None;
m_scanparam->automaticcolor = FALSE;
}
else {
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;
}
}
//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();
@ -1499,7 +1517,7 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
m_caps[(CapType)(CapTypeEx::TwEx_CropNoise)] = [this](Msg msg, Capability& data)->Result {
if (Msg::Set == msg) {
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();
m_scanparam->noise = mech;
return success();
@ -1640,13 +1658,13 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
if (mech != (BYTE)Enchace_Color::Enhance_None)
m_scanparam->filter = (BYTE)Filter::None;
if (m_scanparam->pixtype == (int)PixelType::BlackWhite)//黑白默认开启红色增强 其他增强不生效
{
if (m_scanparam->enhance_color == (BYTE)Enchace_Color::Enhance_None)
{
m_scanparam->enhance_color = (BYTE)Enchace_Color::Enhance_Red;
}
}
//if (m_scanparam->pixtype == (int)PixelType::BlackWhite)
//{
// if (m_scanparam->enhance_color == (BYTE)Enchace_Color::Enhance_None)
// {
// m_scanparam->enhance_color = (BYTE)Enchace_Color::Enhance_Red;
// }
//}
return success();
}
}
@ -1843,6 +1861,22 @@ Result HuagaoDs::identityOpenDs(const Identity&) {
};
#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
m_query[(CapType)(CapTypeEx::TwEx_UVModel)] = msgSupportGetAllSetReset;
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))
{
int num = 0;
bool is_duplex = m_scanparam->is_duplex;
#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)
int num = scanner->get_scannum() * (m_scanparam->is_duplex ? 2 : 1) * (m_scanparam->multi_output_red ? 2 : 1) / (m_scanparam->en_fold ? 2 : 1);
if ((num - scanner->get_imgTransfered()) != 0)
{
showmsg("警告", msgs[LOSE_IMAGE]);
FileTools::writelog(log_ERROR, msgs[LOSE_IMAGE]);
@ -2519,7 +2536,6 @@ Twpp::Result HuagaoDs::startScan()
if (guiTwain.get()) {
((CTwainUI*)(guiTwain.get()))->EnableID_OKorID_Cancel(false);
}
int retCode = scanner->aquire_bmpdata(*bmpData.get());
if (retCode != 0) {
scanner->Set_ErrorCode(0);

View File

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

Binary file not shown.

Binary file not shown.

Binary file not shown.