Загрузка изображения в элемент управления Canvas из средства выбора файлов

#c# #windows #uwp #win2d

#c# #Windows #uwp #win2d

Вопрос:

Что я пытаюсь сделать в приложении UWP с Win2D: пользователь нажал кнопку, чтобы добавить изображение, и выбирает свой файл. Этот файл загружается как ресурс для элемента управления Canvas. Затем изображение отображается в текущем сеансе рисования

При нажатии кнопки:

 private async void btnAddPicture_Click(object sender, RoutedEventArgs e)
    {
        var picker = new Windows.Storage.Pickers.FileOpenPicker();
        picker.FileTypeFilter.Add(".png");
        picker.FileTypeFilter.Add(".jpg");
        picker.FileTypeFilter.Add(".jpeg");
        overlayPictureFile = await picker.PickSingleFileAsync();
        if (overlayPictureFile == null)
        {
            txbNotification.Text = "File Picking cancelled";
            return;
        }
        else
        {
            txbNotification.Text = "Picture Loaded";
        }
        using (IRandomAccessStream stream = await overlayPictureFile.OpenAsync(FileAccessMode.Read))
        {
            var device = new CanvasDevice();
            createdBitmap = await CanvasBitmap.LoadAsync(device, stream);
        }
    }
  

В функции рисования:

 void CanvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
    {
        if (createdBitmap != null)
        {
            args.DrawingSession.DrawImage(createdBitmap, Drawing.FindDefaultRect());
        }
        drawingCanvas.Invalidate();
    }
  

Все будет скомпилировано, но в тот момент, когда я нажимаю кнопку, чтобы добавить изображение, оно здесь прерывается.

 #if DEBUG amp;amp; !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION
        UnhandledException  = (sender, e) =>
        {
            if (global::System.Diagnostics.Debugger.IsAttached) global::System.Diagnostics.Debugger.Break();
        };
  

#endif

Я уже загружаю некоторые изображения в это, но все они являются частью программы и создаются до создания холста с их помощью. Не уверен, как это сделать с теми, которые выбирает пользователь.

 private void drawingCanvas_CreateResources(CanvasControl sender, Microsoft.Graphics.Canvas.UI.CanvasCreateResourcesEventArgs args)
    {
        args.TrackAsyncAction(CreateResourcesAsync(sender).AsAsyncAction());
    }
    private async Task CreateResourcesAsync(CanvasControl sender)
    {
        logo = await CanvasBitmap.LoadAsync(sender, new Uri("ms-appx:///Assets/Pictures/Logo_BlackBorders.png"));
    }
  

Обновить:
Где я сейчас рисую вещи. Это холст, на который я пытаюсь добавить изображение.

 void CanvasControl_Draw(CanvasControl sender, CanvasDrawEventArgs args)
    {
        //Drawing a bunch of stuff
    }
    private void drawingCanvas_CreateResources(CanvasControl sender, Microsoft.Graphics.Canvas.UI.CanvasCreateResourcesEventArgs args)
    {
        args.TrackAsyncAction(CreateResourcesAsync(sender).AsAsyncAction());
    }
    private async Task CreateResourcesAsync(CanvasControl sender)
    {
        logo = await CanvasBitmap.LoadAsync(sender, new Uri("ms-appx:///Assets/Pictures/Logo.png"));
    }
  

Ответ №1:

Загрузка изображения в элемент управления Canvas из средства выбора файлов

Для вашего сценария вы можете получить CanvasDrawingSession с CreateDrawingSession помощью метода. А затем используйте этот drawingsession, чтобы преобразовать выбранное изображение в текущее CanvasControl .

Например.

 private async void btnAddPicture_Click(object sender, RoutedEventArgs e)
{
    var picker = new Windows.Storage.Pickers.FileOpenPicker();
    picker.FileTypeFilter.Add(".png");
    picker.FileTypeFilter.Add(".jpg");
    picker.FileTypeFilter.Add(".jpeg");
    var overlayPictureFile = await picker.PickSingleFileAsync();
    if (overlayPictureFile == null)
    {

        return;
    }
    else
    {

    }
    using (IRandomAccessStream stream = await overlayPictureFile.OpenAsync(FileAccessMode.Read))
    {
        //get canvascontrol's Device property.
        CanvasDevice device = drawingCanvas.Device;
        createdBitmap = await CanvasBitmap.LoadAsync(device, stream);
        //use device property to make renderer
        var renderer = new CanvasRenderTarget(device,
                              createdBitmap.SizeInPixels.Width,
                              createdBitmap.SizeInPixels.Height, createdBitmap.Dpi);
        //make ds with above renderer.
        using (var ds = renderer.CreateDrawingSession())
        {
            ds.DrawImage(createdBitmap, 0, 0);
        }

    }
}