2012-10-08 3 views
2

의 미디어 플레이어 내 Windows 응용 프로그램에서 Windows Media Player dll을 사용하여 비디오를 재생합니다.Windows에서 재생중인 비디오의 이미지 가져 오기 C#

제 양식에는 현재 비디오 프레임을 찍을 버튼이 있습니다.

많은 테스트와 코드 검사를했는데 왜 현재 프레임의 사진을 찍을 수 없는지 알 수 없었습니다.

는이 코드를 시도하지만, 결과적인 이미지는 블랙이었다 사용자가 저장 경로를 선택하는 경우, 함수 save file dialog에 지정된 파일의 사용자로부터 영상 걸리므

private Graphics g = null; 

private void btnTakePicture_Click(object sender, EventArgs e) 
{ 
    if (!string.IsNullOrEmpty(axWMVMovie.URL)) 
    { 
     axWMVMovie.Ctlcontrols.pause(); 
     if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      System.Drawing.Image ret = null; 
      try 
      { 
       Bitmap bitmap = new Bitmap(axWMVMovie.Width, axWMVMovie.Height); 
       { 
        g = Graphics.FromImage(bitmap); 
        { 
         Graphics gg = axWMVMovie.CreateGraphics(); 
         { 
          timerTakePicFromVideo.Start(); 
         } 
        } 

        using (MemoryStream ms = new MemoryStream()) 
        { 
         bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
         ret = System.Drawing.Image.FromStream(ms); 
         ret.Save(saveFileDialog1.FileName); 
        } 
       } 
      } 
      catch 
      { 
      } 
     } 
    } 
} 

private void timerTakePicFromVideo_Tick(object sender, EventArgs e) 
{ 
    timerTakePicFromVideo.Stop(); 

    g.CopyFromScreen(axWMVMovie.PointToScreen(new System.Drawing.Point()).X, 

    axWMVMovie.PointToScreen(new System.Drawing.Point()).Y, 0, 0, 

    new System.Drawing.Size(axWMVMovie.Width, axWMVMovie.Height)); 
} 

내가 Timer를 사용한다. 비디오 형식은 WMV입니다.

+1

왜 * 타이머를 사용하여 비디오 *에서 사진을 찍고 있습니까? 제 생각에는 비트 맵이 생성 된 후에 tick_event 코드가 실행될 것입니다. 'g.CopyFromScreen (..)'을'btnTakePicture_Click (..)'으로 옮겨 보았습니까? –

+0

+1. 중괄호 안의 호출 (예 : 'timerTakePicFromVideo.Start();'와 같은 아무것도하지 않는 호출)은 기괴합니다. – tomfanning

+0

@PilgerstorferFranz 저장 대화 상자가 닫히고, 이미지가 저장되고 저장된 이미지가 저장 될 때까지 사용자가 저장 위치를 ​​선택할 때 타이머를 사용합니다. –

답변

4

코드으로 수정했습니다. 나는 약간의 사진을 포착하기위한 코드를 넣었고 이제는 작동한다. 그림 그림으로 만들고 saveFileDialog가으로 나오기 때문에 그림에만 saveFileDialog가 아닌 그림 만 표시됩니다.

if (!string.IsNullOrEmpty(axWindowsMediaPlayer1.URL)) 
{ 
    axWindowsMediaPlayer1.Ctlcontrols.pause(); 

    System.Drawing.Image ret = null; 
    try 
    { 
     // take picture BEFORE saveFileDialog pops up!! 
     Bitmap bitmap = new Bitmap(axWindowsMediaPlayer1.Width, axWindowsMediaPlayer1.Height); 
     { 
      Graphics g = Graphics.FromImage(bitmap); 
      { 
       Graphics gg = axWindowsMediaPlayer1.CreateGraphics(); 
       { 
        //timerTakePicFromVideo.Start(); 
        this.BringToFront(); 
        g.CopyFromScreen(
         axWindowsMediaPlayer1.PointToScreen(
          new System.Drawing.Point()).X, 
         axWindowsMediaPlayer1.PointToScreen(
          new System.Drawing.Point()).Y, 
         0, 0, 
         new System.Drawing.Size(
          axWindowsMediaPlayer1.Width, 
          axWindowsMediaPlayer1.Height) 
         ); 
       } 
      } 
      // afterwards save bitmap file if user wants to 
      if (saveFileDialog1.ShowDialog() == DialogResult.OK) 
      { 
       using (MemoryStream ms = new MemoryStream()) 
       { 
        bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
        ret = System.Drawing.Image.FromStream(ms); 
        ret.Save(saveFileDialog1.FileName); 
       } 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     Debug.WriteLine(ex.Message); 
    } 
} 
관련 문제