unsafe public static ColorImage FrameToColorImage(Frame frame) { OniFrame *frameHandle = (OniFrame *)frame.Handle; int width = (*frameHandle).width; int height = (*frameHandle).height; int bytePerPixel = oniFormatBytesPerPixel((*frameHandle).videoMode.pixelFormat); Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb); Rectangle imageRect = new Rectangle(0, 0, width, height); BitmapData bmpData = bitmap.LockBits(imageRect, ImageLockMode.WriteOnly, bitmap.PixelFormat); byte *source = (byte *)(*frameHandle).data; byte *target = (byte *)(void *)bmpData.Scan0; for (int y = 0; y < height; y++) { byte *sourceLine = source + y * width * 3; for (int x = 0; x < width; x++) { target[2] = *sourceLine++; target[1] = *sourceLine++; target[0] = *sourceLine++; target += 3; } } bitmap.UnlockBits(bmpData); ColorImage image = new ColorImage(bitmap); return(image); }
unsafe public static Frame ReadFrame(Stream stream) { OniFrame *frameHandle = (OniFrame *)IntPtr.Zero; OniStatus status = oniStreamReadFrame(stream.Handle, &frameHandle); HandleError(status); return(new Frame((IntPtr)frameHandle)); }
unsafe public static FloatImage FrameToFloatImage(Frame frame) { OniFrame * frameHandle = (OniFrame *)frame.Handle; int width = (*frameHandle).width; int height = (*frameHandle).height; FloatImage img = new FloatImage(width, height); short *source = (short *)(*frameHandle).data; for (int y = 0; y < height; y++) { short *sourceLine = source + y * width; for (int x = 0; x < width; x++) { img[y, x] = (float)(*sourceLine++); } } return(img); }
private unsafe extern static void oniFrameRelease(OniFrame *pFrame);
private unsafe extern static void oniFrameAddRef(OniFrame *pFrame);
internal SensorFrame(OniFrame *pFrame) { _pFrame = pFrame; Data = new FrameData((byte *)_pFrame->data, _pFrame->dataSize); }