XDL ImageView 활용 세 번째

NXImageView를 이용하여 Original Image와 필터링된 결과를 중첩시켜 Swap하는 기능을 구현합니다.

들어가기 전에

본 튜터리얼을 공부하기 전에 먼저 "XDL ImageView 활용 첫 번째”를 먼저 선행하시기 바랍니다.

1 예제 프로그램 만들기
1.1 "XDL_ImageView3" 이름으로 “Windows Forms 앱(.NET Framework)” 프로젝트를 생성한다.

자세한 설명은 "영상도시 툴 만들기 1"의 1. 예제 프로그램 만들기를 참고하기 바란다.


1.2 [도구상자]의 [항목선택]에 NXImage의 컨트롤을 추가한다.

영상도시 툴 만들기 1의 1.4 [도구상자]의 [항목선택] 부분을 참고하기 바란다.


1.3 “NXDL.dll”, “NXDLcc.dll”, “NXDLgr.dll”, “NXDLio.dll”, “NXDLrs.dll, “NXImage.dll” 파일을 참조 추가한다.

자세한 설명은 "영상도시 툴 만들기 1"의 1.5 참조추가 이후를 참고하기 바란다.

2 메뉴 생성하기
2.1 MenuStrip을 From1에 추가하고 메뉴로 [File]-[Open]을 입력한다.

3 NXImageView 컨트롤 올리기
3.1 Form1에 NXImageView 컨트롤를 추가하고 [부모컨테이너에서 도킹]을 한다.

3.2 NXImageLayerCompLink를 드래그하여 NXImageView 컨트롤 위에 올려 놓는다.

3.3 [F5] 키를 눌러 프로그램을 실행한다. 아래와 같이 NXImageView 컨트롤이 있는 프로그램이 실행된다.
4 영상 열기
4.1 디자인창에서 메뉴의 [File]-[Open]을 더블 클릭하여 함수를 자동 생성한다.

C#

                                    
private void OpenToolStripMenuItem_Click(object sender, EventArgs e)
{
}
                                    
                            

4.2 LinkView 구현시 필요한 XRSLoadFile과 XRasterIO 객체를 선언한다.

C#

                                        
public XRasterIO m_RasterIO;            //영상의 입출력을 담당할 객체 선언
XRSLoadFile xrsFileInput1 = null;       // 영상 디스플레이용 파일 객체 선언
XRSLoadFile xrsFileInput2 = null;       // 영상 처리용 파일 객체 생성
                                        
                                

4.3 Form1 생성자에서 XRasterIO의 객체 생성 및 NXImageLayerCompLink에 대한 속성을 변경한다.

C#

                                        
public Form1()
{
    InitializeComponent();

    String StrError;
    m_RasterIO = new XRasterIO();   // 객체 생성
    if (m_RasterIO.Initialize(out StrError) == false) // 영상 입출력 객체 초기화
    {
        MessageBox.Show(StrError);
    }

    nxImageLayerCompLink1.LayerVisible = true; // 영상레이어를 보이도록 속성을 변경
    nxImageLayerCompLink1.LayoutMode = NXImageLayerCompLink.eLayoutMode.Horizontal;
    nxImageLayerCompLink1.FrontAlpha = 1.0F;
}
                                    
                                

4.4 File 열기 버튼을 눌렀을 때 생성될 Open 대화상자와 선택된 파일에 대한 XRSLoadFile 객체를 생성한다.

