2

私のWindowsアプリケーションでは、Windows MediaPlayerdllを使用してビデオを再生しています。

私のフォームには、現在のビデオフレームの写真を撮るためのボタンがあります。

多くのテストとコード検査を行いましたが、現在のフレームの写真を撮ることが失敗する理由を見つけることができませんでした。

このコードを試しましたが、結果の画像は黒でした。

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ユーザーが保存パスを選択すると、関数はで指定されたファイルユーザーから画像を取得するために使用しますsave file dialog。ビデオフォーマットはWMVです。

4

2 に答える 2

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);
    }
}
于 2012-10-08T10:11:17.513 に答える