#pragma once #include #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 VectorMergeThreadData; typedef std::vector::iterator VectorMergeThreadDataIt; typedef std::vector::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; };