C#

                                    
private void OpenToolStripMenuItem_Click(object sender, EventArgs e)
{
    // 1. 파일 Open을 수행한다.
    OpenFileDialog openFileDialog = new OpenFileDialog();
    openFileDialog.Filter = "XDM file(*.xdm)|*.XDM||";
    openFileDialog.RestoreDirectory = true;

    if (openFileDialog.ShowDialog() != DialogResult.OK) return;
    string strFilePath = openFileDialog.FileName;

    // 2. FileDriverManger를 통해 XRSLoadFile을 생성한다.
    string strError;
    xrsFileInput1 = m_RasterIO.LoadFile(strFilePath, out strError, false, eIOCreateXLDMode.All_NoMsg);
    xrsFileInput2 = m_RasterIO.LoadFile(strFilePath, out strError, false, eIOCreateXLDMode.All_NoMsg);
    if (xrsFileInput1 == null || xrsFileInput2 == null) return;

    // 3. 기존에 생성되어 있는 Composite가 있다면 Lock을 걸어 도시 수행을 잠시 멈춘다. 
    nxImageLayerCompLink1.Lock();

    // 4. nxImageLayerCompLink1개체에 있는 XDMCompManager들을 꺼낸다.
    // XDMCompManager가 실제로 Composite들의 관리를 수행한다. 
    XDMCompManager xdmCompManager1 = nxImageLayerCompLink1.GetXDLCompManager1();
    XDMCompManager xdmCompManager2 = nxImageLayerCompLink1.GetXDLCompManager2();

    // 5. 기존에 Composite가 있다면 모두 삭제한다.
    for (int i = 0; i < xdmCompManager1.NumComp; i++)
    {
        XDMComposite comp = xdmCompManager1.GetXDMCompositeAt(i);
        comp.Dispose();
    }
    xdmCompManager1.RemoveXDMCompositeAll();

    for (int i = 0; i < xdmCompManager2.NumComp; i++)
    {
        XDMComposite comp = xdmCompManager2.GetXDMCompositeAt(i);
        comp.Dispose();
    }
    xdmCompManager2.RemoveXDMCompositeAll();

    // 6. 다시 Original Image에 대한 Composite와 Processed Image에 대한 Composite를 생성하여 뷰 컨트롤에 도시한다.
    GenOriginalImageComposite();
    GenProcessedImageComposite();
    // 7. 전체 화면 보기를 설정한다.
    nxImageLayerCompLink1.ZoomFit();
    // 8. 화면 업데이트를 수행한다. 
    nxImageLayerCompLink1.Invalidate();
    // 9. Lock을 다시 풀어 준다. 
    nxImageLayerCompLink1.UnLock();
}
                                    
                                

C#

                                    
void GenOriginalImageComposite()
{
    // XDMComposite를 생성한다. .
    XDMComposite newComp = new XDMComposite();
    // 로딩된 파일로부터 밴드의 개수가 칼라로 그릴 것인지 흑백으로 그릴 것인지를 판단한다.
    // 만약 3개 미만인 경우는 Gray모드로 그리고, 3개 이상인 경우는 칼라로 그린다.
    int nNumBand = xrsFileInput1.NumBand;
    if (nNumBand < 3)   // 3개 미만의 밴드를 가지고 있는 경우
    {
        // Default로 0번째 밴드를 Gray모드로 그린다. 
        XDMBand band = xrsFileInput1.GetBandAt(0);
        // Gray Mode로 그리는 것을 설정
        newComp.Mode = eCompMode.Gray;
        // Composite의 0번에 Band설정, Gray모드에서는 0번 밴드만을 인식한다. 
        newComp.SetBand(ref band, 0);
        // 영상 Enhancement를 위해 Histogram의 범위 설정(정규분포 95% 영역)
        newComp.SetCutType(eCompCutType.Ct95, 0);
        // 영상 Enhancement를 위해 Histogram적용시 전체 영역에 대한 
        // Histogram(Band)설정, Visible은 현재 영역
        newComp.SetStretchCoverage(eCompStretchCoverage.Band, 0);
        // 영상 Enhancement를 위해 Histogram의 Stretch형태 설정(Gaussian으로 설정)
        newComp.SetStretchType(eCompStretchType.Gaussian, 0);
    }
    else // 3개 이상의 밴드를 가지고 있는 경우 
    {
        XDMBand band1 = xrsFileInput1.GetBandAt(0);
        XDMBand band2 = xrsFileInput1.GetBandAt(1);
        XDMBand band3 = xrsFileInput1.GetBandAt(2);
        newComp.Name = xrsFileInput1.FileName; // 파일 이름을 Composite이름으로 설정

        newComp.Mode = eCompMode.RGB;  // RGB Mode로 그리는것을 설정
        newComp.SetBand(ref band3, 0); // Composite의 0번에 Band설정, Blue Channel설정 
        newComp.SetBand(ref band2, 1); // Composite의 1번에 Band설정, Green Channel설정
        newComp.SetBand(ref band1, 2); // Composite의 2번에 Band설정, Red Channel설정
        for (int i = 0; i < 3; i++)
        {
            // 영상 Enhancement를 위해 Histogram의 범위 설정(정규분포 95% 영역)
            newComp.SetCutType(eCompCutType.Ct95, i);
            // 영상 Enhancement를 위해 Histogram적용시 전체 영역에 대한 
            // Histogram(Band)설정, Visible은 현재 영역
            newComp.SetStretchCoverage(eCompStretchCoverage.Band, i);
            // 영상 Enhancement를 위해 Histogram의 Stretch형태 설정(Gaussian으로 설정)
            newComp.SetStretchType(eCompStretchType.Gaussian, i);
        }
    }
    // Composite를 저장하기 위하여 첫번째 XDMCompManager를 꺼낸다.
    XDMCompManager xdmCompManager = nxImageLayerCompLink1.GetXDLCompManager1();

    // 생성된 Composite를 XDMCompManger객체에 추가한다.        
    xdmCompManager.AddXDMComposite(ref newComp);
}
                                    
                                

