1

他们在 Win2D API 文档中说

使用默认质量级别 0.9 和 CanvasBitmapFileFormat.Auto 将整个位图保存到具有指定文件名的文件。

它没有说明文件的保存位置或如何选择文件的保存位置。我尝试使用该方法以弄清楚它,但每次我调用它时都会收到“拒绝访问”异常错误。

                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);
        }
4

1 回答 1

0

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

根据这个类似的问题

通常,由于 UWP 安全模型,您不能绕过用户文件系统中的路径(与应用程序包目录等特殊文件夹相反): https ://docs.microsoft.com/en-us/windows/uwp/文件/文件访问权限

这样您就需要将流直接传递到 中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);
}

更多细节可以参考这篇博客

于 2017-08-08T09:58:50.403 回答