Я работаю над приложением UWP, которое использует Windows Composition API.
Существует элемент управления изображением с именем splitViewSideBarBlur
. В качестве источника этого изображения задано растровое изображение другого элемента XAML с использованием следующего метода расширения:
public static async Task<IRandomAccessStream> RenderToRandomAccessStream(this UIElement element)
{
if (element == null) throw new NullReferenceException();
var rtb = new RenderTargetBitmap();
await rtb.RenderAsync(element);
var pixelBuffer = await rtb.GetPixelsAsync();
var pixels = pixelBuffer.ToArray();
var displayInformation = DisplayInformation.GetForCurrentView();
var stream = new InMemoryRandomAccessStream();
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
encoder.SetPixelData(BitmapPixelFormat.Bgra8,
BitmapAlphaMode.Premultiplied,
(uint)rtb.PixelWidth,
(uint)rtb.PixelHeight,
displayInformation.RawDpiX,
displayInformation.RawDpiY,
pixels);
await encoder.FlushAsync();
stream.Seek(0);
return stream;
}
Я использую эту функцию расширения, чтобы получить изображение определенного элемента XAML и сохранить его в переменной BitmapImage
с именем splitViewBlurImage
. Это растровое изображение устанавливается в качестве фона элемента SplitView
. Затем я применяю GaussianBlur и пытаюсь вернуть новое размытое изображение в SplitView. Однако новое изображение отказывается быть размытым. Ниже приведен код для этого:
var image = new BitmapImage();
using (var stream = await element.RenderToRandomAccessStream())
{
image.SetSource(stream);
}
ImageBrush ib = new ImageBrush();
ib.ImageSource = splitViewBlurImage;
ib.Stretch = Stretch.UniformToFill;
splitViewSideBarBlur.Source = splitViewBlurImage;
splitViewSideBarBlur.VerticalAlignment = VerticalAlignment.Top;
var graphicsEffect = new BlendEffect
{
Background = new ColorSourceEffect()
{
Name = "Tint",
Color = Color.FromArgb(95, 255, 255, 255)
},
Foreground = new GaussianBlurEffect()
{
Name = "Blur",
Source = new CompositionEffectSourceParameter("Backdrop"),
BlurAmount = (float)20,
BorderMode = EffectBorderMode.Hard,
}
};
var blurEffectFactory = _compositor.CreateEffectFactory(graphicsEffect,
new[] { "Blur.BlurAmount", "Tint.Color" });
_brush = blurEffectFactory.CreateBrush();
var destinationBrush = _compositor.CreateBackdropBrush();
_brush.SetSourceParameter("Backdrop", destinationBrush);
var blurSprite = _compositor.CreateSpriteVisual();
blurSprite.Size = new Vector2((float)splitViewSideBarBlur.ActualWidth, (float)splitViewSideBarBlur.ActualHeight);
blurSprite.Brush = _brush;
this.splitViewSideBarBlur.Source = null;
ElementCompositionPreview.SetElementChildVisual(this.splitViewSideBarBlur, blurSprite);
Что я здесь делаю неправильно? Фоновое изображение выглядит хорошо, оно имеет черный оттенок, но изображение совсем не размыто.