#pragma once
|
|
#include <vector>
|
#include "CHImageControls/CHImageData.h"
|
#include "CHThreadPools/WorkThreadPools.h"
|
|
enum MergeRoationType { MergeRotationType_None=0, MergeRotationType_Left, MergeRotationType_Right, MergeRotationType_Count };
|
enum MergeFlipType { MergeFlipType_None=0, MergeFlipType_Vertical, MergeFlipType_Horizontal, MergeFlipType_Count };
|
|
class CMergeThreadData : public CWorkThreadData
|
{
|
public:
|
CMergeThreadData(PVOID pPtr) : CWorkThreadData(pPtr)
|
{
|
m_strImageFile = _T("");
|
m_nCameraIndex = -1;
|
m_nScanIndex = -1;
|
m_nRotationType = MergeRotationType_None;
|
m_nFlipType = MergeFlipType_None;
|
|
m_nSourcePosX = 0;
|
m_nSourceWidth = 0;
|
m_nSourcePosY = 0;
|
m_nSourceHeight = 0;
|
|
m_nTargetPosX = 0;
|
m_nTargetPosY = 0;
|
}
|
|
virtual ~CMergeThreadData()
|
{
|
}
|
|
public:
|
CString m_strImageFile;
|
int m_nCameraIndex;
|
int m_nScanIndex;
|
int m_nRotationType;
|
int m_nFlipType;
|
|
int m_nSourcePosX;
|
int m_nSourceWidth;
|
int m_nSourcePosY;
|
int m_nSourceHeight;
|
|
int m_nTargetPosX;
|
int m_nTargetWidth;
|
int m_nTargetPosY;
|
int m_nTargetHeight;
|
};
|
typedef std::vector<CMergeThreadData*> VectorMergeThreadData;
|
typedef std::vector<CMergeThreadData*>::iterator VectorMergeThreadDataIt;
|
typedef std::vector<CMergeThreadData*>::const_iterator constVectorMergeThreadDataIt;
|
|
interface IImageMerger2Parent
|
{
|
virtual int IIM2P_GetCameraWidthPixel(int nCameraType) = 0;
|
virtual int IIM2P_GetGlassHeightPixel(int nCameraType) = 0;
|
virtual BOOL IIM2P_GetCameraMarginPixel(int nCameraType, int nCameraIndex, int nScanIndex, int &nMarginLeft, int& nMarginRight) = 0;
|
virtual BOOL IIM2P_GetGlassStartPixel(int nCameraType, int nCameraIndex, int nScanIndex, int &nGlassStart) = 0;
|
virtual void IIM2P_SetMergeComplete(int nCameraType, int nMergeCount) = 0;
|
};
|
|
class AFX_EXT_CLASS CImageMerger : public CWorkThreadPools
|
{
|
public:
|
CImageMerger(int nThreadCount=1, IImageMerger2Parent* pIIM2P=NULL);
|
virtual ~CImageMerger(void);
|
void SetIIM2P(IImageMerger2Parent* pIIM2P);
|
int SetMergeData( int nCameraType, int nCameraCount, int nScanCount, const CString& strImagePath, int nRotationType, int nMergeChannels, double dMergeScale );
|
BOOL SaveImage(const CString& strFilename, int nQuality=95);
|
|
protected:
|
virtual void WorkThreadProcess(PVOID pParameter);
|
BOOL CalculateThreadData_None(int nCameraWidth, int nGlassHeight, CMergeThreadData* pThreadData);
|
BOOL CalculateThreadData_Right(int nCameraWidth, int nGlassHeight, CMergeThreadData* pThreadData);
|
BOOL CalculateThreadData_Left(int nCameraWidth, int nGlassHeight, CMergeThreadData* pThreadData);
|
protected:
|
CString m_strImagePath;
|
int m_nCameraType;
|
int m_nCameraCount;
|
int m_nScanCount;
|
int m_nRotationType;
|
double m_dMergeScale;
|
CCHImageData m_MergeImage;
|
|
int m_nMergeImageCount;
|
int m_nMergedImageCount;
|
|
IImageMerger2Parent* m_pIIM2P;
|
CCriticalSection m_csMergeImage;
|
};
|