|
|
@@ -5,6 +5,9 @@
|
|
|
#include "CommDevEntityErrorCode.h"
|
|
|
#include "fileutil.h"
|
|
|
|
|
|
+#include "opencv.hpp"
|
|
|
+#include <math.h>
|
|
|
+
|
|
|
#define RESET_TIMER_ID 1
|
|
|
#define CHECK_CONNECT_TIMER_ID 2
|
|
|
|
|
|
@@ -1091,6 +1094,75 @@ int CHSPScannerFSM::StopPreview(SpReqAnsContext<HSPScannerService_CancelPreview_
|
|
|
return nRes;
|
|
|
}
|
|
|
|
|
|
+bool CHSPScannerFSM::ResizeImage(CSimpleStringA fileName)
|
|
|
+{
|
|
|
+ LOG_FUNCTION();
|
|
|
+
|
|
|
+ double rate; //limit rate
|
|
|
+ int width;
|
|
|
+ int height;
|
|
|
+ bool success = TRUE;
|
|
|
+
|
|
|
+ CSmartPointer<IEntityFunction> spFunction = this->GetEntityBase()->GetFunction();
|
|
|
+ CSmartPointer<IConfigInfo> spConfig;
|
|
|
+ spFunction->OpenConfig(Config_Software, spConfig);
|
|
|
+ int kb = 0;
|
|
|
+ ErrorCodeEnum ec = spConfig->ReadConfigValueInt("Img", "KB", kb);
|
|
|
+ int imageSize = kb * 1024;
|
|
|
+
|
|
|
+ FILE* fHandle = fopen(fileName.GetData(), "rb");
|
|
|
+ if (!fHandle)
|
|
|
+ {
|
|
|
+ Dbg("Read file(%s) faild.", (LPCTSTR)fileName);
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ CSimpleStringA backUpFile = fileName + ".backup";
|
|
|
+ fileutil_copy_file((LPCTSTR)backUpFile, (LPCTSTR)fileName);
|
|
|
+
|
|
|
+ fseek(fHandle, 0, SEEK_END);
|
|
|
+ long fileSize = ftell(fHandle);
|
|
|
+ fclose(fHandle);
|
|
|
+
|
|
|
+ while (fileSize > imageSize)
|
|
|
+ {
|
|
|
+ rate = (double)fileSize / imageSize;
|
|
|
+ rate = 1.0 / sqrt(rate); //width and height limit rate
|
|
|
+
|
|
|
+ cv::Mat img = cv::imread(fileName.GetData());
|
|
|
+
|
|
|
+ if (!img.data)
|
|
|
+ {
|
|
|
+ Dbg("Invalid image(%s)!", (LPCTSTR)fileName);
|
|
|
+ success = FALSE;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+ width = img.cols;
|
|
|
+ height = img.rows;
|
|
|
+
|
|
|
+ cv::resize(img, img, cv::Size(width * rate, height * rate));
|
|
|
+ cv::imwrite(fileName.GetData(), img);
|
|
|
+
|
|
|
+ fHandle = fopen(fileName.GetData(), "rb");
|
|
|
+ fseek(fHandle, 0, SEEK_END);
|
|
|
+ fileSize = ftell(fHandle);
|
|
|
+ fclose(fHandle);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!success)
|
|
|
+ {
|
|
|
+ Dbg("Rsize Image failed.");
|
|
|
+ fileutil_copy_file((LPCTSTR)fileName, (LPCTSTR)backUpFile); //recover original img
|
|
|
+ RemoveFileA((LPCTSTR)backUpFile);
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ Dbg("Rsize Image suc.");
|
|
|
+ RemoveFileA((LPCTSTR)backUpFile);
|
|
|
+ return TRUE;
|
|
|
+}
|
|
|
+
|
|
|
int CHSPScannerFSM::ScanImage(SpReqAnsContext<HSPScannerService_ScanImage_Req,
|
|
|
HSPScannerService_ScanImage_Ans>::Pointer ctx)
|
|
|
{
|
|
|
@@ -1109,6 +1181,17 @@ int CHSPScannerFSM::ScanImage(SpReqAnsContext<HSPScannerService_ScanImage_Req,
|
|
|
}
|
|
|
|
|
|
erroCode = m_hDevHelper->ScanImage((LPCTSTR)csImageFile);
|
|
|
+
|
|
|
+ //Copy image to csImageFile for test.
|
|
|
+ //fileutil_copy_file((LPCTSTR)csImageFile, "/home/vtm/Documents/share/compress/jpg/big.jpeg");
|
|
|
+
|
|
|
+ //Image size limit
|
|
|
+ if (!ResizeImage(csImageFile))
|
|
|
+ {
|
|
|
+ LOG_TRACE("resize(%s) error.", (LPCTSTR)csImageFile);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
if(ISSUCCEEDED(erroCode))
|
|
|
{
|
|
|
Dbg("ScanImage suc.");
|
|
|
@@ -1221,9 +1304,18 @@ int CHSPScannerFSM::ScanImageEx(SpReqAnsContext<HSPScannerService_ScanImageEx_Re
|
|
|
erroCode = m_hDevHelper->ScanImageEx(pBtImage, len, (LPCTSTR)csImageFile);
|
|
|
}
|
|
|
|
|
|
+ //Copy image to csImageFile for test.
|
|
|
+ //fileutil_copy_file((LPCTSTR)csImageFile, "/home/vtm/Documents/share/compress/jpg/big.jpeg");
|
|
|
+
|
|
|
+ //Image size limit
|
|
|
+ if (!ResizeImage(csImageFile))
|
|
|
+ {
|
|
|
+ LOG_TRACE("resize(%s) error.", (LPCTSTR)csImageFile);
|
|
|
+ }
|
|
|
+
|
|
|
if(ISSUCCEEDED(erroCode))
|
|
|
{
|
|
|
- Dbg("ScanImageEx suc %d, %d.", len, strlen((const char*)pBtImage));
|
|
|
+ Dbg("ScanImageEx suc %d, %d.", len, strlen((const char*)pBtImage));
|
|
|
//TODO:
|
|
|
ctx->Ans.filePath = csImageFile;
|
|
|
CBlob& cbData = ctx->Ans.imageData;
|