Esempio n. 1
0
        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);
                }
            }
        }