SDC C-Project CF Review 프로그램
LYW
2021-07-01 4acd943c6f0beecd3ee573f77d8d6c7524fd5045
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#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;
};