Leadtools.Multimedia Namespace > CaptureCtrl Class : CaptureFrame Method |
public virtual void CaptureFrame()
'Declaration Public Overridable Sub CaptureFrame()
'Usage Dim instance As CaptureCtrl instance.CaptureFrame()
public virtual void CaptureFrame()
function Leadtools.Multimedia.CaptureCtrl.CaptureFrame()
public: virtual void CaptureFrame();
If the method fails, an error will be raised. For more information, refer to the Error Codes.
Note: The frame data is retrieved from the underlying graph after the processing filters. If the capture needs to occur before the processing is completed use the LeadVideoCallBackFilter and place it first in the collection of processing filters.
Public _result As Boolean = False Public _form As CaptureCtrlForm = New CaptureCtrlForm() Public Sub CaptureFrameExample() ' reference the capture control Dim capturectrl As CaptureCtrl = _form.CaptureCtrl ' output file Dim outFile As String = Path.Combine(LEAD_VARS.MediaDir, "CaptureCtrl_CaptureFrameExample.bmp") Try ' set the video capture device, use your capture device name here If capturectrl.VideoDevices("Logitech") Is Nothing Then Throw New Exception("No Logitech video device available") End If capturectrl.VideoDevices("Logitech").Selected = True ' create a new sample target Dim st As SampleTarget = New SampleTarget() ' set the target media type for the video stream Dim amt As MediaType = New MediaType() amt.Type = Leadtools.Multimedia.Constants.MEDIATYPE_Video amt.SubType = Leadtools.Multimedia.Constants.MEDIASUBTYPE_RGB24 st.SetAcceptedMediaType(amt) ' assign the sample target to the capture control capturectrl.TargetObject = st capturectrl.TargetFormat = TargetFormatType.AVI ' prepare the manual frames capture capturectrl.ReadyCapture(CaptureMode.ManualFrames) ' do something before the capture starts If capturectrl.IsModeAvailable(CaptureMode.ManualFrames) Then End If ' set the capture mode to manual frames capturectrl.StartCapture(CaptureMode.ManualFrames) ' capture a frame capturectrl.CaptureFrame() ' create a media sample using the captured sample from above Dim ms As MediaSample = st.GetSample(-1) ' get the sample target's connected media type Dim mt As MediaType = st.GetConnectedMediaType() Dim bmp As Bitmap = WriteSampleBitmap(outFile, ms, mt) ' stop the capture capturectrl.StopCapture() ' check for the capture file and set the result If File.Exists(outFile) Then Dim test As Image = Bitmap.FromFile(outFile) _result = (test.Width = bmp.Width AndAlso test.Height = bmp.Height AndAlso test.PixelFormat = bmp.PixelFormat) End If Catch e1 As COMException _result = False Catch e2 As Exception _result = False End Try ' we'll loop on the state and pump messages for this example. ' but you should not need to if running from a Windows Forms application. Do While capturectrl.State = CaptureState.Running Application.DoEvents() Loop End Sub Private Function WriteSampleBitmap(ByVal outFile As String, ByVal ms As MediaSample, ByVal mt As MediaType) As Bitmap ' get the video information Dim vih As VideoInfoHeader = mt.GetVideoFormatData() ' create a bitmap to hold the sample and copy it Dim bmp As Bitmap = New Bitmap(vih.bmiHeader.biWidth, vih.bmiHeader.biHeight, FormatFromBitCount(vih.bmiHeader.biBitCount)) Dim bmpData As BitmapData = bmp.LockBits(New Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat) Marshal.Copy(ms.Buffer, 0, bmpData.Scan0, GetBitmapSize(bmp, vih.bmiHeader.biBitCount)) bmp.UnlockBits(bmpData) ' flip the upside down buffer bmp.RotateFlip(RotateFlipType.Rotate180FlipX) ' save the image bmp.Save(outFile, ImageFormat.Bmp) Return bmp End Function Private Function FormatFromBitCount(ByVal bitCount As Integer) As PixelFormat Select Case bitCount Case 8 Return PixelFormat.Format8bppIndexed Case 16 Return PixelFormat.Format16bppRgb555 Case 32 Return PixelFormat.Format32bppRgb Case 48 Return PixelFormat.Format48bppRgb Case 24 Return PixelFormat.Format24bppRgb End Select Throw New Exception("Unrecognized bit count") End Function Private Function GetBitmapSize(ByVal bmp As Bitmap, ByVal bitCount As Integer) As Integer Dim pixelSize As Integer = CInt(Math.Log(CDbl(bitCount))) Return (bmp.Width * pixelSize + pixelSize And (Not 3)) * bmp.Height End Function Private Function GetBitmapScanRowSize(ByVal bmpSize As Integer, ByVal stride As Integer, ByVal width As Integer) As Integer Return CInt(bmpSize / (stride / width)) End Function Public Sub CaptureFrame_Helper(ByVal sender As Object, ByVal e As EventArgs) ' set result _result = True End Sub Public NotInheritable Class LEAD_VARS Public Const MediaDir As String = "C:\Program Files (x86)\LEAD Technologies\LEADTOOLS 175\Media"; End Class
public bool _result = false; public CaptureCtrlForm _form = new CaptureCtrlForm(); public void CaptureFrameExample() { // reference the capture control CaptureCtrl capturectrl = _form.CaptureCtrl; // output file string outFile = Path.Combine(LEAD_VARS.MediaDir,"CaptureCtrl_CaptureFrameExample.bmp"); try { // set the video capture device, use your capture device name here if (capturectrl.VideoDevices["Logitech"] == null) throw new Exception("No Logitech video device available"); capturectrl.VideoDevices["Logitech"].Selected = true; // create a new sample target SampleTarget st = new SampleTarget(); // set the target media type for the video stream MediaType amt = new MediaType(); amt.Type = Constants.MEDIATYPE_Video; amt.SubType = Constants.MEDIASUBTYPE_RGB24; st.SetAcceptedMediaType(amt); // assign the sample target to the capture control capturectrl.TargetObject = st; capturectrl.TargetFormat = TargetFormatType.AVI; // prepare the manual frames capture capturectrl.ReadyCapture(CaptureMode.ManualFrames); // do something before the capture starts if (capturectrl.IsModeAvailable(CaptureMode.ManualFrames)) { } // set the capture mode to manual frames capturectrl.StartCapture(CaptureMode.ManualFrames); // capture a frame capturectrl.CaptureFrame(); // create a media sample using the captured sample from above MediaSample ms = st.GetSample(-1); // get the sample target's connected media type MediaType mt = st.GetConnectedMediaType(); Bitmap bmp = WriteSampleBitmap(outFile, ms, mt); // stop the capture capturectrl.StopCapture(); // check for the capture file and set the result if (File.Exists(outFile)) { Image test = Bitmap.FromFile(outFile); _result = (test.Width == bmp.Width && test.Height == bmp.Height && test.PixelFormat == bmp.PixelFormat); } } catch (COMException) { _result = false; } catch (Exception) { _result = false; } // we'll loop on the state and pump messages for this example. // but you should not need to if running from a Windows Forms application. while (capturectrl.State == CaptureState.Running) Application.DoEvents(); } private Bitmap WriteSampleBitmap(string outFile, MediaSample ms, MediaType mt) { // get the video information VideoInfoHeader vih = mt.GetVideoFormatData(); // create a bitmap to hold the sample and copy it Bitmap bmp = new Bitmap(vih.bmiHeader.biWidth, vih.bmiHeader.biHeight, FormatFromBitCount(vih.bmiHeader.biBitCount)); BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat); Marshal.Copy(ms.Buffer, 0, bmpData.Scan0, GetBitmapSize(bmp, vih.bmiHeader.biBitCount)); bmp.UnlockBits(bmpData); // flip the upside down buffer bmp.RotateFlip(RotateFlipType.Rotate180FlipX); // save the image bmp.Save(outFile, ImageFormat.Bmp); return bmp; } private PixelFormat FormatFromBitCount(int bitCount) { switch (bitCount) { case 8: return PixelFormat.Format8bppIndexed; case 16: return PixelFormat.Format16bppRgb555; case 32: return PixelFormat.Format32bppRgb; case 48: return PixelFormat.Format48bppRgb; case 24: return PixelFormat.Format24bppRgb; } throw new Exception("Unrecognized bit count"); } private int GetBitmapSize(Bitmap bmp, int bitCount) { int pixelSize = (int)Math.Log((double)bitCount); return (bmp.Width * pixelSize + pixelSize & ~3) * bmp.Height; } private int GetBitmapScanRowSize(int bmpSize, int stride, int width) { return bmpSize / (stride / width); } public void CaptureFrame_Helper(object sender, EventArgs e) { // set result _result = true; } static class LEAD_VARS { public const string MediaDir = @"C:\Program Files (x86)\LEAD Technologies\LEADTOOLS 175\Media"; }
Target Platforms: Windows 7, Windows Vista SP1 or later, Windows XP SP3, Windows Server 2008 (Server Core not supported), Windows Server 2008 R2 (Server Core supported with SP1 or later), Windows Server 2003 SP2