C# winform Directshow抓图实现 如题:求高手解决,抓图代码,谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 怎么为电影抓图?办法似乎很多,我晓得的有用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#菜鸟 怎么区分项目大小,比较直观的区分方法有没有 求:基于MVVM设计模式的WPF浏览器应用程序Dome File.Delete问题 如何把VB6.0里的代码"Const SND_SYNC = &H0"转为C#.NET 如何用c#根據指定的內容,生成ppt文檔 帮忙看看,GirdView的奇怪问题 如何玩转DataGrid? 几个问题 局域网内部服务器共享一个程序的目录,里面有很多exe,有一个exe服务器上能打开,所有客户端点击却不行 文件冲突的问题 如何判断一个文件夹或路径是需要管理员权限才能写入的 C语言题目
偶然间发现: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类的映像。