public IEnumerator <ITask> QueryFrameHandler(webcam.QueryFrame req) { yield return(Arbiter.Choice(_scribblerPort.GetImage(req.Body.Format), delegate(brick.ImageResponse r) { try { var resp = new webcam.QueryFrameResponse() { Format = req.Body.Format, Size = new System.Drawing.Size(r.Width, r.Height), TimeStamp = r.Timestamp, }; if (req.Body.Format.Equals(MyroImageType.Color.Guid)) { resp.Frame = convertColorToRGB(r.Data, r.Width, r.Height); } else if (req.Body.Format.Equals(MyroImageType.Gray.Guid)) { resp.Frame = r.Data; } else if (req.Body.Format.Equals(MyroImageType.JpegColor.Guid) || req.Body.Format.Equals(MyroImageType.JpegColorFast.Guid)) { resp.Frame = r.Data; } else if (req.Body.Format.Equals(MyroImageType.JpegGray.Guid) || req.Body.Format.Equals(MyroImageType.JpegGrayFast.Guid)) { resp.Frame = r.Data; } else { throw new Exception("FlukeCam does not know how to convert this image type"); } req.ResponsePort.Post(resp); } catch (Exception e) { req.ResponsePort.Post(RSUtils.FaultOfException(e)); } }, delegate(Fault f) { req.ResponsePort.Post(f); })); }
public void QueryFrameHandler(webcam.QueryFrame queryFrame) { if (_state.Frame == null) { queryFrame.ResponsePort.Post(new webcam.QueryFrameResponse()); } else if (queryFrame.Body.Format == Guid.Empty) { // raw image requested; BitmapData raw = null; try { raw = _state.Frame.LockBits( new Rectangle(Point.Empty, new Size((int)_state.ImageSize.X, (int)_state.ImageSize.Y)), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); int size = raw.Height * raw.Stride; webcam.QueryFrameResponse response = new webcam.QueryFrameResponse(); response.TimeStamp = _state.LastFrameUpdate; response.Frame = new byte[size]; response.Size = new Size(raw.Width, raw.Height); response.Format = Guid.Empty; System.Runtime.InteropServices.Marshal.Copy(raw.Scan0, response.Frame, 0, size); queryFrame.ResponsePort.Post(response); } finally { if (raw != null) { _state.Frame.UnlockBits(raw); } } } else { ImageFormat format = new ImageFormat(queryFrame.Body.Format); using (MemoryStream stream = new MemoryStream()) { Size size = new Size((int)queryFrame.Body.Size.X, (int)queryFrame.Body.Size.Y); if (size == _state.Frame.Size || size.Width == 0 || size.Height == 0 || size.Width >= _state.Frame.Width || size.Height >= _state.Frame.Height) { size = _state.Frame.Size; _state.Frame.Save(stream, format); } else { using (Bitmap temp = new Bitmap(_state.Frame, size)) { temp.Save(stream, format); } } webcam.QueryFrameResponse response = new webcam.QueryFrameResponse(); response.TimeStamp = _state.LastFrameUpdate; response.Frame = new byte[(int)stream.Length]; response.Size = size; response.Format = format.Guid; stream.Position = 0; stream.Read(response.Frame, 0, response.Frame.Length); queryFrame.ResponsePort.Post(response); } } }