C#

                                    
void GenProcessedImageComposite()
{
    if (xrsFileInput2 == null) return;

    XBandParamSpatialFilter param = new XBandParamSpatialFilter();
    param.SrcBand = xrsFileInput2.GetBandAt(0); // 영상처리를 위한 Source Band 설정
    param.FilterMethod = eSpatialFilterMethod.Average;      // 필터 설정
    param.KernelSize = 3;                    // Filter의 커널 사이즈 설정

    // XDMBandSpatialFiter 밴드를 생성하고 입력 변수를 설정
    XDMBandSpatialFilter bandSF = new XDMBandSpatialFilter();
    bandSF.SetInputParam(ref param);

    // XDMComposite를 생성한다. .
    XDMComposite newComp = new XDMComposite();

    // Spatial Filter 밴드를 Gray모드로 그린다. 
    XDMBand band = bandSF;

    // 밴드 이름을 그대로 Composite이름으로 설정
    newComp.Name = band.BandName;

    // Gray Mode로 그리는것을 설정
    newComp.Mode = eCompMode.Gray;

    // Composite의 0번에 Band설정, Gray모드에서는 0번 밴드만을 인식한다. 
    newComp.SetBand(ref band, 0);
    // 영상 Enhancement를 위해 Histogram의 범위 설정(정규분포 95% 영역)
    newComp.SetCutType(eCompCutType.Ct95, 0);
    // 영상 Enhancement를 위해 실시간 영상처리는 반드시 Visible로 설정
    newComp.SetStretchCoverage(eCompStretchCoverage.Visible, 0);
    // 영상 Enhancement를 위해 Histogram의 Stretch형태 설정(Gaussian으로 설정)
    newComp.SetStretchType(eCompStretchType.Gaussian, 0);

    // 생성된 Composite를 XDMCompManger객체에 추가한다. 
    XDMCompManager xdmCompManager = nxImageLayerCompLink1.GetXDLCompManager2();
    xdmCompManager.AddXDMComposite(ref newComp);
}
                                    
                                

4.5 [F5]키를 눌러 프로그램을 실행한다. [File]-[Open] 버튼을 눌러 "영상도시 툴 만들기 1" 샘플데이터 중 “etm.xdm”을 선택한다. 왼쪽 마우스 버튼을 누른 상태로 좌우로 움직이면서 영상을 확인한다.
1 예제 프로그램 만들기
1.1 "XDL_ImageView3" 이름으로 “WPF 앱(.NET Framework)” 프로젝트를 생성한다.

자세한 설명은 "영상도시 툴 만들기 1"의 1. 예제 프로그램 만들기를 참고하기 바란다.


1.2 프로젝트에 “NXDL.dll”, “NXDLio.dll”, “NXDLrs.dll”, “NXImage.dll” 파일을 참조추가한다.

자세한 설명은 "영상도시 툴 만들기 1"의 1.5 참조추가 이후를 참고하기 바란다.


1.3 ImageView 컨트롤을 활용하기 위해 MainWindow.xaml 창에서 namespace를 다음과 같이 추가한다.

자세한 설명은 "영상도시 툴 만들기 1"의 1.7 항목을 참고하기 바란다.

2 메뉴 생성하기
2.1 MainWindow.xaml창에서 기본으로 생성된 Grid 레이아웃에 Grid.RowDefinition을 이용하여 두 개의 Row을 생성한다. [도구 상자]에서 Menu를 드래그하여 첫 번째 Cell에 배치하고 MenuItem 항목을 추가한다. 표를 참고하여 [File]-[Open]을 입력하여 생성한다.

