从文件选择器将图像加载到画布控件

问题描述

我要在Win2D的UWP应用中尝试做的事情: 用户按下按钮以添加图像并选择他们的文件。 该文件将作为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 && !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,new Uri("ms-appx:///Assets/Pictures/logo.png"));
    }

解决方法

从文件选择器将图像加载到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);
        }

    }
}