unsafe void UpdateBackground(ARFrame frame)
        {
            using (var img = frame.CapturedImage)
            {
                using (var ciImage = CIImage.FromImageBuffer(img))
                {
                    using (var rotatedImage = ciImage.CreateByApplyingOrientation(ImageIO.CGImagePropertyOrientation.Right))
                    {
                        var size = new CGSize(rotatedImage.Extent.Size);

                        using (var rotatedBuff = new CVPixelBuffer((nint)size.Width,
                                                                   (nint)size.Height, img.PixelFormatType))
                        {
                            var _coreImageContext = new CIContext(null);

                            rotatedBuff.Lock(CVPixelBufferLock.None);

                            _coreImageContext.Render(rotatedImage, rotatedBuff);

                            var yPtr  = rotatedBuff.BaseAddress;
                            var uvPtr = rotatedBuff.GetBaseAddress(1);

                            if (yPtr == IntPtr.Zero || uvPtr == IntPtr.Zero)
                            {
                                return;
                            }

                            int wY  = (int)rotatedBuff.Width;
                            int hY  = (int)rotatedBuff.Height;
                            int wUv = (int)rotatedBuff.GetWidthOfPlane(1);
                            int hUv = (int)rotatedBuff.GetHeightOfPlane(1);

                            cameraYtexture.SetData(0, 0, 0, wY, hY, (void *)yPtr);
                            cameraUVtexture.SetData(0, 0, 0, wUv, hUv, (void *)uvPtr);

                            rotatedBuff.Unlock(CVPixelBufferLock.None);

                            _coreImageContext.Dispose();
                        }
                    }
                }
            }
        }
Example #2
0
        public static CVPixelBuffer ToPixelBuffer(this UIImage self)
        {
            var width = self.Size.Width;

            var height = self.Size.Height;

            var attrs = new CVPixelBufferAttributes();

            attrs.CGBitmapContextCompatibility = true;
            attrs.CGImageCompatibility         = true;

            var resultPixelBuffer = new CVPixelBuffer((int)(width),
                                                      (int)(height),
                                                      CVPixelFormatType.CV32ARGB,
                                                      attrs);

            resultPixelBuffer.Lock(CVPixelBufferLock.None);
            var pixelData = resultPixelBuffer.GetBaseAddress(0);

            var rgbColorSpace = CGColorSpace.CreateDeviceRGB();

            var context = new CGBitmapContext(data: pixelData,
                                              width: (int)(width),
                                              height: (int)(height),
                                              bitsPerComponent: 8,
                                              bytesPerRow: resultPixelBuffer.GetBytesPerRowOfPlane(0),
                                              colorSpace: rgbColorSpace,
                                              bitmapInfo: CGImageAlphaInfo.NoneSkipFirst);

            context.TranslateCTM(tx: 0, ty: height);
            context.ScaleCTM(sx: 1.0f, sy: -1.0f);

            UIGraphics.PushContext(context);

            self.Draw(new CGRect(x: 0, y: 0, width: width, height: height));

            UIGraphics.PopContext();

            resultPixelBuffer.Unlock(CVPixelBufferLock.None);

            return(resultPixelBuffer);
        }