메뉴 생성에 대한 자세한 설명은 영상도시 툴 만들기 1을 참고한다.

Control type Header Name
MenuItem _File
MenuItem _Open openFileMenuItem

최종적으로 다음과 같은 XAML 코드를 생성한다.


XAML

                                    
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="30"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <Menu Grid.Row="0">
        <MenuItem Header="_File" Margin="5,5,0,0">
            <MenuItem x:Name="openFileMenuItem" Header="_Open"/>
        </MenuItem>
    </Menu>
</Grid>
                                    
                                
3 NXImageView 컨트롤 추가하기
3.1 XAML의 Grid 레이아웃 내부에서 두 번째 Cell에 Grid를 배치하고 [도구 상자]에서 WindowsFormsHost 컨트롤을 드래그하여 생성하거나, XAML 창의 Grid 레이아웃에 WindowsFormsHost를 입력하여 생성한다.

이는 Window forms를 Hosting 해주는 개체이며 Window Forms Control을 사용할 때 이용된다. (WindowsFormsIntegration과 System.Window.Forms을 어셈블리에 대한 참조 추가를 한다.)
자세한 내용은 XDL_ImageView1의 3.2 부분을 참고하기 바란다.


3.2 Grid 레이아웃에 WindowFormsHost를 입력하고 앞서 추가한 namespace인 nxImage를 이용하여 NXImageView컨트롤을 불러온다. 이 NXImageView의 이름은 nxImageView1으로 한다.

XAML

                                    
<Grid Grid.Row="1">
       <WindowsFormsHost  Margin="3,0,3,3">
           <nxImage:NXImageView x:Name="nxImageView1">

           </nxImage:NXImageView>
       </WindowsFormsHost>
</Grid>
                                    
                                

3.3 NXImageLayerCompLink를 추가하여 NXImageView 컨트롤 위에 올려 놓는다.

NXImageLayerCompLink는 하나의 뷰에서 2개의 Composite를 동시에 비교하여 도시할 수 있도록 하는 컨트롤이다.

XAML

                                    
<Grid Grid.Row="1">
       <WindowsFormsHost  Margin="3,0,3,3">
           <nxImage:NXImageView x:Name="nxImageView1">
               <nxImage:NXImageView.Controls>
                  <nxImage:NXImageLayerCompLink x:Name="nxImageLayerCompLink1"/>
               </nxImage:NXImageView.Controls>
           </nxImage:NXImageView>
       </WindowsFormsHost>
</Grid>
                                    
                                

3.4 [F5] 키를 눌러 프로그램을 실행한다.
4 영상 열기
4.1 [File]-[Open] 에 대한 함수를 생성한다. [속성] 창(Property Window) 을 사용하여 자동 생성하거나, 또는 XAML 에서 직접 Click 이벤트를 추가하여 함수를 생성한다.

XAML 디자이너에서 openFileMenuItem을 클릭한다. [속성] 창에서 [이벤트] 탭을 선택한 후, Click 이벤트란을 더블 클릭하면 코드 비하인드에 자동으로 함수가 생성된다.


C#

                                    
private void openFileButton_Click(object sender, RoutedEventArgs e)
{

}
                                    
                        	    

4.2 LinkView 구현시 필요한 XRSLoadFile과 XRasterIO객체를 선언한다.

C#

                                    
public XRasterIO m_RasterIO;        //영상의 입출력을 담당할 객체 선언
XRSLoadFile xrsFileInput1 = null;   // 영상 디스플레이용 파일 객체 선언
XRSLoadFile xrsFileInput2 = null;// 영상 처리용 파일 객체 생성
                                        
                        	        

4.3 Window 생성자에서 XRasterIO의 객체 생성 및 NXImageLayerCompLink에 대한 속성을 변경한다.

C#

                                    
public MainWindow()
{
    InitializeComponent();

    String StrError;
    m_RasterIO = new XRasterIO();  // 객체 생성
    if (m_RasterIO.Initialize(out StrError) == false)  // 영상 입출력 객체 초기화
    {
        MessageBox.Show(StrError);
    }

    nxImageLayerCompLink1.LayerVisible = true;  // 영상레이어를 보이도록 속성을 변경
    nxImageLayerCompLink1.LayoutMode = NXImageLayerCompLink.eLayoutMode.Horizontal;
    nxImageLayerCompLink1.FrontAlpha = 1.0F;
}
                                        
                        	    

