XDL Manual

XDL VideoView 활용 네번째

(piXoneer XDL Tutorial)

 

 

 

 

 

 

이 문서는 XDL Development Library

 설치 및 사용하기 위한 문서입니다.

 

2017. 01.

 

 

목차

XDL VideoView 활용 세번째... 1

1    사용하기... 1

1.1    Play 시간 컨트롤 넣기... 1

1.2    TrackBar 동기화... 1

 

 

 

 

1     사용하기

본 튜터리얼을 공부하기 전에 먼저 XDL VideoView 활용 세번째를 먼저 선행하시기 바랍니다. XDL VideoView 활용 세번째에 이어서 진행합니다.

1.1    메뉴 생성하기

1.1.1      [도구상자]  MenuStrip을 선택하고 Form1의 상단부에 드래그하여 위치시킨다.

 

1.1.2      메뉴에 다음과 같이 View, Enhance, Rotate, Flip, Shift, Algor, Capture를 입력하여 생성한다.

 

1.1.3     View-ZoomIn, View-ZoomOut기능을 추가한다. ZoomIn, ZoomOut은 비디오의 뷰화면을 확대시키거나 축소시키는 기능을 담당한다.

1.1.4     Rotate 기능을 추가한다. Rotate기능은 화면의 회전을 조절하는 기능을 담당한다.

 

1.1.5     Enhance-Contrast, Enhance-Brightness, Enhance-Gamma 기능을 추가한다. Contrast, Brightness은 각각의 ContrastBrightness값을 변경시키고, GammaGamma의 인덱스를 변화시켜서 화면의 밝기를 조절하는 기능을 담당한다.

 

1.1.6     Flip-VFlip, Flip-HFlip 기능을 추가한다. Flip기능은 화면의 좌/(HFlip)나 상/(VFlip) 를 뒤집어서 도시하는 기능을 담당한다.

 

1.1.7     Shift 기능을 추가한다. Shift기능은 화면을 특정 값만큼 이동시키는 기능을 담당한다.

 

1.1.8     Algorithm 기능을 추가한다.  Algorithm기능은 도시되는 동영상에 다양한 필터기능을 적용하는 기능을 담당한다. Edge Detection, HDR, Basso, Median, Average필터를 구성한다.

 

 

1.1.9     Capture 기능을 추가한다. 현재 도시되는 Frame과 비디오의 첫번째 FrameCapture 캡쳐해서 저장하는 기능을 구현한다.

 

 

 

1.2    메뉴에 대한 기능 구현

1.2.1     View에 대한 기능을 구현한다. 비디오에 대한 화면 확대/축소에 대한 기능을 구현한다.

// ZoomIn 메뉴 아이템 클릭시 호출되는 이벤트 함수
private void zoomInToolStripMenuItem_Click(object sender, EventArgs e)
{
    XVertex2d VideoScale = nxVideoView1.Scale;

    if (VideoScale.x > 0)
    {
        if (VideoScale.x >= 2.0) return;
    }
    else
    {
        if (VideoScale.x <= -2.0) return;
    }

    if (VideoScale.y > 0)
    {
        if (VideoScale.y >= 2.0) return;
    }
    else
    {
        if (VideoScale.y <= -2.0) return;
    }

    if (VideoScale.x > 0) VideoScale.x += 0.2; else VideoScale.x -= 0.2;
    if (VideoScale.y > 0) VideoScale.y += 0.2; else VideoScale.y -= 0.2;

    nxVideoView1.Scale = VideoScale;
}

// ZoomOut 메뉴 아이템 클릭시 호출되는 이벤트 함수
private void zoomOutToolStripMenuItem_Click(object sender, EventArgs e)
{
    XVertex2d VideoScale = nxVideoView1.Scale;

    if (VideoScale.x > 0)
    {
        if (VideoScale.x < 0.5) return;
    }
    else
    {
        if (VideoScale.x > -0.5) return;
    }

    if (VideoScale.y > 0)
    {
        if (VideoScale.y < 0.5) return;
    }
    else
    {
        if (VideoScale.y > -0.5) return;
    }

    if (VideoScale.x > 0) VideoScale.x -= 0.2; else VideoScale.x += 0.2;
    if (VideoScale.y > 0) VideoScale.y -= 0.2; else VideoScale.y += 0.2;

    nxVideoView1.Scale = VideoScale;
}

 

