Преобразование CanvasRenderTarget в ImageSource в WinUI
Я работаю над .Net MAUI и использовал собственный рендеринг в своем приложении. Итак, для Windows (WinUi-3) у меня есть рисунки, отображаемые на объекте CanvasRenderTarget, и теперь я должен предоставить его пользователю как ImageSource(MAUI).
Я попытался получить пиксели из объекта canvasrendertarget, а затем в источник потока. Но установив этот источник потока в элемент управления Image, я не могу получить вывод изображения.
renderTarget = new CanvasRenderTarget(CanvasDevice.GetSharedDevice(),(float) 400, (float)400, 96);
using (var ds = renderTarget.CreateDrawingSession())
{
ds.FillCircle(10, 10, 400, Windows.UI.Color.FromArgb(250, 140, 120, 150));
}
byte[] bytes = renderTarget.GetPixelBytes();
//Setting the Stream source to my Image control
imageview.Source = ImageSource.FromStream(() => new MemoryStream(bytes));
Не уверен, что мне не хватает, как преобразовать объект WinUi RenderTarget в MAUI.ImageSource?
1 ответ
Вы пытаетесь создать
ImageSource
однако из необработанных данных пикселей
FromStream
вместо этого ожидает закодированное изображение PNG или JPG.
Чтобы добиться этого, вам нужно будет сначала закодировать эти необработанные пиксельные данные — к счастью, для этого уже есть реализация в
Windows.Graphics.Imaging.BitmapEncoder
.
Вот рабочая версия вашего фрагмента кода, где мы создаем
BitmapEncoder
который преобразует пиксельные данные в изображение PNG. Тогда это просто вопрос вызова
SetPixelData
с соответствующими параметрами для создания указанного изображения:
var renderTarget = new CanvasRenderTarget(CanvasDevice.GetSharedDevice(), (float)400, (float)400, 96);
using (var ds = renderTarget.CreateDrawingSession())
{
ds.FillCircle(10, 10, 400, Windows.UI.Color.FromArgb(250, 140, 120, 150));
}
byte[] bytes = renderTarget.GetPixelBytes();
var stream = new InMemoryRandomAccessStream();
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.PngEncoderId, stream);
encoder.SetPixelData(BitmapPixelFormat.Rgba8 , BitmapAlphaMode.Straight, 400, 400, 96, 96, bytes);
await encoder.FlushAsync();
//Setting the Stream source to my Image control
imageview.Source = ImageSource.FromStream(() => stream.AsStream());