4.4 [File]–[Open] 버튼을 눌렀을 때 생성될 Open 대화상자와 선택된 파일에 대한 XRSLoadFile객체를 생성한다.

C#

                                
private void openFileMenuItem_Click(object sender, RoutedEventArgs e)
{
    // 1. 파일 Open을 수행한다.
    OpenFileDialog openFileDialog = new OpenFileDialog();
    openFileDialog.Filter = "XDM file(*.xdm)|*.XDM||";
    openFileDialog.RestoreDirectory = true;

    Nullable <bool> result = openFileDialog.ShowDialog();
    if (result != true) return;
    string strFilePath = openFileDialog.FileName;

    // 2. FileDriverManger를 통해 XRSLoadFile을 생성한다.
    string strError;
    xrsFileInput1 = m_RasterIO.LoadFile(strFilePath, out strError, false, eIOCreateXLDMode.All_NoMsg);
    xrsFileInput2 = m_RasterIO.LoadFile(strFilePath, out strError, false, eIOCreateXLDMode.All_NoMsg);
    if (xrsFileInput1 == null || xrsFileInput2 == null) return;

    // 3. 기존에 생성되어 있는 Composite가 있으면 Lock을 걸어 도시 수행을 잠시 멈춘다.
    NxImageLayerCompLink1.Lock();

    // 4. nxImageLayerCompLink1 개체에 있는 XDMCompManger들을 꺼낸다. 
    // XDMCompManager가 실제로 Composite들의 관리를 수행한다.
    XDMCompManager xdmCompManager1 = nxImageLayerCompLink1.GetXDLCompManager1();
    XDMCompManager xdmCompManager2 = nxImageLayerCompLink1.GetXDLCompManager2();

    // 5. 기존에 Composite가 있다면 모두 삭제한다.
    for (int i = 0; i < xdmCompManager1.NumComp; i++)
    {
        XDMComposite comp = xdmCompManager1.GetXDMCompositeAt(i);
        comp.Dispose();
    }
    xdmCompManager1.RemoveXDMCompositeAll();

    for (int i = 0; i < xdmCompManager2.NumComp; i++ )
    {
        XDMComposite comp = xdmCompManager2.GetXDMCompositeAt(i);
        comp.Dispose();
    }
    xdmCompManager2.RemoveXDMCompositeAll();

    // 6. 다시 Original Image에 대한 Composite와 Processed Image에 대한
    // Composite를 생성하여 뷰컨트롤에 도시한다.
    GenOriginalImageComposite();
    GenProcessedImageComposite();
    // 7. 전체 화면 보기를 설정한다.
    nxImageLayerCompLink1.ZoomFit();
    // 8. 화면 업데이트를 수행한다.
    nxImageLayerCompLink1.Invalidate();
    // 9. Lock을 다시 풀어 준다.
    nxImageLayerCompLink1.UnLock();
}

                                    
                        	    

이어서 아래의 코드를 추가한다.

