怎麼為電影抓圖?辦法似乎很多,我曉得的有用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類的映像。
新聞速報
2017年2月17日 星期五
DirectSHOW 播放中 抓圖
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言