如题:求高手解决,抓图代码,谢谢

解决方案 »

  1.   

    怎么为电影抓图?办法似乎很多,我晓得的有用Video Render抓图(Null Render、VMR7/9抓图、Sample Grabber抓图)。但是,这三种方式我都没有试过。
      偶然间发现:IBasicVideo.GetCurrentImage函数。按字面意思,这个东西可以用来抓图了。我找到了这个函数的vc版的使用示例,点此处查看。
      我依照它,费了老大的劲才写出了如下代码:
            /// <summary>
            /// 抓取当前的图像
            /// </summary>
            public Bitmap CurrentImage
            {
                get
                {
                    if (basicVideo == null) return null;
                    int buffersize=0;
                    IntPtr currentImage=IntPtr.Zero;
                    Bitmap bmp = null;                int hr = basicVideo.GetCurrentImage(ref buffersize, IntPtr.Zero);
                    DsError.ThrowExceptionForHR(hr);
                    currentImage=Marshal.AllocCoTaskMem(buffersize);                hr = basicVideo.GetCurrentImage(ref buffersize, currentImage);
                    BitmapInfoHeader structure = new BitmapInfoHeader();
                    Marshal.PtrToStructure(currentImage, structure);                bmp = new Bitmap(structure.Width, structure.Height, (structure.BitCount / 8) * structure.Width, System.Drawing.Imaging.PixelFormat.Format32bppArgb, currentImage);
                    bmp.RotateFlip(RotateFlipType.RotateNoneFlipY);                Marshal.FreeCoTaskMem(currentImage);
                    return bmp;
                }
            }
      这是我的播放器控件中关于取当前图像的一个属性,它在捕获图像时会自动暂停一下。我推测,它应当是调用当前Render的API实现的。只是这个过程对我们透明而己。使用方法如下:
      cp1.CurrentImage.Save("c:\\aa.jpg",System.Drawing.Imaging.ImageFormat.Jpeg);
      这段代码,我还参考了DirectShowLib的示例代码(VMR9Snap)。通过这个示例,我加深了对Marshal类的映像。
      

  2.   

    Video Render抓图(Null Render、VMR7/9抓图、Sample Grabber抓图)。哪种好点??
      

  3.   

    Directshow.NET,有示例,适合C#菜鸟