以图像的视频在C#中播放Windows媒体播放器媒体播放器、图像、视频、Windows

2023-09-05 04:23:15 作者:被撕裂的情書ヾ

在我的Windows应用程序,我使用Windows Media Player dll文件播放视频。

In my windows application I use Windows Media Player dlls to play a video.

在我的表单我有一个按钮,对当前视频帧的画面。

In my form I have a button to take a picture of the current video frame.

我做了很多的测试和code考试,但我无法找出原因考虑当前帧的画面出现故障。

I did a lot of tests and code examinations but I couldn't find out why taking a picture of the current frame fails.

我想这code,但由此产生的形象是黑色的:

I tried this code, but the resulting image was black:

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));
}

我用定时器,因为当用户选择保存路径,函数将图像从指定的文件用户保存文件对话框。视频格式为WMV。

I use Timer because when the user selects the save path, function takes image from the file user specified in save file dialog. Video format is WMV.

推荐答案

我接过的您code 和修改的吧。我把code拍摄照片一点点了,现在它的作品。我的创建图片的右前saveFileDialog弹出,所以你真的只得到您的知情同意中的画面,而不是saveFileDialog。

I took your code and modified it. I put the code to capture the photo a little bit up and now it works. I create the picture right before the saveFileDialog pops up, so you will really get only the picture and not the saveFileDialog within your pic.

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);
    }
}