private void Init()
        {
            _compositor    = Window.Current.Compositor;
            _device        = new Direct3D11Device();
            _deviceContext = _device.ImmediateContext;
            _multithread   = _device.Multithread;
            _multithread.IsMultithreadProtected = true;
            _decoder = new ImageDecoder();
            _compositionGraphicsDevice = CompositionGraphics.CreateCompositionGraphicsDevice(_compositor, _device);

            _root = _compositor.CreateContainerVisual();
            _root.RelativeSizeAdjustment = Vector2.One;
            ElementCompositionPreview.SetElementChildVisual(this, _root);

            _imageSurface = _compositionGraphicsDevice.CreateDrawingSurface(
                new Size(1, 1),
                DirectXPixelFormat.B8G8R8A8UIntNormalized,
                DirectXAlphaMode.Premultiplied);

            _imageBrush = _compositor.CreateSurfaceBrush(_imageSurface);
            _imageBrush.HorizontalAlignmentRatio = 0;
            _imageBrush.VerticalAlignmentRatio   = 0;
            _imageBrush.Stretch = CompositionStretch.None;
            _imageBrush.BitmapInterpolationMode = CompositionBitmapInterpolationMode.NearestNeighbor;

            _imageVisual = _compositor.CreateSpriteVisual();
            _imageVisual.RelativeSizeAdjustment = Vector2.One;
            _imageVisual.Brush = _imageBrush;
            _root.Children.InsertAtTop(_imageVisual);

            _captureBrush = _compositor.CreateSurfaceBrush();

            _captureVisual = _compositor.CreateSpriteVisual();
            _captureVisual.RelativeSizeAdjustment = Vector2.One;
            _captureVisual.Brush = _captureBrush;
            _root.Children.InsertAtBottom(_captureVisual);

            _swapChain = new SwapChain(
                _device,
                DirectXPixelFormat.B8G8R8A8UIntNormalized,
                2,
                new SizeInt32()
            {
                Width = 1, Height = 1
            });
            var surface = _swapChain.CreateSurface(_compositor);

            _captureBrush.Surface = surface;
        }
        private async void ImageButton_Click(object sender, RoutedEventArgs e)
        {
            _imageBrush.Surface = null;

            var file = await PickImageAsync();

            if (file != null)
            {
                using (var stream = await file.OpenReadAsync())
                    using (var d3dSurface = _decoder.DecodeStreamIntoTexture(_device, stream))
                    {
                        CompositionGraphics.CopyDirect3DSurfaceIntoCompositionSurface(_device, d3dSurface, _imageSurface);
                    }
                _imageBrush.Surface = _imageSurface;
            }
        }
        private async void ImageButton2_Click(object sender, RoutedEventArgs e)
        {
            _imageBrush.Surface = null;

            var file = await PickImageAsync();

            if (file != null)
            {
                using (var stream = await file.OpenReadAsync())
                {
                    var decoder = await BitmapDecoder.CreateAsync(stream);

                    var frame = await decoder.GetFrameAsync(0);

                    var width  = frame.PixelWidth;
                    var height = frame.PixelHeight;
                    Debug.Assert(frame.BitmapPixelFormat == BitmapPixelFormat.Bgra8);

                    var pixelData = await frame.GetPixelDataAsync();

                    var bits = pixelData.DetachPixelData();

                    var description = new Direct3D11Texture2DDescription();
                    description.Base        = new Direct3DSurfaceDescription();
                    description.Base.Format = DirectXPixelFormat.B8G8R8A8UIntNormalized;
                    description.Base.Width  = (int)width;
                    description.Base.Height = (int)height;
                    description.Base.MultisampleDescription         = new Direct3DMultisampleDescription();
                    description.Base.MultisampleDescription.Count   = 1;
                    description.Base.MultisampleDescription.Quality = 0;
                    description.ArraySize      = 1;
                    description.BindFlags      = 0;
                    description.CpuAccessFlags = 0;
                    description.MiscFlags      = 0;
                    description.MipLevels      = 1;

                    var texture = _device.CreateTexture2D(description, bits);
                    CompositionGraphics.CopyDirect3DSurfaceIntoCompositionSurface(_device, texture, _imageSurface);
                }
                _imageBrush.Surface = _imageSurface;
            }
        }