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#