如何使用 CanvasBitmap.SaveAsync 方法?

How do I use the CanvasBitmap.SaveAsync method?

在 Win2D API 文档中他们说

Saves the entire bitmap to a file with the specified file name, using a default quality level of 0.9 and CanvasBitmapFileFormat.Auto.

它没有说明文件的保存位置或如何选择文件的保存位置。 我尝试使用该方法来弄清楚,但每次调用它时都会收到 "Access denied" 异常错误。

                string filename = "Test pic test.png";
        StorageFile TestFile = await PictureFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
        using (IRandomAccessStream strem = await TestFile.OpenAsync(FileAccessMode.ReadWrite))
        {
            await CanvasImage.SaveAsync(filename);
        }

首先,以上描述是针对CanvasBitmap.SaveAsync方法的。由于 Win2D 还包含 CanvasImage class,我建议避免将实例命名为 CanvasImage.

据此similar issue:

In general you can't pass around paths in the user's filesystem (as opposed to special folders like the app package directory) because of the UWP security model: https://docs.microsoft.com/en-us/windows/uwp/files/file-access-permissions

因此您需要将流直接传递到 SaveAsync,而不仅仅是作为字符串的路径。在您的代码片段中,您打开文件流但没有将流保存到文件中。只需将流保存到文件即可。例如:

CanvasDevice device = CanvasDevice.GetSharedDevice();
CanvasRenderTarget renderTarget = new CanvasRenderTarget(device, 300, 300, 96);
using (var ds = renderTarget.CreateDrawingSession())
{
    ds.Clear(Colors.White);           
    ds.DrawRectangle(155, 115, 80, 30, Colors.Black);
} 
CanvasBitmap bit = renderTarget;
string filename = "Test pic test.png";
StorageFolder pictureFolder = KnownFolders.SavedPictures;
var file = await pictureFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
    await bit.SaveAsync(fileStream, CanvasBitmapFileFormat.Png, 1f);
}

更多细节你可以参考this blog