diff --git a/huagao/CImageProcPage.cpp b/huagao/CImageProcPage.cpp index e5f7555f..f8940b80 100644 --- a/huagao/CImageProcPage.cpp +++ b/huagao/CImageProcPage.cpp @@ -36,6 +36,7 @@ CImageProcPage::CImageProcPage(CWnd* pParent /*=nullptr*/) , m_ckbAutoDeskrew(FALSE) , m_ckbMultioutput(FALSE) , m_ckbRemoveHole(FALSE) + , m_ckbHSVCorrect(FALSE) { } @@ -68,11 +69,11 @@ void CImageProcPage::ImageProcPageUpdate(int val) t_chMultiOutput->EnableWindow(FALSE); } - bool enabele = ival <= 1;//彩色或灰度 - if (!enabele) { - m_temp_sharpen->SetCurSel(0); - } - m_temp_sharpen->EnableWindow(enabele); + //bool enabele = ival <= 1;//彩色或灰度 + //if (!enabele) { + // m_temp_sharpen->SetCurSel(0); + //} + //m_temp_sharpen->EnableWindow(enabele); } void CImageProcPage::ImageAutoDescrewUpdate(int val) @@ -96,6 +97,7 @@ void CImageProcPage::DoDataExchange(CDataExchange* pDX) DDX_Check(pDX, IDC_CKAUTODESKREW, m_ckbAutoDeskrew); DDX_Check(pDX, IDC_CKMULTIOUTPUT, m_ckbMultioutput); DDX_Check(pDX, IDC_CKREMOVEHOLE, m_ckbRemoveHole); + DDX_Check(pDX, IDC_CKHSVCORRECT, m_ckbHSVCorrect); } BOOL CImageProcPage::OnInitDialog() diff --git a/huagao/CImageProcPage.h b/huagao/CImageProcPage.h index b7621126..0070ddf7 100644 --- a/huagao/CImageProcPage.h +++ b/huagao/CImageProcPage.h @@ -21,6 +21,7 @@ public: BOOL m_ckbAutoDeskrew; BOOL m_ckbMultioutput; BOOL m_ckbRemoveHole; + BOOL m_ckbHSVCorrect; void ImageProcPageUpdate(int val); void ImageAutoDescrewUpdate(int val); @@ -39,4 +40,6 @@ protected: DECLARE_MESSAGE_MAP() afx_msg void OnCtrlChange(); + + }; diff --git a/huagao/CTwainUI.cpp b/huagao/CTwainUI.cpp index b04a4413..61a3d797 100644 --- a/huagao/CTwainUI.cpp +++ b/huagao/CTwainUI.cpp @@ -162,6 +162,7 @@ void CTwainUI::UpdateUI() m_pageImageProc->m_ckbMultioutput = settings->multi_output_red == TRUE ? TRUE : FALSE;//多流除红 else m_pageImageProc->m_ckbMultioutput = FALSE;//多流除红 + m_pageImageProc->m_ckbHSVCorrect = settings->hsvcorrect == TRUE ? TRUE : FALSE;//答题卡除红 m_pageImageProc->GetDlgItem(IDC_CKMULTIOUTPUT)->EnableWindow(settings->pixtype == 2);//彩色可用 m_pageImageProc->UpdateData(FALSE); @@ -368,6 +369,7 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs) configItem->EnOutHole = m_pageImageProc->m_ckbRemoveHole;//除穿孔可用性 configItem->OutHoleRatio = WndCtrl2f(&(m_pageImageProc->m_edit_hole)) * 100;//穿孔搜索范围比例系数 configItem->EnMultiOutPutR = m_pageImageProc->m_ckbMultioutput;//多流除红 + configItem->EnHsvCorrect = m_pageImageProc->m_ckbHSVCorrect;//答题卡除红 //!< Page feed paper m_pageFeedPaper->UpdateData(); @@ -459,6 +461,7 @@ void CTwainUI::UpDateScanParam(PCONFIGPARAMS configItem, bool updateDs) settings->fillhole.is_fillhole = configItem->EnOutHole; settings->fillhole.fillholeratio = configItem->OutHoleRatio; settings->multi_output_red = configItem->EnMultiOutPutR; + settings->hsvcorrect = configItem->EnHsvCorrect; #ifdef REAL300DPI settings->resolution_native = settings->resolution_dst > 240.0f ? 300.0f : 200.0f; #else // REAL300DPI diff --git a/huagao/G4Tiff.cpp b/huagao/G4Tiff.cpp index 20e09750..883883e6 100644 --- a/huagao/G4Tiff.cpp +++ b/huagao/G4Tiff.cpp @@ -20,9 +20,10 @@ G4Tiff::G4Tiff(cv::Mat & mat, int threshold) except(TIFFSetField(pTiffHandle, TIFFTAG_IMAGELENGTH, height), "length"); except(TIFFSetField(pTiffHandle, TIFFTAG_BITSPERSAMPLE, 1), "bits per sample"); except(TIFFSetField(pTiffHandle, TIFFTAG_SAMPLESPERPIXEL, 1), "samples per pixel"); - except(TIFFSetField(pTiffHandle, TIFFTAG_ROWSPERSTRIP, 1), "rows per strip"); + except(TIFFSetField(pTiffHandle, TIFFTAG_ROWSPERSTRIP, height), "rows per strip"); - except(TIFFSetField(pTiffHandle, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX4), "compression"); + //except(TIFFSetField(pTiffHandle, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX4), "compression"); + except(TIFFSetField(pTiffHandle, TIFFTAG_COMPRESSION, COMPRESSION_CCITT_T6), "compression"); except(TIFFSetField(pTiffHandle, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE), "photometric"); except(TIFFSetField(pTiffHandle, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB), "photometric"); except(TIFFSetField(pTiffHandle, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG), "planar config"); @@ -33,8 +34,9 @@ G4Tiff::G4Tiff(cv::Mat & mat, int threshold) except(TIFFSetField(pTiffHandle, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH), "res unit"); std::vector _buffer(width / 8 + 8, 0); + //std::vector _buffer(width / 8 + 1, 0); uchar* buffer = &_buffer[0]; - int bytes = int(width / 8.0 + 0.5); + //int bytes = int(width / 8.0 + 0.5); for (int y = 0; y < height; ++y) { uint8_t* src_row = mat.ptr(y); @@ -46,7 +48,7 @@ G4Tiff::G4Tiff(cv::Mat & mat, int threshold) eight_pixels = eight_pixels | 1; // buffer[x / 8] = eight_pixels; } - except(TIFFWriteScanline(pTiffHandle, buffer, y, bytes) != -1, "write scanline"); + except(TIFFWriteScanline(pTiffHandle, buffer, y, 0) != -1, "write scanline"); } } @@ -76,16 +78,20 @@ void G4Tiff::GetCompressedData(std::vector& cmpeddata) FILE* file = fopen(m_tmppath.c_str(), "rb"); if (file) { + int filesize = _lseek(_fileno(file), 0, SEEK_END); // seek to EOF fseek(file, 0, SEEK_SET); + std::vector ifh(8, 0); + fread(ifh.data(), 1, ifh.size(), file); + int size = (int)(*(int*)(ifh.data() + 4)); + fseek(file, 8, SEEK_SET); if (filesize) { - cmpeddata.resize(filesize); - fread(cmpeddata.data(), 1, filesize, file); + cmpeddata.resize(size); + fread(cmpeddata.data(), 1, size, file); } - FILE* file1 = fopen("d:\\1.tiff", "wb"); - fwrite(cmpeddata.data(), filesize, 1, file1); - fclose(file1); + + } fclose(file); diff --git a/huagao/GscanJsonConfig.cpp b/huagao/GscanJsonConfig.cpp index 2254e23c..669b6be6 100644 --- a/huagao/GscanJsonConfig.cpp +++ b/huagao/GscanJsonConfig.cpp @@ -47,6 +47,7 @@ GScanCap GscanJsonConfig::GetDefaultGscancapValue() 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;//ĬϿ˫ @@ -93,6 +94,7 @@ void GscanJsonConfig::SaveGscanCapConfig(const GScanCap & gcap, const std::strin outJson["Config"].Add(MULTIOUTPUT, (bool)(gcap.multi_output_red), false); outJson["Config"].Add(OUTHOLE, (bool)(gcap.fillhole.is_fillhole), false); outJson["Config"].Add(OUTHOLERATIO, (int)(gcap.fillhole.fillholeratio)); + outJson["Config"].Add(HSVCORRECT, (bool)(gcap.hsvcorrect)); outJson["Config"].Add(ULTRADETECT, (bool)(gcap.hardwarecaps.en_doublefeed), false); outJson["Config"].Add(BINDINGDETECT, (bool)(gcap.hardwarecaps.en_stapledetect), false); @@ -143,6 +145,7 @@ void GscanJsonConfig::WriteJsonArrayToFile(std::vector cfgArray, const root["Config"].AddEmptySubArray(MULTIOUTPUT); root["Config"].AddEmptySubArray(OUTHOLE); root["Config"].AddEmptySubArray(OUTHOLERATIO); + root["Config"].AddEmptySubArray(HSVCORRECT); /*< feeder settings*/ root["Config"].AddEmptySubArray(ULTRADETECT); @@ -185,6 +188,7 @@ void GscanJsonConfig::WriteJsonArrayToFile(std::vector cfgArray, const root["Config"][MULTIOUTPUT].Add(i, (bool)cfgArray[i].multi_output_red); root["Config"][OUTHOLE].Add(i, (bool)cfgArray[i].fillhole.is_fillhole); root["Config"][OUTHOLERATIO].Add(cfgArray[i].fillhole.fillholeratio); + root["Config"][HSVCORRECT].Add(i, (bool)cfgArray[i].hsvcorrect); root["Config"][ULTRADETECT].Add(i, (bool)cfgArray[i].hardwarecaps.en_doublefeed); root["Config"][BINDINGDETECT].Add(i, (bool)cfgArray[i].hardwarecaps.en_stapledetect); @@ -329,6 +333,8 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str root["Config"].Get(OUTHOLE, itmOutHole); neb::CJsonObject itmOutHoleRatio; root["Config"].Get(OUTHOLERATIO, itmOutHoleRatio); + neb::CJsonObject itmHsvCorrect; + root["Config"].Get(HSVCORRECT, itmHsvCorrect); neb::CJsonObject itmUltDetect; root["Config"].Get(ULTRADETECT, itmUltDetect); @@ -415,6 +421,8 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str cfp.fillhole.is_fillhole = b_value ? 1 : 0; itmOutHoleRatio.Get(i, i_value); cfp.fillhole.fillholeratio = i_value; + itmHsvCorrect.Get(i, b_value); + cfp.hsvcorrect = b_value ? 1 : 0; itmUltDetect.Get(i, b_value); cfp.hardwarecaps.en_doublefeed = b_value ? 1 : 0; @@ -503,6 +511,9 @@ std::vector GscanJsonConfig::parseJsonFromString(const std::string str cfp.fillhole.is_fillhole = bvalue?1:0; root["Config"].Get(OUTHOLERATIO, index); cfp.fillhole.fillholeratio = index; + root["Config"].Get(HSVCORRECT, bvalue); + cfp.hsvcorrect = bvalue ? 1 : 0; + root["Config"].Get(ULTRADETECT, bvalue); cfp.hardwarecaps.en_doublefeed = bvalue?1:0; diff --git a/huagao/huagaods.cpp b/huagao/huagaods.cpp index ceb82497..bd6399cc 100644 --- a/huagao/huagaods.cpp +++ b/huagao/huagaods.cpp @@ -42,7 +42,8 @@ enum class CapTypeEx : unsigned short { TwEx_DBDevnMax = 0x8028, TwEx_StableDetectEnable = 0x8090, TwEx_UVModel = 0x8093, - TwEx_SwitchFrontBack = 0x8094 + TwEx_SwitchFrontBack = 0x8094, + TwEx_HsvCorrect = 0x8095 }; using namespace Twpp; @@ -1367,6 +1368,31 @@ Result HuagaoDs::identityOpenDs(const Identity&) { } }; + //⿨ + m_query[(CapType)(CapTypeEx::TwEx_HsvCorrect)] = msgSupportGetAllSetReset; + m_caps[(CapType)(CapTypeEx::TwEx_HsvCorrect)] = [this](Msg msg, Capability& data)->Result { + switch (msg) { + case Msg::Get: + data = Capability::createEnumeration((CapType)(CapTypeEx::TwEx_HsvCorrect), { Bool(),Bool(true) }, Bool(m_scanparam->hsvcorrect), 0); + return success(); + case Msg::GetCurrent: + data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_HsvCorrect), m_scanparam->hsvcorrect); + return success(); + case Msg::Reset: + m_scanparam->hsvcorrect = false; + case Msg::GetDefault: + data = Capability::createOneValue((CapType)(CapTypeEx::TwEx_HsvCorrect), Bool(false)); + return success(); + case Msg::Set: { + auto mech = data.currentItem(); + m_scanparam->hsvcorrect = mech; + return success(); + } + default: + return capBadOperation(); + } + }; + m_query[CapType::IFilter] = msgSupportGetAllSetReset; m_caps[CapType::IFilter] = [this](Msg msg, Capability& data)->Result { switch (msg) { @@ -1720,6 +1746,7 @@ Result HuagaoDs::identityCloseDs(const Identity&) { if (guiBridge.get()) guiBridge.reset(); + scanner.reset(); if (hMutex) @@ -1745,7 +1772,7 @@ Result HuagaoDs::pendingXfersEnd(const Identity&, PendingXfers& data) { scanner->Set_ErrorCode(0); guiIndicator.reset(); if (ret != -1) { - MessageBox(guiTwain ? guiTwain->m_hWnd : NULL, noticeMsgMap[ret], _T("ʾ"), MB_SYSTEMMODAL | MB_OK | MB_ICONINFORMATION); + MessageBox(guiTwain ? guiTwain->m_hWnd : NULL, noticeMsgMap[ret], _T("ʾ"), MB_SYSTEMMODAL | MB_OK | MB_ICONINFORMATION);// #ifndef G200 scanner->clear_hwerror(); #endif // G200 @@ -1900,11 +1927,11 @@ Result HuagaoDs::imageMemXferGet(const Identity& origin, ImageMemXfer& data) { if (rows == 0) { return seqError(); // image already transfered in this session } - //cv::Mat mat = cv::imdecode(bmpData, cv::IMREAD_GRAYSCALE); + cv::Mat mat = cv::imdecode(bmpData, cv::IMREAD_GRAYSCALE); //G4Tiff gt(mat); //vector cmpdata; //gt.GetCompressedData(cmpdata); - ////int aa = 1; + //int aa = 1; data.setBytesPerRow(bpl); data.setColumns(static_cast(dib->biWidth)); data.setRows(rows); @@ -2145,8 +2172,8 @@ void HuagaoDs::updataGscanCap() Twpp::Result HuagaoDs::startScan() { - if (!scanner->IsConnected()) - return checkDeviceOnline(); + //if (!scanner->IsConnected()) + // return checkDeviceOnline(); scanner->ResetScanner(); diff --git a/huagao/huagaods.hpp b/huagao/huagaods.hpp index 74029af9..3742d687 100644 --- a/huagao/huagaods.hpp +++ b/huagao/huagaods.hpp @@ -63,7 +63,7 @@ protected: virtual Twpp::Result setupFileXferSet(const Twpp::Identity& origin, Twpp::SetupFileXfer& data) override; virtual Twpp::Result setupFileXferReset(const Twpp::Identity& origin, Twpp::SetupFileXfer& data) override; virtual Twpp::Result call(const Twpp::Identity& origin, Twpp::DataGroup dg, Twpp::Dat dat, Twpp::Msg msg, void* data) override; - static void SetResoluton(const char* path, int resolution); + void SetResoluton(const char* path, int resolution); private: Twpp::Result showTwainUI(Twpp::UserInterface& data, bool bUiOnly = false); Twpp::Result startScan(); diff --git a/huagao/huagaotwds.rc b/huagao/huagaotwds.rc index b3b5fc19..b75a360f 100644 Binary files a/huagao/huagaotwds.rc and b/huagao/huagaotwds.rc differ diff --git a/huagao/resource.h b/huagao/resource.h index 67e33b48..c7b8ab22 100644 Binary files a/huagao/resource.h and b/huagao/resource.h differ diff --git a/huagao/stdafx.h b/huagao/stdafx.h index 80951067..4fc771f3 100644 Binary files a/huagao/stdafx.h and b/huagao/stdafx.h differ