2017-08-08 95 views
0

在Win2D API文档,他们说如何使用CanvasBitmap.SaveAsync方法?

保存整个位图与指定的文件名的文件,使用 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); 
     } 

回答

0

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

根据这一similar issue

一般来说,你不能绕过用户的文件系统路径(相对于特殊文件夹,如应用程序包目录),因为UWP安全模型: 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