当前位置:编程学习 > C#/ASP.NET >>

C# winform Directshow抓图实现

如题:求高手解决,抓图代码,谢谢 --------------------编程问答-------------------- DirectShow开发指南 --------------------编程问答-------------------- 怎么为电影抓图?办法似乎很多,我晓得的有用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类的映像。
--------------------编程问答-------------------- Video Render抓图(Null Render、VMR7/9抓图、Sample Grabber抓图)。哪种好点?? --------------------编程问答-------------------- Directshow.NET,有示例,适合C#菜鸟
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,