1.2.2     Enhance에 대한 기능을 구현한다. 비디오에 대한 화면 밝기 조절에 대한 기능을 구현한다.

// 재생되고 있는 동영상의  Contrast 조절
private void contrast02ToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxVideoView1.FilterType = eVideoFilterType.CBS;
    nxVideoView1.Contrast += 0.2f;
}

// 재생되고 있는 동영상의  Contrast 조절
private void contrast02ToolStripMenuItem1_Click(object sender, EventArgs e)
{
    nxVideoView1.FilterType = eVideoFilterType.CBS;
    nxVideoView1.Contrast -= 0.2f;
}

// 재생되고 있는 동영상의  Brightness 조절
private void brightness02ToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxVideoView1.FilterType = eVideoFilterType.CBS;
    nxVideoView1.Brightness += 0.2f;
}

// 재생되고 있는 동영상의  Brightness 조절
private void brightness02ToolStripMenuItem1_Click(object sender, EventArgs e)
{
    nxVideoView1.FilterType = eVideoFilterType.CBS;
    nxVideoView1.Brightness -= 0.2f;
}

// 재생되고 있는 동영상의  Gamma 조절
private void gamma04ToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxVideoView1.FilterType = eVideoFilterType.Gamma;
    nxVideoView1.GammaFactor = 0.4f;
}

// 재생되고 있는 동영상의  Gamma 조절
private void gamma10ToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxVideoView1.FilterType = eVideoFilterType.Gamma;
    nxVideoView1.GammaFactor = 1.0f;
}
    
// 재생되고 있는 동영상의  Gamma 조절
private void gamma15ToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxVideoView1.FilterType = eVideoFilterType.Gamma;
    nxVideoView1.GammaFactor = 1.5f;
}

// 재생되고 있는 동영상의  Gamma 조절
private void gamma22ToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxVideoView1.FilterType = eVideoFilterType.Gamma;
    nxVideoView1.GammaFactor = 2.2f;
}

// 재생되고 있는 동영상의  Gamma 조절
private void gamma40ToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxVideoView1.FilterType = eVideoFilterType.Gamma;
    nxVideoView1.GammaFactor = 4.0f;
}

 

1.2.3     회전에 대한 기능을 구현한다.

// 재생되고 있는 동영상의 화면을 회전(45도)
private void rotate45ToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxVideoView1.Rotation = new XAngle(45);
}

// 재생되고 있는 동영상의 화면을 회전(-45도)
private void rotate45ToolStripMenuItem1_Click(object sender, EventArgs e)
{
    nxVideoView1.Rotation = new XAngle(-45);
}

// 재생되고 있는 동영상의 화면을 회전(0도)
private void rotate0ToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxVideoView1.Rotation = new XAngle(0);
}

 

1.2.4     Flip에 대한 기능을 구현한다.

// 동영상 화면을 수직 방향으로 Flip
private void vFlipToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxVideoView1.Scale = new XVertex2d(nxVideoView1.Scale.x, nxVideoView1.Scale.y * -1);
}

// 동영상 화면을 수평 방향으로 Flip
private void hFlipToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxVideoView1.Scale = new XVertex2d(nxVideoView1.Scale.x * -1, nxVideoView1.Scale.y);
}

 

1.2.5     비디오 영상처리 대한 기능을 구현한다.

private void edgeDetectionToolStripMenuItem_Click(object sender, EventArgs e)
{
    // Shader를 통해 Edge 필터를 설정
    nxVideoView1.FilterType = eVideoFilterType.Edge;
}

private void hDRToolStripMenuItem_Click(object sender, EventArgs e)
{
    // Shader를 통해 HDR 필터를 설정
    nxVideoView1.FilterType = eVideoFilterType.HDR;
}

