/// <summary> /// /// </summary> /// <param name="imageFrame"></param> private void SensorColorFrameReadyHandler(ColorImageFrame imageFrame) { byte[] pixelData = new byte[imageFrame.PixelDataLength]; imageFrame.CopyPixelDataTo(pixelData); ColorDataPacket packet = new ColorDataPacket(pixelData, imageFrame.Width, imageFrame.Height, imageFrame.BytesPerPixel); this.ModelDelegate.OnColorDataPacketReady(packet); }
/// <summary> /// helper method which uses <see cref="System.Threading.Tasks.Task"/> in order to process <see cref="Bspline.Core.DataPacket.ColorDataPacket"/> data into a <see cref="System.Drawing.Bitmap"/> asynchronously /// </summary> /// <param name="packet">data to convert</param> /// <returns></returns> private async Task <Bitmap> RenderAsync(ColorDataPacket packet) { return(await Task.Run(() => { Bitmap bitmap = new Bitmap(packet.Width, packet.Height, SysDrawImage.PixelFormat.Format32bppRgb); BitmapData bitmapData = bitmap.LockBits( new Rectangle(0, 0, packet.Width, packet.Height), ImageLockMode.WriteOnly, bitmap.PixelFormat); IntPtr ptr = bitmapData.Scan0; Marshal.Copy(packet.PixelData, 0, ptr, packet.PixelData.Length); bitmap.UnlockBits(bitmapData); packet.Dispose(); return bitmap; })); }
/// <summary> /// Async method to handle video data packet and produce video bitmap /// </summary> /// <param name="packet"></param> internal override async void UpdateVideoStream(ColorDataPacket packet) { if (this.IsDisposed) { return; } try { Bitmap result = await this.BitmapHelper.Render(packet); this.PostToUiThread(() => { if (!this.IsDisposed && this.IsMediaStreaming) { this.VideoImageSource = this.BitmapHelper.ToBitmapSource(result); } }); } catch (TaskCanceledException) { } }
/// <summary> /// <see cref="Bspline.Core.Interfaces.IModelDelegate"/> /// </summary> /// <param name="packet">holds video information</param> public void OnColorDataPacketReady(ColorDataPacket packet) { this.ModelDelegate.OnColorDataPacketReady(packet); }
/// <summary> /// Transformes <see cref="Bspline.Core.DataPacket.ColorDataPacket"/> data into a <see cref="System.Drawing.Bitmap"/> asynchronously /// </summary> /// <param name="packet">data to transform</param> /// <returns></returns> public async Task <Bitmap> Render(ColorDataPacket packet) { return(await this.RenderAsync(packet)); }
/// <summary> /// <see cref="IModelDelegate"/> /// </summary> public void OnColorDataPacketReady(ColorDataPacket packet) { this.ModelViewCollection.ForEach(mv => mv.UpdateVideoStream(packet)); }
/// <summary> /// Update upon video stream /// </summary> /// <param name="packet">image data</param> internal virtual void UpdateVideoStream(ColorDataPacket packet) { }