C#

                                    
void GenOriginalImageComposite()
{
    // XDMComposite를 생성한다. .
    XDMComposite newComp = new XDMComposite();
    // 로딩된 파일로부터 밴드의 개수가 칼라로 그릴 것인지 흑백으로 그릴 것인지를 판단한다.
    // 만약 3개 미만인 경우는 Gray모드로 그리고, 3개 이상인 경우는 칼라로 그린다.
    int nNumBand = xrsFileInput1.NumBand;
    if (nNumBand < 3)   // 3개 미만의 밴드를 가지고 있는 경우
    {
        // Default로 0번째 밴드를 Gray모드로 그린다. 
        XDMBand band = xrsFileInput1.GetBandAt(0);
        // Gray Mode로 그리는 것을 설정
        newComp.Mode = eCompMode.Gray;
        // Composite의 0번에 Band설정, Gray모드에서는 0번 밴드만을 인식한다. 
        newComp.SetBand(ref band, 0);
        // 영상 Enhancement를 위해 Histogram의 범위 설정(정규분포 95% 영역)
        newComp.SetCutType(eCompCutType.Ct95, 0);
        // 영상 Enhancement를 위해 Histogram적용시 전체 영역에 대한 
        // Histogram(Band)설정, Visible은 현재 영역
        newComp.SetStretchCoverage(eCompStretchCoverage.Band, 0);
        // 영상 Enhancement를 위해 Histogram의 Stretch형태 설정(Gaussian으로 설정)
        newComp.SetStretchType(eCompStretchType.Gaussian, 0);
    }
    else // 3개 이상의 밴드를 가지고 있는 경우 
    {
        XDMBand band1 = xrsFileInput1.GetBandAt(0);
        XDMBand band2 = xrsFileInput1.GetBandAt(1);
        XDMBand band3 = xrsFileInput1.GetBandAt(2);
        // 파일 이름을 Composite이름으로 설정
        newComp.Name = xrsFileInput1.FileName; 

        newComp.Mode = eCompMode.RGB;  // RGB Mode로 그리는것을 설정
        newComp.SetBand(ref band3, 0); // Composite의 0번에 Band설정, Blue Channel설정 
        newComp.SetBand(ref band2, 1); // Composite의 1번에 Band설정, Green Channel설정
        newComp.SetBand(ref band1, 2); // Composite의 2번에 Band설정, Red Channel설정
        for (int i = 0; i < 3; i++)
        {
            // 영상 Enhancement를 위해 Histogram의 범위 설정(정규분포 95% 영역)
            newComp.SetCutType(eCompCutType.Ct95, i);
            // 영상 Enhancement를 위해 Histogram적용시 전체 영역에 대한 
            // Histogram(Band)설정, Visible은 현재 영역
            newComp.SetStretchCoverage(eCompStretchCoverage.Band, i);
            // 영상 Enhancement를 위해 Histogram의 Stretch형태 설정(Gaussian으로 설정)
            newComp.SetStretchType(eCompStretchType.Gaussian, i);
        }
     }
    // Composite를 저장하기 위하여 첫번째 XDMCompManager를 꺼낸다.
    XDMCompManager xdmCompManager = nxImageLayerCompLink1.GetXDLCompManager1();

    // 생성된 Composite를 XDMCompManger객체에 추가한다.        
    xdmCompManager.AddXDMComposite(ref newComp);
}
                                    
                        	    

C#

                                    
void GenProcessedImageComposite()
{
    if (xrsFileInput2 == null) return;

    XBandParamSpatialFilter param = new XBandParamSpatialFilter();
    param.SrcBand = xrsFileInput2.GetBandAt(0); // 영상처리를 위한 Source Band 설정
    param.FilterMethod = eSpatialFilterMethod.Average;  // 필터 설정
    param.KernelSize = 3;                    // Filter의 커널 사이즈 설정

    // XDMBandSpatialFiter 밴드를 생성하고 입력 변수를 설정
    XDMBandSpatialFilter bandSF = new XDMBandSpatialFilter();
    bandSF.SetInputParam(ref param);

    // XDMComposite를 생성한다.
    XDMComposite newComp = new XDMComposite();

    // Spatial Filter 밴드를 Gray모드로 그린다. 
    XDMBand band = bandSF;

    // 밴드 이름을 그대로 Composite이름으로 설정
    newComp.Name = band.BandName;

    // Gray Mode로 그리는것을 설정
    newComp.Mode = eCompMode.Gray;

    // Composite의 0번에 Band설정, Gray모드에서는 0번 밴드만을 인식한다. 
    newComp.SetBand(ref band, 0);
    // 영상 Enhancement를 위해 Histogram의 범위 설정(정규분포 95% 영역)
    newComp.SetCutType(eCompCutType.Ct95, 0);
    // 영상 Enhancement를 위해 실시간 영상처리는 반드시 Visible로 설정
    newComp.SetStretchCoverage(eCompStretchCoverage.Visible, 0);
    // 영상 Enhancement를 위해 Histogram의 Stretch형태 설정(Gaussian으로 설정)
    newComp.SetStretchType(eCompStretchType.Gaussian, 0);

    // 생성된 Composite를 XDMCompManger객체에 추가한다. 
    XDMCompManager xdmCompManager = nxImageLayerCompLink1.GetXDLCompManager2();
    xdmCompManager.AddXDMComposite(ref newComp);
}
                                    
                        	    

4.5 [F5]키를 눌러 프로그램을 실행한다. [File]-[Open]버튼을 눌러 "영상도시 툴 만들기 1" 샘플데이터 중 “etm.xdm”을 선택한다. 왼쪽 마우스 버튼을 누른 상태로 좌우로 움직이면서 영상을 확인한다.