private void bassoToolStripMenuItem_Click(object sender, EventArgs e)
{
    // Shader를 통해 Basso 필터를 설정
    nxVideoView1.FilterType = eVideoFilterType.Basso;
}

private void disableToolStripMenuItem_Click(object sender, EventArgs e)
{
    // 필터 설정 해제
    nxVideoView1.FilterType = eVideoFilterType.None;
}

private void medianToolStripMenuItem_Click(object sender, EventArgs e)
{
    // Shader를 통해 Median 필터를 설정
    nxVideoView1.FilterType = eVideoFilterType.Median;
}

private void averageToolStripMenuItem_Click(object sender, EventArgs e)
{
    // Shader를 통해 Average 필터를 설정
    nxVideoView1.FilterType = eVideoFilterType.Average;
}

 

 

1.2.6     비디오 화면 영역 이동 대한 기능을 구현한다.

private void shift200200ToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxVideoView1.Translation = new XVertex2d(200, 200);
}

private void shift200200ToolStripMenuItem1_Click(object sender, EventArgs e)
{
    nxVideoView1.Translation = new XVertex2d(-200, -200);
}

private void shift00ToolStripMenuItem_Click(object sender, EventArgs e)
{
    nxVideoView1.Translation = new XVertex2d(0, 0);
}

 

 

1.2.7     비디오 화면 캡쳐에 대한 기능을 구현한다.

// 도시되고 있는 현재 프레임을 저장한다. 
private void saveCurrentFrameToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (VS.video == null)
    {
        MessageBox.Show(this, "동영상을 먼저 Open 하세요.", "오류");
        return;
    }

    // 함수 콜 시점의 도시된 영상을 RGB 형식으로 담고 있는 XFramePicture 객체를 생성하여 반환
    XFramePicture frameRGB = VS.videoChannel.GetRenderedFrameRGB();

    SaveFileDialog dlg = new SaveFileDialog();
    dlg.Title = "저장 경로를 설정하세요";
    dlg.OverwritePrompt = true;
    dlg.Filter = "JPEG File(*.jpg)|*.jpg";

    if (dlg.ShowDialog() == DialogResult.OK)
    {
        string strError;
        string strFileName = dlg.FileName;

        // XFramePicture 객체의 화면 프레임을 이미지로 저장
        // 저장을 위한 파일 포맷으로는 TIFF, NITF, JPEG, BMP, JPEG2000 등 지원
        bool bres = frameRGB.SaveFrame(strFileName, "JPEG", out strError, null);

        if (!bres)
        {
            MessageBox.Show(this, "프레임 저장이 실패하였습니다.", "오류");
            return;
        }
    }
}

// 동영상 파일의 첫번째 프레임을 저장한다. 
private void saveFrameFirstFrameToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (VS.video == null)
    {
        MessageBox.Show(this, "동영상을 먼저 Open 하세요.", "오류");
        return;
    }

    SaveFileDialog dlg = new SaveFileDialog();
    dlg.Title = "저장 경로를 설정하세요";
    dlg.OverwritePrompt = true;
    dlg.Filter = "JPEG File(*.jpg)|*.jpg";

    if (dlg.ShowDialog() == DialogResult.OK)
    {
        string strError;
        string strFileName = dlg.FileName;

        // XVidoeIO 객체를 통해 가져온 동영상 스트림의 첫번째 프레임을 반환
        XFramePicture frameRGB = m_videoIO.GetFirstFrameRGB(VS.videoFilePath, "XFFMPDRIVER", out strError);

        // XFramePicture 객체의 화면 프레임을 이미지로 저장
        // 저장을 위한 파일 포맷으로는 TIFF, NITF, JPEG, BMP, JPEG2000 등 지원
        bool bres = frameRGB.SaveFrame(strFileName, "JPEG", out strError, null);

        if (!bres)
        {
            MessageBox.Show(this, "프레임 저장이 실패하였습니다.", "오류");
            return;
        }
    }
}

1.2.8     [F5]키를 눌러 프로그램을 실행후 View, Enhance, Rotate, Flip, Algor, Shift, Capture 툴바를 누르고 하부 기능을 테스트 한다.