Преобразование 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());
Другие вопросы по тегам