2017-08-08 125 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