Visual Basic (Declaration) | |
---|---|
Public ReadOnly Property Format As Object |
C# | |
---|---|
public object Format {get;} |
Property Value
An object representing the format buffer.Visual Basic | Copy Code |
---|---|
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 17\Media" End Class |
C# | Copy Code |
---|---|
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 17\Media"; } |
This property allows direct access to the format buffer for in-process servers. However, if the interface is marshaled across process boundaries, then the client will only be accessing a copy of the data. In such a case, the client should call SetFormatData to alter the contents of the format buffer. The array cannot be resized. To resize the format buffer, set the FormatSize property and then access the MediaType.Format property again.
Target Platforms: Microsoft .NET Framework 2.0, Windows 2000, Windows XP, Windows Server 2003 family, Windows Server 2008 family, Windows Vista, Windows 7