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; } }