mirror of http://192.168.1.51:8099/lmh188/twain3.0
parent
639a175a17
commit
a11f063bf4
|
@ -39,6 +39,7 @@ G200Decode::G200Decode(std::shared_ptr<std::vector<char>> buff)
|
|||
buffF->resize(f_buffer_size);
|
||||
m_buffs.push_back(buffB);
|
||||
m_buffs.push_back(buffF);
|
||||
buff.reset();
|
||||
#else // G200
|
||||
m_buffs.push_back(buff);
|
||||
#endif
|
||||
|
@ -47,13 +48,14 @@ G200Decode::G200Decode(std::shared_ptr<std::vector<char>> buff)
|
|||
ImageMatQueue::ImageMatQueue(void)
|
||||
: bRun(false)
|
||||
, is_scanning(false)
|
||||
,fx(1.001)
|
||||
,fy(1.007)
|
||||
{
|
||||
atm_orgin_image_remains = 0;
|
||||
}
|
||||
|
||||
void ImageMatQueue::run()
|
||||
{
|
||||
GetFixRatio(fx, fy);
|
||||
if (!m_threadProc) {
|
||||
bRun = true;
|
||||
m_threadProc.reset(new thread(&ImageMatQueue::proc, this));
|
||||
|
@ -65,6 +67,23 @@ int ImageMatQueue::orginimgcount()
|
|||
return atm_orgin_image_remains;
|
||||
}
|
||||
|
||||
float ImageMatQueue::getdpi()
|
||||
{
|
||||
return scanParam.resolution_dst;
|
||||
}
|
||||
|
||||
void ImageMatQueue::updatefixratio(float& hratio, float& vratio)
|
||||
{
|
||||
if (hratio > 0.80f && hratio < 1.2f && vratio >0.80f && vratio < 1.2f) {
|
||||
fx = hratio;
|
||||
fy = vratio;
|
||||
}
|
||||
else
|
||||
{
|
||||
writelog("error horizental or vertical ratio");
|
||||
}
|
||||
}
|
||||
|
||||
ImageMatQueue::~ImageMatQueue(void)
|
||||
{
|
||||
m_rawBuffs.Clear();
|
||||
|
@ -80,16 +99,13 @@ ImageMatQueue::~ImageMatQueue(void)
|
|||
|
||||
void ImageMatQueue::pushMat(std::shared_ptr<IDecode> data)
|
||||
{
|
||||
//std::lock_guard<std::mutex> lock(m_mtxJB);
|
||||
m_rawBuffs.Put(data);
|
||||
atm_orgin_image_remains++;
|
||||
}
|
||||
|
||||
std::vector<unsigned char> ImageMatQueue::popBmpdata()
|
||||
std::shared_ptr<std::vector<unsigned char>> ImageMatQueue::popBmpdata()
|
||||
{
|
||||
//std::lock_guard<std::mutex> lock(m_mtxJB);
|
||||
std::vector<unsigned char> retdata = m_imagedata.Take();
|
||||
return retdata;
|
||||
return m_imagedata.Take();
|
||||
}
|
||||
|
||||
bool ImageMatQueue::valid()
|
||||
|
@ -210,9 +226,12 @@ void ImageMatQueue::setparam(const GScanCap& param)
|
|||
void ImageMatQueue::EnqueueBmpBuffer(std::vector<unsigned char>& bmpdata)
|
||||
{
|
||||
//std::lock_guard<std::mutex> lock(m_Locker);
|
||||
//m_imagedata.Put(bmpdata);
|
||||
}
|
||||
void ImageMatQueue::EnqueueBmpBuffer(std::shared_ptr<std::vector<unsigned char>> bmpdata)
|
||||
{
|
||||
m_imagedata.Put(bmpdata);
|
||||
}
|
||||
|
||||
void ImageMatQueue::PaniusCount()
|
||||
{
|
||||
atm_orgin_image_remains--;
|
||||
|
@ -251,12 +270,14 @@ void ImageMatQueue::proc()
|
|||
try
|
||||
{
|
||||
cv::Mat mat = cv::imdecode(*buf, rm);
|
||||
buf.reset();
|
||||
if (mat.empty()) {
|
||||
writelog("decode image data error");
|
||||
}
|
||||
#ifdef G200
|
||||
resize(mat, mat, cv::Size(), 1.001, 1.007);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动
|
||||
resize(mat, mat, cv::Size(), fx, fy);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动
|
||||
mats.push_back(mat);
|
||||
mat.release();
|
||||
#else // G200
|
||||
//resize(mat, mat, cv::Size(), 1.001, 1.0070);//用于修正与佳能机器幅面大小不匹配问题 此系数请勿轻易动
|
||||
Mat front = mat(Rect(0, 0, mat.cols / 2, mat.rows));
|
||||
|
@ -271,6 +292,7 @@ void ImageMatQueue::proc()
|
|||
writelog(e.what());
|
||||
}
|
||||
}
|
||||
buffs.clear();
|
||||
|
||||
for (int j = 0; j < m_iaList.size(); j++) {
|
||||
m_iaList[j]->apply(mats, scanParam.is_duplex);
|
||||
|
@ -285,6 +307,7 @@ void ImageMatQueue::proc()
|
|||
IMat2Bmp idata;
|
||||
idata = scanParam.pixtype == 0 ? (IMat2Bmp)Mat2BmpBw(mats[i], scanParam.resolution_dst) : Mat2Bmp(mats[i], scanParam.resolution_dst);
|
||||
auto data = idata.getBmpDataBuffer();
|
||||
//mats[i].release();
|
||||
EnqueueBmpBuffer(data);
|
||||
}
|
||||
else
|
||||
|
@ -298,6 +321,7 @@ void ImageMatQueue::proc()
|
|||
if (!mats[i].empty()) {
|
||||
ImageMultiOutput m_mlt;
|
||||
Mat ret = m_mlt.GetMultiFilterMat(mats[i], 2);
|
||||
mats[i].release();
|
||||
if (!ret.empty()) {
|
||||
if (!scanParam.is_duplex && i == 1) {
|
||||
ret.release();
|
||||
|
@ -305,43 +329,18 @@ void ImageMatQueue::proc()
|
|||
}
|
||||
Mat2Bmp mb(ret, scanParam.resolution_dst);
|
||||
auto data = mb.getBmpDataBuffer();
|
||||
ret.release();
|
||||
EnqueueBmpBuffer(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
mats.clear();
|
||||
PaniusCount();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ImageMatQueue::GetFixRatio(double& fixX,double& fixY)
|
||||
{
|
||||
//TCHAR szIniFile[MAX_PATH] = { 0 };
|
||||
//SHGetSpecialFolderPath(NULL, szIniFile, CSIDL_LOCAL_APPDATA, TRUE);
|
||||
//_tcscat(szIniFile, HUAGAO_SCAN);
|
||||
//_tcscat(szIniFile, _T("\\fixed.txt"));
|
||||
//string path = TCHAR2STRING(szIniFile);
|
||||
fixX = 1.0010;
|
||||
fixY = 1.0070;
|
||||
//if (path.length() > 1) {
|
||||
// ifstream io(path);
|
||||
// if (io.is_open()) {
|
||||
// int linenum = 0;
|
||||
// string str_line;
|
||||
// while (!io.eof())
|
||||
// {
|
||||
// getline(io, str_line);
|
||||
// linenum == 0 ? fixY = stod(str_line) : fixX = stod(str_line);
|
||||
// }
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// writelog("error on getting xy ratio");
|
||||
// }
|
||||
//}
|
||||
}
|
||||
|
||||
GRawDecode::GRawDecode(std::shared_ptr<std::vector<char>> buff)
|
||||
{
|
||||
m_buffs.push_back(buff);
|
||||
|
|
|
@ -12,21 +12,47 @@
|
|||
class IMat2Bmp {
|
||||
public:
|
||||
virtual ~IMat2Bmp() {}
|
||||
virtual std::vector<unsigned char> getBmpDataBuffer() {
|
||||
virtual std::shared_ptr<std::vector<unsigned char>> getBmpDataBuffer() {
|
||||
return m_data;
|
||||
};
|
||||
virtual void setBmpFileHeader(const cv::Mat& mat) {};
|
||||
virtual void setBmpInfoHeader(const cv::Mat& mat, const long res) {};
|
||||
protected:
|
||||
std::vector<unsigned char> m_data;
|
||||
std::shared_ptr<std::vector<unsigned char>> m_data;
|
||||
};
|
||||
|
||||
class Mat2Bmp:public IMat2Bmp {
|
||||
public:
|
||||
Mat2Bmp(const cv::Mat& mat,float res) {
|
||||
m_data =std::shared_ptr<std::vector<unsigned char>>(new std::vector<unsigned char>());
|
||||
int headersize = mat.channels() == 3 ? 54 : 1078;
|
||||
int bmpdatasize = mat.step1() * mat.rows;
|
||||
m_data.resize(headersize + bmpdatasize);
|
||||
cv::imencode(".bmp", mat, m_data);
|
||||
BITMAPINFOHEADER* infoheader = (BITMAPINFOHEADER*)(m_data.data() + sizeof(BITMAPFILEHEADER));
|
||||
m_data->resize(headersize + bmpdatasize);
|
||||
cv::imencode(".bmp", mat, *(m_data.get()));
|
||||
setBmpFileHeader(mat);
|
||||
setBmpInfoHeader(mat, res);
|
||||
}
|
||||
private:
|
||||
void setBmpFileHeader(const cv::Mat& mat)
|
||||
{
|
||||
BITMAPFILEHEADER* fileheader = (BITMAPFILEHEADER*)(m_data->data());
|
||||
fileheader->bfType = ((unsigned short)('M' << 8) | 'B');
|
||||
fileheader->bfSize = m_data.get()->size();
|
||||
fileheader->bfReserved1 = 0;
|
||||
fileheader->bfReserved2 = 0;
|
||||
fileheader->bfOffBits = mat.channels() == 3 ? 54 : 1078;
|
||||
}
|
||||
|
||||
void setBmpInfoHeader(const cv::Mat& mat, const long res)
|
||||
{
|
||||
BITMAPINFOHEADER* infoheader = (BITMAPINFOHEADER*)(m_data->data() + sizeof(BITMAPFILEHEADER));
|
||||
infoheader->biSize = sizeof(BITMAPINFOHEADER);
|
||||
infoheader->biWidth = mat.cols;
|
||||
infoheader->biHeight = mat.rows;
|
||||
infoheader->biPlanes = 1;
|
||||
infoheader->biBitCount = mat.channels() == 3 ? 24 : 8;
|
||||
infoheader->biCompression = 0;
|
||||
infoheader->biSizeImage = (int)((mat.cols * mat.channels() * 8 + 31) / 32) * 4 * mat.rows;
|
||||
infoheader->biXPelsPerMeter = infoheader->biYPelsPerMeter = static_cast<LONG>(res * 39.37F + 0.5);
|
||||
infoheader->biClrUsed = infoheader->biClrImportant = infoheader->biBitCount == 8 ? 256 : 0;
|
||||
}
|
||||
|
@ -35,18 +61,18 @@ public:
|
|||
class Mat2BmpBw :public IMat2Bmp {
|
||||
public:
|
||||
Mat2BmpBw(const cv::Mat& mat,float res) {
|
||||
//cv::imwrite("bw.bmp", mat);
|
||||
m_data = std::shared_ptr<std::vector<unsigned char>>(new std::vector<unsigned char >());
|
||||
int headsize = 62;
|
||||
int width = mat.cols;
|
||||
int height = mat.rows;
|
||||
int bmpdatasize = (width + 31) / 32 * 4*height;
|
||||
m_data.resize(headsize + bmpdatasize);
|
||||
unsigned char* binary = m_data.data()+62;//file header(14)+info header(40)+RGBQUAD(8)
|
||||
m_data->resize(headsize + bmpdatasize);
|
||||
unsigned char* binary = m_data->data()+62;//file header(14)+info header(40)+RGBQUAD(8)
|
||||
setBmpFileHeader(mat,bmpdatasize);
|
||||
setBmpInfoHeader(mat, bmpdatasize, res);
|
||||
memcpy(m_data.data(), &m_fileHeader, sizeof(BITMAPFILEHEADER));
|
||||
memcpy(m_data.data() + sizeof(BITMAPFILEHEADER), &m_infoHeader, sizeof(BITMAPINFOHEADER));
|
||||
RGBQUAD* quad = (RGBQUAD*)(m_data.data() + sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));
|
||||
memcpy(m_data->data(), &m_fileHeader, sizeof(BITMAPFILEHEADER));
|
||||
memcpy(m_data->data() + sizeof(BITMAPFILEHEADER), &m_infoHeader, sizeof(BITMAPINFOHEADER));
|
||||
RGBQUAD* quad = (RGBQUAD*)(m_data->data() + sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));
|
||||
quad->rgbBlue = quad->rgbGreen = quad->rgbRed = quad->rgbReserved = 0;
|
||||
quad++;
|
||||
quad->rgbBlue = quad->rgbGreen = quad->rgbRed = 255;
|
||||
|
@ -93,8 +119,7 @@ private:
|
|||
m_infoHeader.biCompression = 0;
|
||||
m_infoHeader.biSizeImage = bmpDataLen;
|
||||
m_infoHeader.biXPelsPerMeter = m_infoHeader.biYPelsPerMeter = static_cast<LONG>(res * 39.37F + 0.5);
|
||||
m_infoHeader.biClrUsed = 2;
|
||||
m_infoHeader.biClrImportant = 2;
|
||||
m_infoHeader.biClrUsed = m_infoHeader.biClrImportant = 2;
|
||||
}
|
||||
|
||||
private:
|
||||
|
@ -129,7 +154,7 @@ public:
|
|||
virtual ~ImageMatQueue(void);
|
||||
|
||||
void pushMat(std::shared_ptr<IDecode> buf);
|
||||
std::vector<unsigned char> popBmpdata();
|
||||
std::shared_ptr<std::vector<unsigned char>> popBmpdata();
|
||||
bool empty();
|
||||
bool valid();
|
||||
void clear();
|
||||
|
@ -137,16 +162,14 @@ public:
|
|||
void run();
|
||||
int orginimgcount();
|
||||
void setscanflags(const bool flags) { is_scanning = flags; }
|
||||
|
||||
float getdpi();
|
||||
void updatefixratio(float& hratio, float& vratio);
|
||||
private:
|
||||
void proc();
|
||||
void GetFixRatio(double& fixX, double& fixY);
|
||||
void EnqueueBmpBuffer(std::vector<unsigned char>& bmpdata);
|
||||
void EnqueueBmpBuffer(std::shared_ptr<std::vector<unsigned char>>);
|
||||
void PaniusCount();
|
||||
BlockingQueue<std::vector<unsigned char>> m_imagedata;
|
||||
std::mutex m_Locker;
|
||||
std::mutex m_mtxJB;
|
||||
std::mutex m_mtxscan;
|
||||
BlockingQueue<std::shared_ptr<std::vector<unsigned char>>>m_imagedata;
|
||||
std::unique_ptr<thread> m_threadProc;
|
||||
volatile bool bRun;
|
||||
volatile int atm_orgin_image_remains;
|
||||
|
@ -155,5 +178,5 @@ private:
|
|||
Device::PaperSize papersize;
|
||||
std::vector<std::shared_ptr<CImageApply>> m_iaList;
|
||||
BlockingQueue<std::shared_ptr<IDecode>> m_rawBuffs;
|
||||
double fx, fy;
|
||||
float fx, fy;
|
||||
};
|
Loading…
Reference in New Issue